Fusion - the Fusion 360 Bridge
Public Made by Adomby adom
Drive Autodesk Fusion 360 from the cloud via Adom Bridge: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.
Add guarded mechanical CAD, assemblies, McMaster and BOM #10
mechanical-design-2026-10-02 → masterFusion lacked a typed workflow for authoring parametric parts and assemblies with reliable document targeting, recoverable edits and measured results. This adds 39 discoverable mechanical operations: constrained sketches, 16 solid-feature families, occurrence placement, seven as-built joint motions, rigid groups, interference, material/physical properties, supplier CAD and BOM generation.
McMaster support includes Fusion's native interactive picker and verified local STEP/SAT ingestion with supplier metadata and source checksums. Flat and structured BOMs count repeated/nested instances, preserve purchased-part provenance and export CSV safely. Typed edits use current document/revision references, a session operation ledger and measured recovery; exports stage output before publishing.
The comparison record covers 695 source entries across 16 pinned repositories, 122 grouped selectors, 64 protocol/resource/prompt entries and official Autodesk desktop/Data/Compute capabilities. Each entry has a coverage route and gap flag; placeholders and incorrect external API calls are identified separately. No external implementation code was copied.
Validation on Windows Fusion 2705.1.11: 71 mechanical Python tests, 6 document-hygiene tests, 24 routing tests and 56 Rust workspace tests pass; Windows release build passes. Independent native coverage exercised all 16 solid-feature families and all seven as-built joint motions. The final assembly/supplier gate retains 815 raw-matched checks (408 behavioral, 407 availability/inspection), including rotated repeated-parent copy placement, native archive persistence, genuine McMaster STEP ingestion and CSV BOM output. Original host bridge 1.11.9/add-in 1.0.20 and unpinned update preference are restored; no production registry release was made. See docs/build-2026-10-02.md and docs/mechanical-verification/ for independent live observations, fixes and coverage limits.
Known scope: joints are as-built; native McMaster browsing is interactive; local purchased CAD accepts STEP/SAT; the operation ledger lasts one add-in session. Regular joints, advanced sketch/reference operations, drawings, configurations, surface/form/mesh, sheet metal, CAM/simulation and a cloud Compute adapter remain listed in docs/mechanical-comparison/REMAINING-GAPS.md.
Diff Skip to comments (6)
BRIDGE_VERSION+1−1@@ -1 +1 @@-1.11.9+1.12.0-dev.3
CHANGELOG.md+54@@ -3,6 +3,60 @@ All notable changes to the Adom Bridge Fusion 360 bridge, newest first. Canonical: https://wiki.adom.inc/adom/fusion-bridge · GitHub backup: `adom-inc/fusion-bridge` +## 1.12.0-dev.3 (2026-10-02)++- Assembly checkpoint adds 20 typed operations (39 total): internal components and independent copies,+ nested occurrence placement/grounding, seven native as-built joint motions with limits and drive+ readback, rigid groups, interference without creating bodies, materials and assembly physical+ properties including center of mass. Existing design intent is preserved; internal creation requires Hybrid.+- Import downloaded STEP/SAT supplier CAD into a dedicated component, validate an optional expected+ SHA-256, and persist supplier/part/source/hash metadata. Discover or explicitly launch Fusion's native+ McMaster UI. Browser selection/download remains interactive; no cloud save is implied.+- Structured instance BOM and flat identity-grouped quantities include purchased-part provenance;+ both CSV modes publish atomically. Purchased collapse/exclusion remains separate from physical mass.+ Root bodies and repeated nested bodies count once per instance, with traversal budgets/cycle guards.+- Revision/recovery witnesses now include component metadata/materials, occurrence grounding,+ joint motion/limits and rigid groups. Nested occurrence references preserve their instance path.+ Model recovery excludes files, cloud effects and interactive command completion.+- Offline coverage checks nested quantities/mass, purchased collapse/exclusion, hidden cycles,+ supplier hash guards, joint limit conversions and CSV publication boundaries. Independent live+ verification passed all seven joint motions, placement/reuse, native McMaster launch, supplier CAD,+ purchasing/physical BOM and archive persistence. Captured positions are checked in every affected+ root assembly context after compute; BOM physical totals use explicit high calculation accuracy.+ See docs/build-2026-10-02.md for the 815 retained native checks, source audit and coverage limits.++## 1.12.0-dev.2 (2026-10-02)++- Typed parametric modeling adds sketch primitives, driving dimensions and geometric constraints,+ sketch edits/projections, construction planes and solid feature creation. Feature operations cover+ extrude/cut, revolve, hole, fillet, chamfer, shell, loft, sweep, combine, split, move, mirror,+ rectangular/circular patterns, draft and straight threads through runtime-checked Fusion APIs.+- A runtime probe verifies PTransaction abort and commit behavior before model mutations are enabled.+ Failed operations report semantic recovery checks. Atomic parameter batches support create/set/delete;+ feature edits support naming, suppression and owned model-parameter expressions. Independent feature+ and sketch-geometry deletion uses the same health and transaction gate.+- Inspection returns sketch curves/points/profiles and detailed face/edge geometry with guarded references.+ Profile references bind a sketch, current revision, index and geometric fingerprint. Health walks+ timeline groups and reports intentionally suppressed items separately.+- Operation status and capability requests bypass the main-thread queue and native bridge busy gate.+ The ledger uses a short lock around metadata snapshots; no lock is held over Fusion API work.+- The Autodesk desktop MCP example now uses its supported activeCommand query. Shipping schemas remain+ explicit about runtime API availability and the boundary between model transactions and external files.++## 1.12.0-dev.1 (2026-10-02)++- Development checkpoint: `fusion_mechanical` adds typed create/inspect/parameter/health/export operations,+ document and revision guards, occurrence-context references and a session operation ledger. Discover+ schemas with `fusion_mech_capabilities`; query timed-out work with `fusion_mech_operation_status`.+- Parameter failures restore their previous expression and report semantic recovery checks. New designs+ stay unnamed to prevent save dialogs during cleanup. Generic atomic modeling batches are not promised.+- Physical properties include root-owned bodies; distinct same-named component definitions stay separate+ in mass reports and BOMs. BOMs count bodies and children, preserve explicit empty kit rules, and report CSV failures.+- Exports validate capabilities and stage output before atomic publication. Existing files survive export+ failures; postpublication cleanup errors remain successful publications with warnings. STL uses mm;+ STL/3MF never launch a print utility or silently produce one file per body.+- Register HTTP result waiters before firing Fusion events, preventing fast commands from being dropped as stale.+ ## 1.11.9 (2026-09-29) - `fusion_aps_signin` always opens a browser. With no remembered browser profile it passed an EMPTY profile name, ab
README.md+1@@ -38,6 +38,7 @@ Short version below, full detail in each guide. | [3D view, export and STEP colorization](docs/3d-viewer-and-export.md) | The 3D PCB, the native viewport frame in `fusion_state`, camera motion with `fusion_view`, every export format, web-grade GLB (16 MB to ~465 KB), and recoloring a grey imported STEP. | | [Electronics library manager](docs/electronics-libraries.md) | Symbols, IPC footprints and real 3D packages, generated rather than hand-drawn, explicit 3D `placement`, plus how to verify a part before shipping it. | | [Multi-part library import](docs/MULTIPART_LIBRARY_IMPORT.md) | How a zip of `.lbr` + STEPs becomes a Library Manager library with rendering 3D on every part: cloud `.f3d` urns, per-part minting (and the wrong-footprint trap it avoids), proof, and what the user sees. With screenshots. |+| [Mechanical design](docs/MECHANICAL.md) | Development 1.12: guarded parametric parts, constrained sketches, assemblies/joints, McMaster CAD, material/mass and flat/structured mechanical BOM. [Build evidence](docs/build-2026-10-02.md) and [feature/gap inventory](docs/mechanical-comparison/README.md). | | [Mechanical BOM and physical properties](docs/mechanical-bom.md) | Kit-aware assembly BOM that matches Fusion's Manage to BOM, and per-part volume/mass for costing. | | [Sign-in, sessions and updates](docs/sign-in-and-updates.md) | Multi-profile Autodesk sign-in, SSO without passwords, one login covering APS, the `needs_signin` short-circuit, `restartPolicy`, and silent auto-updates. | | [Autodesk's Fusion MCP server](docs/fusion-mcp-server.md) | Proxy Autodesk + Anthropic's local MCP server (text-to-CAD, Electronics object model) so a cloud AI can reach it, and turn it on for the user. |
SKILL.md+12−2@@ -1,7 +1,7 @@ --- name: fusion-bridge public: true-description: "Launch and drive Fusion 360 on the user's laptop from this container via the adom-bridge CLI. Includes FAST cloud-file search via APS (Autodesk Platform Services) — search/browse/open the team's Fusion cloud designs in seconds (set up once per company, each user signs in once, never charged). Plus open .f3d/.f3z designs, open cloud files, close documents, dismiss recovery dialogs, capture Fusion window screenshots, send keys + click, run the add-in (STEP/GLB/.lbr import-export, BOM/parameters). Trigger words: fusion, Fusion 360, fast cloud search, fusion_aps_search, search fusion files, find a design, browse cloud files, fusion_aps_open, aps, open fusion, launch fusion, open design, f3d, f3z, import STEP, export STEP, export GLB, export lbr, Fusion electronics, Fusion PCB, BOM from Fusion, Fusion parameters, Fusion API, dismiss recovery, Fusion screenshot, fusion_click, fusion_send_key, fusion bridge, close fusion."+description: "Launch and drive Fusion 360 on the user's laptop from this container via the adom-bridge CLI. Includes FAST cloud-file search via APS (Autodesk Platform Services) — search/browse/open the team's Fusion cloud designs in seconds (set up once per company, each user signs in once, never charged). Plus open .f3d/.f3z designs, open cloud files, close documents, dismiss recovery dialogs, capture Fusion window screenshots, send keys + click, run the add-in (STEP/GLB/.lbr import-export, BOM/parameters). Mechanical development builds add guarded sketches/solids, assemblies/joints, McMaster CAD and structured BOM. Trigger words: fusion, Fusion 360, fast cloud search, fusion_aps_search, search fusion files, find a design, browse cloud files, fusion_aps_open, aps, open fusion, launch fusion, open design, f3d, f3z, import STEP, export STEP, export GLB, export lbr, Fusion electronics, Fusion PCB, BOM from Fusion, Fusion parameters, Fusion API, dismiss recovery, Fusion screenshot, fusion_click, fusion_send_key, fusion bridge, close fusion." --- # adom-bridge — Fusion 360 bridge@@ -17,7 +17,17 @@ description: "Launch and drive Fusion 360 on the user's laptop from this contain > wiki page (`adom-wiki settings get <org> autodesk-aps`). The **fusion-aps-org-setup** skill shows the two calls a new box needs, and the one-time > admin setup for an org that has none. Never copy it from another machine's config file. -All commands dispatch to the Fusion Python bridge. From this container:+Application commands reach the in-process Fusion add-in through the bridge. From this container:++## Mechanical design (1.12 development builds)++Discover `fusion_mech_capabilities {}` before constructing typed requests. Use `fusion_mechanical {"op":"inspect"}` for the active document target and entity references; pass references unchanged and refresh them after edits. Existing-document writes require the current document/revision, session ID and a unique operation ID. Probe transactions before transactional writes on an existing document; `new_design` probes automatically when needed. After a timeout, query `fusion_mech_operation_status` before deciding whether to retry, and reuse the exact original ID/payload only within the same session.++The typed surface covers sketches/constraints/dimensions, common solid features, parameter/feature edits, internal Hybrid assemblies, occurrence placement, as-built joints/rigid groups, interference, material/physical properties and safe exports. Inspect actual geometry and units after edits; API availability alone is not evidence of a completed model.++For McMaster, `mcmaster_open` launches the interactive native picker; inspect after insertion/cancellation. For a downloaded supplier model, `cad_import` ingests STEP/SAT with optional expected SHA-256 and explicit provenance. `bom` and `bom_export` support flat/structured purchasing quantities, purchased-subassembly policy and CSV. Native F3D preserves supplier attributes; neutral STEP does not promise that persistence.++Read [the mechanical guide](docs/MECHANICAL.md) for exact contracts, [verification evidence](docs/build-2026-10-02.md) for tested behavior and [remaining gaps](docs/mechanical-comparison/REMAINING-GAPS.md) before promising additional capabilities. Arbitrary scripts do not inherit the typed recovery contract. The comparison includes Autodesk Compute, but this package does not authenticate or configure that cloud server automatically. ## Open or create a schematic (one verb)
addin/AdomBridge/AdomBridge.manifest+11−11@@ -1,12 +1,12 @@ {- "autodeskProduct": "Fusion",- "type": "addin",- "id": "com.adom.bridge",- "author": "Adom Industries, Inc.",- "description": {- "": "Adom Desktop Conduit bridge add-in. Exposes a localhost HTTP API for external automation of Fusion 360."- },- "version": "1.0.20",- "runOnStartup": true,- "supportedOS": "windows"-}+ "autodeskProduct": "Fusion",+ "type": "addin",+ "id": "com.adom.bridge",+ "author": "Adom Industries, Inc.",+ "description": {+ "": "Adom Desktop Conduit bridge add-in. Exposes a localhost HTTP API for external automation of Fusion 360."+ },+ "version": "1.12.0-dev.3",+ "runOnStartup": true,+ "supportedOS": "windows"+}
addin/AdomBridge/commands/__init__.py+4@@ -65,8 +65,12 @@ from .silkscreen_capture import handle_take_silkscreen_screenshot from .modeling import handle_run_modeling_script from .assembly_bom import handle_assembly_bom from .physical_properties import handle_physical_properties+from .mechanical import handle_mechanical, capabilities, operation_status COMMAND_HANDLERS = {+ "mechanical": handle_mechanical,+ "mech_capabilities": capabilities,+ "mech_operation_status": operation_status, "activity_banner": handle_activity_banner, # App state "get_app_state": handle_get_app_state,
addin/AdomBridge/commands/assembly_bom.py+105−179@@ -1,18 +1,15 @@-"""Structured, kit-aware mechanical assembly BOM (mirrors Fusion's Manage -> BOM).--The electronics `export_bom` only works on an open PCB board. This is its mechanical-counterpart: it walks the active Design assembly and returns a purchasing BOM that-respects the component hierarchy. It recurses through organizational subassemblies but-counts a physical part or a purchased kit/unit ONCE, so hardware modeled INSIDE a kit-(for example a "... with fasteners" bracket, or a bearing/pulley unit) is not-double-counted the way a flat allOccurrences walk would count it.-"""-+"""Mechanical BOM grouped by resolved component identity, never display name.""" import csv import time+import tempfile+from pathlib import Path import adsk.core import adsk.fusion+from .mechanical.core import identity, items+from .mechanical.exporting import publish_staged+from .mechanical.assembly_state import metadata+from .physical_properties import own_properties def _material_name(comp):@@ -21,196 +18,125 @@ def _material_name(comp): return comp.material.name except Exception: pass- try:- if comp.bRepBodies.count > 0 and comp.bRepBodies.item(0).material:- return comp.bRepBodies.item(0).material.name- except Exception:- pass return "" def _attr(comp, name):- try:- v = getattr(comp, name, "") or ""- return v.strip()- except Exception:- return ""+ return (getattr(comp, name, "") or "").strip() def handle_assembly_bom(app: adsk.core.Application, args: dict) -> dict:- """Return a structured, kit-aware parts list for the active mechanical design.-- args:- treatAsUnit optional list of name substrings whose subassemblies are counted once- and NOT exploded (default: ["with fasteners"]).- exclude optional list of top-level component-name prefixes to skip entirely.- includePhysicalProperties optional bool -- add volume_cm3 / mass_kg per line.- outputPath optional str -- also write a CSV to this Windows path.- """ design = adsk.fusion.Design.cast(app.activeProduct) if not design:- return {"success": False, "error": "No active Fusion Design.",- "_hint": "Open a mechanical design in the Design workspace, then retry."}-+ return {"success": False, "error": "No active Fusion Design."} args = args or {}- # Walk budget (issue #659, found by the daily verb suite): an electronics 3D PCB carries an- # occurrence per pad, so the walk that is instant on mechanical assemblies grinds for minutes,- # blows the relay window, and blocks the add-in main thread for every later verb. Refuse FAST- # with a redirect instead: the mechanical walk is the wrong tool for a board anyway.- budget = float(args.get("maxSeconds", 20))- deadline = time.time() + budget- try:- occ_total = design.rootComponent.allOccurrences.count- except Exception:- occ_total = -1- if occ_total > 3000:- return {"success": False, "errorCode": "bom_walk_budget_exceeded",- "occurrences": occ_total,- "error": "This design has %d occurrences - walking it would block Fusion for minutes." % occ_total,- "_hint": "This looks like an electronics 3D PCB (an occurrence per pad), and the mechanical "- "BOM walk is the wrong tool for a board: use fusion_export_bom for the electronics "- "BOM. For a genuinely huge MECHANICAL assembly, re-run with maxSeconds raised "- "(e.g. {\"maxSeconds\": 120}) and expect a long wait."}- kit = [k.lower() for k in (args.get("treatAsUnit") or ["with fasteners", "with fastener"])]+ # Preserve the electronics fast-refusal gate: a 3D PCB contains occurrences+ # per pad and is not a suitable input for this mechanical purchasing BOM.+ if design.rootComponent.allOccurrences.count > 3000:+ return {"success": False, "errorCode": "bom_walk_budget_exceeded", "complete": False,+ "error": "Mechanical BOM occurrence budget exceeded; use fusion_export_bom for a PCB.",+ "occurrences": design.rootComponent.allOccurrences.count}+ raw_kit = args.get("treatAsUnit")+ kit = [k.lower() for k in (["with fasteners", "with fastener"] if raw_kit is None else raw_kit)] exclude = tuple(args.get("exclude") or []) include_pp = bool(args.get("includePhysicalProperties", False))+ deadline = time.monotonic() + min(max(float(args.get("maxSeconds", 20)), 0.1), 300)+ parts, collapsed, errors = {}, {}, []++ def add(comp, path, rule=None):+ key = identity(comp)+ if key in parts:+ parts[key]["quantity"] += 1+ parts[key]["occurrencePaths"].append(path)+ return+ row = {"componentId": key, "componentName": comp.name,+ "partNumber": _attr(comp, "partNumber"), "description": _attr(comp, "description"),+ "material": _material_name(comp), "quantity": 1, "bodies": comp.bRepBodies.count,+ "occurrencePaths": [path], "scope": "component_subtree" if rule else "direct_component_bodies"}+ provenance = metadata(comp)+ row.update({name: provenance[name] for name in ("supplier", "supplierPartNumber", "sourceUrl", "sha256", "asPurchased") if name in provenance})+ if include_pp:+ try:+ accuracy = adsk.fusion.CalculationAccuracy.LowCalculationAccuracy+ if rule:+ pp = comp.getPhysicalProperties(accuracy)+ row.update(volume_cm3=pp.volume, mass_kg=pp.mass)+ else:+ row.update({k: v for k, v in own_properties(comp, accuracy).items() if k in ("volume_cm3", "mass_kg")})+ except Exception as exc:+ errors.append({"componentId": key, "error": str(exc)})+ row.update(volume_cm3=None, mass_kg=None)+ parts[key] = row - def kit_rule(comp):- n = comp.name.lower()- for k in kit:- if k in n:- return k- return None-- def is_leaf(comp):- if kit_rule(comp) is not None:- return True- return comp.bRepBodies.count > 0 # a physical part is a leaf-- parts = {}- # Transparency (issue #25, Oliver + John's call): every heuristic collapse is REPORTED so a- # name-match on someone's own "bearing test jig" is a visible, correctable decision instead of- # silently vanishing its internals from the BOM. collapsed = {unitName: {rule, quantity}}.- collapsed = {}- # Attribution for the inverse advisory: which DESCENDED subassembly each leaf came from, so a- # purchased-looking unit that was exploded (240 identical bearing balls) can be flagged.- sub_stats = {} # subassembly name -> {part name -> instances}- sub_stack = []-- class _BudgetExceeded(Exception):- pass-+ visited = 0 def walk(occs):- for i in range(occs.count):- if time.time() > deadline:- raise _BudgetExceeded()- occ = occs.item(i)+ nonlocal visited+ for occ in items(occs):+ visited += 1+ if time.monotonic() > deadline or visited > 20000:+ raise TimeoutError("BOM walk budget exceeded.") comp = occ.component- name = comp.name- if any(name.startswith(e) for e in exclude):+ provenance = metadata(comp)+ if provenance.get("excludeFromBom", False): continue+ if any(comp.name.startswith(e) for e in exclude):+ continue+ rule = next((k for k in kit if k in comp.name.lower()), None)+ if raw_kit is None and provenance.get("asPurchased", False):+ rule = "asPurchased metadata" children = occ.childOccurrences- has_children = children is not None and children.count > 0- if is_leaf(comp):- rule = kit_rule(comp)- if rule is not None and has_children:- c = collapsed.setdefault(name, {"unit": name, "matchedRule": rule, "quantity": 0})- c["quantity"] += 1- if sub_stack and rule is None:- stats = sub_stats.setdefault(sub_stack[-1], {})- stats[name] = stats.get(name, 0) + 1- row = parts.get(name)- if row is None:- row = {- "componentName": name,- "partNumber": _attr(comp, "partNumber"),- "description": _attr(comp, "description"),- "material": _material_name(comp),- "quantity": 1,- "bodies": comp.bRepBodies.count,- }- if include_pp:- try:- pp = comp.getPhysicalProperties(- adsk.fusion.CalculationAccuracy.LowCalculationAccuracy)- row["volume_cm3"] = round(pp.volume, 4)- row["mass_kg"] = round(pp.mass, 6)- except Exception:- row["volume_cm3"] = None- row["mass_kg"] = None- parts[name] = row- else:- row["quantity"] += 1- elif has_children:- sub_stack.append(name)+ if comp.bRepBodies.count or rule:+ add(comp, occ.fullPathName, rule)+ if rule and children.count:+ row = collapsed.setdefault(identity(comp), {"componentId": identity(comp), "unit": comp.name, "matchedRule": rule, "quantity": 0})+ row["quantity"] += 1+ elif children.count:+ # A component may own bodies AND children. Count both instead of+ # treating every component containing a body as a terminal leaf. walk(children)- sub_stack.pop() try:- walk(design.rootComponent.occurrences)- except _BudgetExceeded:- return {"success": False, "errorCode": "bom_walk_budget_exceeded",- "occurrences": occ_total, "budgetSeconds": budget,- "partialParts": len(parts),- "error": "BOM walk exceeded its %ds budget (%d part types found so far)." % (budget, len(parts)),- "_hint": "On an electronics board use fusion_export_bom instead; on a huge mechanical "- "assembly re-run with a larger maxSeconds."}+ root = design.rootComponent+ if root.bRepBodies.count:+ add(root, "<root>")+ walk(root.occurrences)+ except Exception as exc:+ return {"success": False, "errorCode": "bom_walk_budget_exceeded" if isinstance(exc, TimeoutError) else "bom_walk_failed", "error": str(exc),+ "complete": False, "partialParts": len(parts)} rows = list(parts.values())-- doc_name = design.rootComponent.name- try:- if design.parentDocument:- doc_name = design.parentDocument.name- except Exception:- pass-- # Inverse advisory (Oliver, PR #38 intent): a DESCENDED subassembly dominated by many- # identical small parts walks and quacks like a purchased unit that should be one BOM line.- UNDER_COLLAPSE_MIN = 12- possible_under = []- for sub, stats in sub_stats.items():- part, n = max(stats.items(), key=lambda kv: kv[1])- if n >= UNDER_COLLAPSE_MIN:- possible_under.append({- "subassembly": sub, "dominantPart": part, "instances": n,- "why": "descended subassembly dominated by %d identical parts; if it is a purchased unit, add a matching substring to treatAsUnit and it becomes one line" % n})-- out = {- "success": True,- "design": doc_name,- "partCount": len(rows),- "totalInstances": sum(r["quantity"] for r in rows),- "treatAsUnit": kit,- "collapsedUnits": sorted(collapsed.values(), key=lambda c: -c["quantity"]),- "possibleUnderCollapse": sorted(possible_under, key=lambda a: -a["instances"]),- "parts": rows,- }- if collapsed or possible_under:- bits = []- if collapsed:- bits.append("%d subassembly type(s) were COLLAPSED to one line each by treatAsUnit name-matching (see collapsedUnits); if any is one of YOUR designs rather than a purchased unit, re-run with an explicit treatAsUnit list (or []) to explode it" % len(collapsed))- if possible_under:- bits.append("%d descended subassembly(ies) look like purchased units (see possibleUnderCollapse); add a matching substring to treatAsUnit to collapse them" % len(possible_under))- out["_hint"] = ". ".join(bits) + "."--- outpath = args.get("outputPath")- if outpath:+ out = {"success": not errors, "complete": not errors, "design": design.parentDocument.name,+ "partCount": len(rows), "totalInstances": sum(r["quantity"] for r in rows),+ "treatAsUnit": kit, "collapsedUnits": list(collapsed.values()),+ "possibleUnderCollapse": [], "parts": rows, "errors": errors}+ if collapsed:+ out["_hint"] = "Named purchased-unit rules collapsed subassemblies; inspect collapsedUnits. Pass treatAsUnit:[] to explode all children."+ if args.get("outputPath") and out["success"]: try:- cols = ["Part Number", "Part Name", "Description", "Material", "Quantity"]- if include_pp:- cols += ["Volume cm3", "Mass kg"]- with open(outpath, "w", newline="", encoding="utf-8") as f:- w = csv.writer(f)- w.writerow(cols)- for r in rows:- line = [r["partNumber"], r["componentName"], r["description"],- r["material"], r["quantity"]]+ destination = Path(args["outputPath"])+ if not destination.is_absolute() or destination.suffix.lower() != ".csv":+ raise ValueError("outputPath must be an absolute .csv path.")+ if destination.is_symlink() or destination.is_dir():+ raise ValueError("Destination must be a regular file path.")+ destination.parent.mkdir(parents=True, exist_ok=True)+ with tempfile.TemporaryDirectory(prefix=".adom-bom-", dir=str(destination.parent)) as folder:+ staged = Path(folder) / "bom.csv"+ with staged.open("w", newline="", encoding="utf-8") as stream:+ writer = csv.writer(stream)+ columns = ["Component ID", "Part Number", "Part Name", "Description", "Material", "Quantity", "Supplier", "Supplier Part Number", "Source URL", "SHA256"] if include_pp:- line += [r.get("volume_cm3"), r.get("mass_kg")]- w.writerow(line)- out["outputPath"] = outpath- except Exception as e:- out["csvError"] = str(e)-+ columns += ["Volume cm3", "Mass kg"]+ writer.writerow(columns)+ for row in rows:+ line = [row["componentId"], row["partNumber"], row["componentName"], row["description"], row["material"], row["quantity"]]+ line += [row.get(name, "") for name in ("supplier", "supplierPartNumber", "sourceUrl", "sha256")]+ if include_pp:+ line += [row.get("volume_cm3"), row.get("mass_kg")]+ # CSV intended for spreadsheet use: text cannot become a formula.+ writer.writerow([("'" + cell if cell[:1] in "=+-@" else cell) if isinstance(cell, str) and cell else cell for cell in line])+ out.update(publish_staged(staged, destination, args.get("overwrite", True)))+ except Exception as exc:+ if out.get("published"):+ out["cleanupWarning"] = str(exc)+ else:+ out.update(success=False, csvError=str(exc), errorCode="bom_csv_failed", error=str(exc)) return out
addin/AdomBridge/commands/cloud_documents.py+7−91@@ -1484,98 +1484,14 @@ def handle_search_cloud_files(app: adsk.core.Application, args: dict) -> dict: def handle_export_cloud_file(app: adsk.core.Application, args: dict) -> dict:- """Export the active Fusion document to a local file for transfer.-- Exports the currently open document as STEP, STL, F3D, or other format- to a local file path. The file can then be pulled back to Docker via pull_file.-- Args:- args: Dict with:- - outputPath: Local file path to export to (required).- - format: Export format (optional, default "step").- Supported: "step", "stl", "f3d", "iges", "sat", "smt".- """- output_path = args.get("outputPath", "").strip()- if not output_path:- return {"success": False, "error": "No outputPath specified."}-- output_path = output_path.replace("\\", "/")+ """Compatibility entry point using the safe shared single-file exporter."""+ from .export import _export fmt = args.get("format", "step").lower().strip()-- doc = app.activeDocument- if not doc:- return {- "success": False,- "error": "No active document to export.",- "_hint": "Call fusion_open_cloud_file to open a file, then retry.",- }-- # Get the design product- design = None- try:- design = adsk.fusion.Design.cast(app.activeProduct)- except Exception:- pass-- if not design:- return {- "success": False,- "error": "Active document is not a Fusion Design. Cannot export.",- "_hint": "Call fusion_activate_workspace with target='design' or open a Fusion Design document first, then retry.",- "data": {"hint": "Open a design document first, or switch to the Design workspace."},- }-- # Ensure output directory exists- out_dir = os.path.dirname(output_path)- if out_dir and not os.path.exists(out_dir):- os.makedirs(out_dir, exist_ok=True)-- root = design.rootComponent- export_mgr = design.exportManager-- try:- if fmt in ("step", "stp"):- options = export_mgr.createSTEPExportOptions(output_path, root)- export_mgr.execute(options)- elif fmt == "stl":- options = export_mgr.createSTLExportOptions(root, output_path)- export_mgr.execute(options)- elif fmt in ("iges", "igs"):- options = export_mgr.createIGESExportOptions(output_path, root)- export_mgr.execute(options)- elif fmt == "sat":- options = export_mgr.createSATExportOptions(output_path, root)- export_mgr.execute(options)- elif fmt == "smt":- options = export_mgr.createSMTExportOptions(output_path, root)- export_mgr.execute(options)- elif fmt == "f3d":- options = export_mgr.createFusionArchiveExportOptions(output_path)- export_mgr.execute(options)- else:- return {- "success": False,- "error": f"Unsupported format: {fmt}",- "data": {"supportedFormats": ["step", "stl", "f3d", "iges", "sat", "smt"]},- }- except Exception as e:- return {"success": False, "error": f"Export failed: {e}"}-- if not os.path.exists(output_path):- return {"success": False, "error": f"Export file was not created at {output_path}"}-- size = os.path.getsize(output_path)-- return {- "success": True,- "output": f"Exported '{doc.name}' as {fmt.upper()} to {output_path} ({size} bytes)",- "data": {- "outputPath": output_path,- "format": fmt,- "fileSize": size,- "documentName": doc.name,- },- }+ fmt = {"stp": "step", "igs": "iges"}.get(fmt, fmt)+ out = _export(app, args, fmt)+ if out.get("success"):+ out["data"]["documentName"] = app.activeDocument.name+ return out def handle_walk_cloud_tree(app: adsk.core.Application, args: dict) -> dict:
addin/AdomBridge/commands/export.py+31−676@@ -1,693 +1,48 @@-"""Export commands — STEP, STL, 3MF, F3D, FBX.+"""Legacy export verbs sharing the guarded single-file staging implementation. -All 3D export commands require an active Fusion Design (3D PCB view or a CAD-design document). Switch to 3D PCB view with fusion_show_3d_board before-exporting from an electronics project.+Legacy callers retain implicit overwrite behavior. The typed mechanical exporter+requires an explicit overwrite:true. Both preserve existing bytes on failure. """- import adsk.core import adsk.fusion-import os-import time-from pathlib import Path---# Shared hint constants — reused across every export handler.-_HINT_NO_OUTPUT_PATH = (- "Provide an outputPath arg like {\"outputPath\": \"C:\\\\path\\\\out.step\"}. "- "The path must include the file extension matching the export format."-)-_HINT_FORMAT_UNAVAILABLE = (- "This format isn't available in this Fusion build. "- "Use fusion_export_step or fusion_export_stl as a fallback."-)-_HINT_EXPORT_FAILED = (- "If this persists, call fusion_screenshot_fusion to check for a blocking dialog, "- "then fusion_send_key with 'escape' or 'enter' to dismiss it. "- "Wrong-workspace errors: call fusion_show_3d_board first."-)-_HINT_FILE_LOCKED = (- "Close the file in any viewer (Blender, Windows Explorer preview, etc.), "- "or call fusion_close_document first if it's open in Fusion, then retry."-)+from .mechanical.exporting import export_design+from .mechanical.core import MechanicalError -def _get_active_design(app: adsk.core.Application):- """Get the active Fusion design, or None."""- product = app.activeProduct- if product and product.productType == "DesignProductType":- return adsk.fusion.Design.cast(product)- return None+def _get_active_design(app):+ return adsk.fusion.Design.cast(app.activeProduct) def _no_design_error():- """Standard error when no active design is available."""- return {- "success": False,- "error": "No active design open in Fusion 360.",- "_hint": "If you're in PCB Editor (2D board), call fusion_show_3d_board to switch to 3D view. Otherwise call fusion_open_cloud_file to open a Design document, then retry.",- "data": {- "hint": "3D exports require a Design product. If you're in PCB Editor (2D board), "- "switch to 3D view first with fusion_show_3d_board.",- "recoverySteps": [- "Run fusion_show_3d_board to switch to 3D PCB view",- "Or open a .f3d design document",- "Then retry the export command",- ],- },- }---def _export_success(fmt: str, output_path: str, extra_msg: str = "") -> dict:- """Standard success response for 3D exports."""- size = os.path.getsize(output_path) if os.path.exists(output_path) else 0- return {- "success": True,- "output": f"Exported {fmt} to {output_path}",- "message": f"{fmt} file exported ({size // 1024} KB). "- f"{extra_msg}"- "Use pull_file to transfer to Docker.",- "data": {- "outputPath": output_path,- "format": fmt.lower(),- "fileSizeKB": size // 1024,- "nextSteps": [- "Use pull_file to transfer the file back to Docker",- "Export other formats: fusion_export_step, fusion_export_stl, fusion_export_3mf, fusion_export_f3d, fusion_export_fbx",- ],- },- }---def handle_export_step(app: adsk.core.Application, args: dict) -> dict:- """Export the active design as a STEP file (.step).-- Industry-standard CAD interchange format. Best for mechanical CAD- interoperability (SolidWorks, CATIA, Creo, etc.).-- Args:- outputPath: Full path for the output .step file (required).- """- output_path = args.get("outputPath", "")- if not output_path:- return {"success": False, "error": "No outputPath specified", "_hint": _HINT_NO_OUTPUT_PATH}-- design = _get_active_design(app)- if not design:- return _no_design_error()-- Path(output_path).parent.mkdir(parents=True, exist_ok=True)-- export_mgr = design.exportManager- options = export_mgr.createSTEPExportOptions(output_path)- result = export_mgr.execute(options)-- if result:- return _export_success("STEP", output_path,- "Industry-standard CAD interchange — opens in any CAD tool. ")- return {"success": False, "error": "STEP export failed", "_hint": _HINT_EXPORT_FAILED}---def handle_export_stl(app: adsk.core.Application, args: dict) -> dict:- """Export the active design as an STL file (.stl).-- Mesh-based format for 3D printing and visualization.-- Args:- outputPath: Full path for the output .stl file (required).- refinement: "low", "medium", or "high" (default: "medium").- """- output_path = args.get("outputPath", "")- if not output_path:- return {"success": False, "error": "No outputPath specified", "_hint": _HINT_NO_OUTPUT_PATH}-- design = _get_active_design(app)- if not design:- return _no_design_error()-- Path(output_path).parent.mkdir(parents=True, exist_ok=True)-- root = design.rootComponent- export_mgr = design.exportManager- options = export_mgr.createSTLExportOptions(root, output_path)-- refinement = args.get("refinement", "medium").lower()- refinement_map = {- "low": adsk.fusion.MeshRefinementSettings.MeshRefinementLow,- "medium": adsk.fusion.MeshRefinementSettings.MeshRefinementMedium,- "high": adsk.fusion.MeshRefinementSettings.MeshRefinementHigh,- }- options.meshRefinement = refinement_map.get(- refinement, adsk.fusion.MeshRefinementSettings.MeshRefinementMedium- )-- result = export_mgr.execute(options)-- if result:- return _export_success("STL", output_path,- f"Mesh refinement: {refinement}. Good for 3D printing. ")- return {"success": False, "error": "STL export failed", "_hint": _HINT_EXPORT_FAILED}---def handle_export_3mf(app: adsk.core.Application, args: dict) -> dict:- """Export the active design as a 3MF file (.3mf).-- Modern 3D printing format — supports color, materials, and multi-body.-- Args:- outputPath: Full path for the output .3mf file (required).- """- output_path = args.get("outputPath", "")- if not output_path:- return {"success": False, "error": "No outputPath specified", "_hint": _HINT_NO_OUTPUT_PATH}-- design = _get_active_design(app)- if not design:- return _no_design_error()-- Path(output_path).parent.mkdir(parents=True, exist_ok=True)-- root = design.rootComponent- export_mgr = design.exportManager- options = export_mgr.createC3MFExportOptions(root, output_path)- result = export_mgr.execute(options)+ return {"success": False, "errorCode": "no_design", "error": "No active Fusion Design.",+ "_hint": "Open a Design or switch the electronics project to its 3D view."} - if result:- return _export_success("3MF", output_path,- "Modern 3D printing format with color/material support. ")- return {"success": False, "error": "3MF export failed", "_hint": _HINT_EXPORT_FAILED}---def handle_export_f3d(app: adsk.core.Application, args: dict) -> dict:- """Export the active design as a Fusion 360 archive (.f3d).-- Native Fusion format — preserves all parametric features, sketches,- timeline history, and component references. Best for archiving or- sharing with other Fusion 360 users.-- Args:- outputPath: Full path for the output .f3d file (required).- """- output_path = args.get("outputPath", "")- if not output_path:- return {"success": False, "error": "No outputPath specified", "_hint": _HINT_NO_OUTPUT_PATH}-- design = _get_active_design(app)- if not design:- return _no_design_error()-- Path(output_path).parent.mkdir(parents=True, exist_ok=True)-- export_mgr = design.exportManager- options = export_mgr.createFusionArchiveExportOptions(output_path)- result = export_mgr.execute(options)-- if result:- return _export_success("F3D", output_path,- "Fusion 360 native archive — preserves all features and history. ")- return {"success": False, "error": "F3D export failed", "_hint": _HINT_EXPORT_FAILED}---def handle_export_usdz(app: adsk.core.Application, args: dict) -> dict:- """Export the active design as a USDZ file (.usdz).-- Universal Scene Description (USD) — Pixar's scene-graph format adopted- by Apple, NVIDIA, and Autodesk. Preserves:- - Full component hierarchy (board, copper layers, soldermask, packages)- - PBR materials and colors- - Named nodes for toggling parts on/off in viewers-- Best format for digital twins, AR (Apple Quick Look), and GLB conversion- via Blender. The component hierarchy maps directly to toggleable nodes- in GLB viewers.-- Pipeline: Fusion → USDZ → Blender → GLB (or view USDZ directly on iOS)-- Args:- outputPath: Full path for the output .usdz file (required).- """- output_path = args.get("outputPath", "")- if not output_path:- return {"success": False, "error": "No outputPath specified", "_hint": _HINT_NO_OUTPUT_PATH} +def _export(app, args, fmt): design = _get_active_design(app) if not design: return _no_design_error()-- # Ensure .usdz extension- if not output_path.lower().endswith(('.usdz', '.usd', '.usda', '.usdc')):- output_path = str(Path(output_path).with_suffix('.usdz'))-- Path(output_path).parent.mkdir(parents=True, exist_ok=True)-- # Pre-delete to avoid overwrite dialogs- if os.path.exists(output_path):- try:- os.remove(output_path)- except PermissionError:- return {- "success": False,- "error": f"Cannot overwrite {output_path} — file is locked.",- "_hint": _HINT_FILE_LOCKED,- "data": {- "hint": "Close the file in any viewer and retry.",- "outputPath": output_path,- },- }-- export_mgr = design.exportManager- try:- options = export_mgr.createUSDExportOptions(output_path)- except AttributeError:- return {- "success": False,- "error": "USDZ export not available in this Fusion 360 version.",- "_hint": _HINT_FORMAT_UNAVAILABLE,- "data": {- "hint": "createUSDExportOptions requires a recent Fusion 360 build. "- "Export as STEP instead and convert via Blender.",- "recoverySteps": [- "Export STEP: fusion_export_step (then convert in Blender)",- "Export OBJ: fusion_export_fbx (falls back to OBJ)",- ],- },- }-- result = export_mgr.execute(options)-- if result and os.path.exists(output_path):- size = os.path.getsize(output_path)-- # Get component hierarchy for the response- components = []- try:- root = design.rootComponent- for i in range(root.occurrences.count):- occ = root.occurrences.item(i)- components.append(occ.name)- except Exception:- pass-- return {- "success": True,- "output": f"Exported USDZ to {output_path}",- "message": f"USDZ exported ({size // 1024} KB) with full component hierarchy. "- f"Contains {len(components)} top-level components that map to "- f"toggleable nodes in GLB viewers. "- f"Use pull_file to transfer to Docker.",- "data": {- "outputPath": output_path,- "format": "usdz",- "fileSizeKB": size // 1024,- "components": components,- "hint": "USDZ preserves PBR materials and scene hierarchy. "- "Each component (Board, copper layers, soldermask, Packages) "- "becomes a separate toggleable node in the GLB.",- "nextSteps": [- "Use pull_file to transfer the USDZ to Docker",- "Convert to GLB: blender --background --python-expr "- "\"import bpy; bpy.ops.wm.read_factory_settings(use_empty=True); "- "bpy.ops.wm.usd_import(filepath='input.usdz'); "- "bpy.ops.export_scene.gltf(filepath='output.glb')\"",- "Or view directly on iOS/macOS — USDZ is Apple's native AR format",- "Or import into Unity/Unreal Engine for interactive 3D",- ],- },- }-- return {"success": False, "error": "USDZ export failed", "_hint": _HINT_EXPORT_FAILED}---def handle_export_fbx(app: adsk.core.Application, args: dict) -> dict:- """Export the active design as an FBX file (.fbx).-- Autodesk FBX format — widely used for 3D interchange with Blender,- Unity, Unreal Engine, and other DCC tools.-- NOTE: FBX export is not available in current Fusion 360 builds via the API.- This command will fail clearly — use fusion_export_usdz or fusion_export_step- instead. No silent fallbacks.-- Args:- outputPath: Full path for the output .fbx file (required).- """- output_path = args.get("outputPath", "")- if not output_path:- return {"success": False, "error": "No outputPath specified", "_hint": _HINT_NO_OUTPUT_PATH}-- design = _get_active_design(app)- if not design:- return _no_design_error()-- Path(output_path).parent.mkdir(parents=True, exist_ok=True)-- # Pre-delete to avoid overwrite dialogs- if os.path.exists(output_path):- try:- os.remove(output_path)- except PermissionError:- return {- "success": False,- "error": f"Cannot overwrite {output_path} — file is locked.",- "_hint": _HINT_FILE_LOCKED,- "data": {- "hint": "The file may be open in another application. Close it and retry.",- "outputPath": output_path,- },- }-- # Try FBX via exportManager API- export_mgr = design.exportManager try:- options = export_mgr.createFBXExportOptions(output_path)- result = export_mgr.execute(options)- if result and os.path.exists(output_path):- return _export_success("FBX", output_path,- "Convert to GLB via Blender: "- "blender --background --python-expr "- "\"import bpy; bpy.ops.import_scene.fbx(filepath='<fbx>'); "- "bpy.ops.export_scene.gltf(filepath='<glb>')\" ")- except (AttributeError, Exception):- pass # createFBXExportOptions doesn't exist in this Fusion build+ data = export_design(design, {**args, "format": fmt, "overwrite": args.get("overwrite", True)})+ data["fileSizeKB"] = data["fileSize"] // 1024+ return {"success": True, "data": data,+ "output": "Exported " + fmt.upper() + " to " + data["outputPath"]}+ except MechanicalError as exc:+ return {"success": False, "errorCode": exc.code, "error": str(exc), **exc.details}+ except Exception as exc:+ return {"success": False, "errorCode": "export_failed", "error": str(exc),+ "destinationPreserved": True} - # FBX not available — fail clearly, no fallbacks- return {- "success": False,- "error": "FBX export not available in this Fusion 360 build. "- "Use fusion_export_usdz or fusion_export_step instead.",- "_hint": _HINT_FORMAT_UNAVAILABLE,- "data": {- "hint": "FBX is not supported via the Fusion API in current builds. "- "Use fusion_export_usdz (best for Blender/GLB pipeline, preserves "- "PBR materials and scene hierarchy) or fusion_export_step "- "(highest geometric fidelity).",- "alternatives": ["fusion_export_usdz", "fusion_export_step", "fusion_export_stl"],- },- }---def handle_export_dxf(app: adsk.core.Application, args: dict) -> dict:- """Export the active design as a DXF file (.dxf).-- AutoCAD DXF (Drawing Exchange Format) — universal 2D/3D CAD interchange.- Widely supported by all CAD tools, laser cutters, CNC routers, and- PCB fabrication houses.-- Args:- outputPath: Full path for the output .dxf file (required).- """- output_path = args.get("outputPath", "")- if not output_path:- return {"success": False, "error": "No outputPath specified", "_hint": _HINT_NO_OUTPUT_PATH}-- design = _get_active_design(app)- if not design:- return _no_design_error()-- Path(output_path).parent.mkdir(parents=True, exist_ok=True)-- if os.path.exists(output_path):- try:- os.remove(output_path)- except PermissionError:- return {- "success": False,- "error": f"Cannot overwrite {output_path} — file is locked.",- "_hint": _HINT_FILE_LOCKED,- "data": {"outputPath": output_path},- }-- export_mgr = design.exportManager- try:- options = export_mgr.createDXFExportOptions(output_path)- result = export_mgr.execute(options)- if result and os.path.exists(output_path):- return _export_success("DXF", output_path,- "Universal CAD interchange — opens in AutoCAD, LibreCAD, etc. ")- except (AttributeError, Exception):- pass-- return {- "success": False,- "error": "DXF export failed or not available in this Fusion 360 build.",- "_hint": _HINT_FORMAT_UNAVAILABLE,- "data": {- "hint": "Try fusion_export_step for CAD interchange instead.",- "alternatives": ["fusion_export_step", "fusion_export_dwg"],- },- }---def handle_export_dwg(app: adsk.core.Application, args: dict) -> dict:- """Export the active design as a DWG file (.dwg).-- AutoCAD native format — the industry standard for 2D/3D technical- drawings. Best for sharing with AutoCAD, BricsCAD, DraftSight users.-- Args:- outputPath: Full path for the output .dwg file (required).- """- output_path = args.get("outputPath", "")- if not output_path:- return {"success": False, "error": "No outputPath specified", "_hint": _HINT_NO_OUTPUT_PATH}-- design = _get_active_design(app)- if not design:- return _no_design_error()-- Path(output_path).parent.mkdir(parents=True, exist_ok=True)-- if os.path.exists(output_path):- try:- os.remove(output_path)- except PermissionError:- return {- "success": False,- "error": f"Cannot overwrite {output_path} — file is locked.",- "_hint": _HINT_FILE_LOCKED,- "data": {"outputPath": output_path},- }-- export_mgr = design.exportManager- try:- options = export_mgr.createDWGExportOptions(output_path)- result = export_mgr.execute(options)- if result and os.path.exists(output_path):- return _export_success("DWG", output_path,- "AutoCAD native format — opens in AutoCAD, BricsCAD, etc. ")- except (AttributeError, Exception):- pass-- return {- "success": False,- "error": "DWG export failed or not available in this Fusion 360 build.",- "_hint": _HINT_FORMAT_UNAVAILABLE,- "data": {- "hint": "Try fusion_export_dxf or fusion_export_step instead.",- "alternatives": ["fusion_export_dxf", "fusion_export_step"],- },- }---def handle_export_iges(app: adsk.core.Application, args: dict) -> dict:- """Export the active design as an IGES file (.igs/.iges).-- Legacy CAD interchange format. Still used by some older CAD systems- and manufacturing tools. STEP is preferred for modern workflows.-- Args:- outputPath: Full path for the output .igs file (required).- """- output_path = args.get("outputPath", "")- if not output_path:- return {"success": False, "error": "No outputPath specified", "_hint": _HINT_NO_OUTPUT_PATH}-- design = _get_active_design(app)- if not design:- return _no_design_error()-- Path(output_path).parent.mkdir(parents=True, exist_ok=True)-- if os.path.exists(output_path):- try:- os.remove(output_path)- except PermissionError:- return {- "success": False,- "error": f"Cannot overwrite {output_path} — file is locked.",- "_hint": _HINT_FILE_LOCKED,- "data": {"outputPath": output_path},- }-- export_mgr = design.exportManager- try:- options = export_mgr.createIGESExportOptions(output_path)- result = export_mgr.execute(options)- if result and os.path.exists(output_path):- return _export_success("IGES", output_path,- "Legacy CAD interchange — STEP is preferred for modern use. ")- except (AttributeError, Exception):- pass-- return {- "success": False,- "error": "IGES export failed or not available in this Fusion 360 build.",- "_hint": _HINT_FORMAT_UNAVAILABLE,- "data": {- "hint": "Try fusion_export_step instead (modern replacement for IGES).",- "alternatives": ["fusion_export_step"],- },- }---def handle_export_obj(app: adsk.core.Application, args: dict) -> dict:- """Export the active design as an OBJ file (.obj).-- Wavefront OBJ — simple mesh format widely supported by 3D viewers,- game engines, and DCC tools. No materials or hierarchy.-- Args:- outputPath: Full path for the output .obj file (required).- """- output_path = args.get("outputPath", "")- if not output_path:- return {"success": False, "error": "No outputPath specified", "_hint": _HINT_NO_OUTPUT_PATH}-- design = _get_active_design(app)- if not design:- return _no_design_error()-- Path(output_path).parent.mkdir(parents=True, exist_ok=True)-- if os.path.exists(output_path):- try:- os.remove(output_path)- except PermissionError:- return {- "success": False,- "error": f"Cannot overwrite {output_path} — file is locked.",- "_hint": _HINT_FILE_LOCKED,- "data": {"outputPath": output_path},- }-- export_mgr = design.exportManager- try:- options = export_mgr.createOBJExportOptions(output_path)- result = export_mgr.execute(options)- if result and os.path.exists(output_path):- return _export_success("OBJ", output_path,- "Simple mesh format — opens in Blender, Unity, etc. ")- except (AttributeError, Exception):- pass-- return {- "success": False,- "error": "OBJ export failed or not available in this Fusion 360 build.",- "_hint": _HINT_FORMAT_UNAVAILABLE,- "data": {- "hint": "Try fusion_export_stl or fusion_export_usdz instead.",- "alternatives": ["fusion_export_stl", "fusion_export_usdz"],- },- }---def handle_export_sat(app: adsk.core.Application, args: dict) -> dict:- """Export the active design as a SAT file (.sat).-- ACIS SAT — solid modeling kernel format. Used by SolidWorks,- SpaceClaim, and other ACIS-based CAD tools.-- Args:- outputPath: Full path for the output .sat file (required).- """- output_path = args.get("outputPath", "")- if not output_path:- return {"success": False, "error": "No outputPath specified", "_hint": _HINT_NO_OUTPUT_PATH}-- design = _get_active_design(app)- if not design:- return _no_design_error()-- Path(output_path).parent.mkdir(parents=True, exist_ok=True)-- if os.path.exists(output_path):- try:- os.remove(output_path)- except PermissionError:- return {- "success": False,- "error": f"Cannot overwrite {output_path} — file is locked.",- "_hint": _HINT_FILE_LOCKED,- "data": {"outputPath": output_path},- }-- export_mgr = design.exportManager- try:- options = export_mgr.createSATExportOptions(output_path)- result = export_mgr.execute(options)- if result and os.path.exists(output_path):- return _export_success("SAT", output_path,- "ACIS solid modeling format — opens in SolidWorks, SpaceClaim. ")- except (AttributeError, Exception):- pass-- return {- "success": False,- "error": "SAT export failed or not available in this Fusion 360 build.",- "_hint": _HINT_FORMAT_UNAVAILABLE,- "data": {- "hint": "Try fusion_export_step instead.",- "alternatives": ["fusion_export_step"],- },- }---def handle_export_skp(app: adsk.core.Application, args: dict) -> dict:- """Export the active design as a SketchUp file (.skp).-- SketchUp format — popular for architectural visualization and- simple 3D modeling.-- Args:- outputPath: Full path for the output .skp file (required).- """- output_path = args.get("outputPath", "")- if not output_path:- return {"success": False, "error": "No outputPath specified", "_hint": _HINT_NO_OUTPUT_PATH}-- design = _get_active_design(app)- if not design:- return _no_design_error()-- Path(output_path).parent.mkdir(parents=True, exist_ok=True)-- if os.path.exists(output_path):- try:- os.remove(output_path)- except PermissionError:- return {- "success": False,- "error": f"Cannot overwrite {output_path} — file is locked.",- "_hint": _HINT_FILE_LOCKED,- "data": {"outputPath": output_path},- }-- export_mgr = design.exportManager- try:- options = export_mgr.createSKPExportOptions(output_path)- result = export_mgr.execute(options)- if result and os.path.exists(output_path):- return _export_success("SKP", output_path,- "SketchUp format — opens in SketchUp, Trimble viewers. ")- except (AttributeError, Exception):- pass - return {- "success": False,- "error": "SketchUp export failed or not available in this Fusion 360 build.",- "_hint": _HINT_FORMAT_UNAVAILABLE,- "data": {- "hint": "Try fusion_export_step or fusion_export_stl instead.",- "alternatives": ["fusion_export_step", "fusion_export_stl"],- },- }+def handle_export_step(app, args): return _export(app, args, "step")+def handle_export_stl(app, args): return _export(app, args, "stl")+def handle_export_3mf(app, args): return _export(app, args, "3mf")+def handle_export_f3d(app, args): return _export(app, args, "f3d")+def handle_export_usdz(app, args): return _export(app, args, "usdz")+def handle_export_fbx(app, args): return _export(app, args, "fbx")+def handle_export_dxf(app, args): return _export(app, args, "dxf")+def handle_export_dwg(app, args): return _export(app, args, "dwg")+def handle_export_iges(app, args): return _export(app, args, "iges")+def handle_export_obj(app, args): return _export(app, args, "obj")+def handle_export_sat(app, args): return _export(app, args, "sat")+def handle_export_skp(app, args): return _export(app, args, "skp")
addin/AdomBridge/commands/mechanical/__init__.pyadded+158@@ -0,0 +1,158 @@+"""Guarded mechanical dispatcher and session-scoped operation ledger.++The ledger is independent of HTTP waiters: a timed-out operation can be queried+and retried with the same ID. A restart changes sessionId, so replay fails closed.+"""+import copy+import json+import math+from pathlib import Path+import time+import threading++from .core import SESSION_ID, UNITS, MechanicalError, active, digest, require+from .operations import OPERATIONS, WRITES+from . import transactions, sketches, features, assemblies, purchased, bill_of_materials++for _name, _handler in {**sketches.OPERATIONS, **features.OPERATIONS, **assemblies.OPERATIONS}.items():+ OPERATIONS[_name] = lambda app, args, fn=_handler: transactions.execute(app, args, fn)+ WRITES.add(_name)+OPERATIONS.update(assemblies.READS)+OPERATIONS.update(purchased.OPERATIONS)+OPERATIONS.update(bill_of_materials.OPERATIONS)+WRITES.update(purchased.WRITES | bill_of_materials.WRITES)+OPERATIONS["transaction_probe"] = transactions.probe+WRITES.add("transaction_probe")++_ledger = {}+_ledger_lock = threading.RLock()+MAX_OPERATIONS = 2000+SCHEMA = json.loads((Path(__file__).with_name("schema.json")).read_text(encoding="utf-8"))+++def validate(value, schema, path="args"):+ if "oneOf" in schema:+ variants = schema["oneOf"]+ # Discriminator errors should explain the selected operation/primitive,+ # rather than returning a wall of errors from unrelated variants.+ if isinstance(value, dict):+ for discriminator in ("type", "action"):+ if discriminator in value:+ matching = [variant for variant in variants if value[discriminator] in+ variant.get("properties", {}).get(discriminator, {}).get("enum", [])]+ if len(matching) == 1:+ validate(value, matching[0], path)+ variants = []+ break+ if variants:+ successes = 0+ for variant in variants:+ try:+ validate(value, variant, path)+ successes += 1+ except MechanicalError:+ pass+ require(successes == 1, "invalid_input", path + " must match exactly one supported schema variant")+ kinds = {"object": dict, "string": str, "boolean": bool, "number": (int, float), "integer": int, "array": list}+ kind = schema.get("type")+ if kind:+ require(isinstance(value, kinds[kind]) and not (kind in ("number", "integer") and isinstance(value, bool)),+ "invalid_input", path + " must be " + kind)+ if kind in ("number", "integer"):+ require(math.isfinite(value), "invalid_input", path + " must be finite")+ if "exclusiveMinimum" in schema:+ require(value > schema["exclusiveMinimum"], "invalid_input", path + " is too small")+ if "minimum" in schema:+ require(value >= schema["minimum"], "invalid_input", path + " is too small")+ if "maximum" in schema:+ require(value <= schema["maximum"], "invalid_input", path + " is too large")+ if kind == "array":+ require(schema.get("minItems", 0) <= len(value) <= schema.get("maxItems", 10000), "invalid_input", path + " has an invalid item count")+ for index, item in enumerate(value):+ validate(item, schema.get("items", {}), path + "[" + str(index) + "]")+ if "enum" in schema:+ require(value in schema["enum"], "invalid_input", path + " has an unsupported value")+ if kind == "object":+ require(len(value) >= schema.get("minProperties", 0), "invalid_input", path + " requires at least one property")+ for key in schema.get("required", []):+ require(key in value, "invalid_input", path + "." + key + " is required")+ props = schema.get("properties", {})+ if schema.get("additionalProperties") is False:+ require(not (set(value) - set(props)), "invalid_input", path + " has unknown fields")+ for key in value.keys() & props.keys():+ validate(value[key], props[key], path + "." + key)+ if isinstance(schema.get("additionalProperties"), dict):+ for key in value.keys() - props.keys():+ validate(value[key], schema["additionalProperties"], path + "." + key)+++def capabilities(app, args):+ return {"success": True, "sessionId": SESSION_ID, "schemaVersion": 1, "units": UNITS,+ "operations": SCHEMA, "transactions": {"genericAtomicBatch": False, "typedModelOperations": transactions.capability(),+ "parameterRecovery": "compensating expression restore with semantic readback",+ "newDesignRecovery": "discard only the new unsaved document",+ "externalEffects": "exports publish atomically; model recovery does not undo files"},+ "idempotency": {"scope": "running add-in session", "capacity": MAX_OPERATIONS,+ "restartBehavior": "old session IDs rejected"}}+++def operation_status(app, args):+ if args.get("sessionId") != SESSION_ID:+ return {"success": False, "errorCode": "session_mismatch", "sessionId": SESSION_ID,+ "error": "Add-in session changed; previous operation outcome is unknown. Inspect before deciding what to do."}+ with _ledger_lock:+ entry = copy.deepcopy(_ledger.get(args.get("operationId")))+ if not entry:+ return {"success": False, "errorCode": "operation_unknown", "sessionId": SESSION_ID,+ "error": "No operation with this ID is recorded in this session.", "outcome": "unknown"}+ return {"success": True, "sessionId": SESSION_ID, "operationId": args["operationId"],+ "state": entry["state"], "result": copy.deepcopy(entry.get("result"))}+++def handle_mechanical(app, args):+ operation_id, entry = None, None+ try:+ require(isinstance(args, dict), "invalid_input", "Arguments must be an object.")+ # Bridge/relay metadata is not an operation argument. Authorization stays+ # in the bridge envelope; changing a transport time budget must not alter+ # an operation's retry fingerprint. Strip only these known-owned keys.+ args = {key: value for key, value in args.items() if key not in ("caller", "_callerBudgetMs")}+ op = args.get("op")+ require(op in OPERATIONS, "unsupported_operation", "Discover supported operations with fusion_mech_capabilities.")+ validate(args, SCHEMA[op])+ # Reject typos before mutating; no silently ignored arguments in the typed layer.+ allowed = set(SCHEMA[op]["properties"]) | {"op", "sessionId", "operationId", "target"}+ require(not (set(args) - allowed), "invalid_input", "Unknown operation arguments: " + ", ".join(sorted(set(args) - allowed)))+ write = op in WRITES or (op == "health" and args.get("recompute", False))+ if write:+ require(args.get("sessionId") == SESSION_ID, "session_mismatch", "Use sessionId from fusion_mech_capabilities; add-in restarts invalidate old requests.")+ operation_id = args.get("operationId")+ require(isinstance(operation_id, str) and 1 <= len(operation_id) <= 128, "operation_id_required", "Every write needs a unique operationId (reuse exactly for retries).")+ fingerprint = digest(args)+ with _ledger_lock:+ existing = _ledger.get(operation_id)+ if existing:+ require(existing["fingerprint"] == fingerprint, "operation_conflict", "operationId was already used with different arguments.")+ if existing.get("result") is not None:+ result = copy.deepcopy(existing["result"])+ result["replayed"] = True+ return result+ return {"success": False, "errorCode": "operation_in_progress", "operationId": operation_id,+ "sessionId": SESSION_ID, "error": "Operation is already executing; query its status."}+ require(len(_ledger) < MAX_OPERATIONS, "operation_capacity", "Session operation ledger is full; existing results remain queryable.")+ entry = {"fingerprint": fingerprint, "state": "running", "startedAt": time.time()}+ _ledger[operation_id] = entry+ data = OPERATIONS[op](app, args)+ result = {"success": True, "sessionId": SESSION_ID, "operation": op, "data": data}+ except MechanicalError as exc:+ result = {"success": False, "sessionId": SESSION_ID, "errorCode": exc.code,+ "error": str(exc), **exc.details}+ except Exception as exc:+ result = {"success": False, "sessionId": SESSION_ID, "errorCode": "mechanical_failed",+ "error": str(exc), "recovery": {"verified": False, "strategy": "none"}}+ if entry is not None:+ result["operationId"] = operation_id+ with _ledger_lock:+ entry["state"] = "succeeded" if result["success"] else "failed"+ entry["result"] = copy.deepcopy(result)+ return result
addin/AdomBridge/commands/mechanical/assemblies.pyadded+454@@ -0,0 +1,454 @@+"""Typed component definitions, placements, joint motion and interference."""+import math++import adsk.core+import adsk.fusion++from .core import (identity, items, number, point_mm, ref, require, resolve, same, target)+from .assembly_state import GROUP, MOTION_SCALES, joint_data, joint_motion, metadata, rigid_group_data+from .sketches import collection, component, named+++def hybrid(design):+ enum = getattr(adsk.fusion, "DesignIntentTypes", None)+ require(enum is not None and hasattr(design, "designIntent"), "unsupported_capability", "This operation requires an inspectable Hybrid design intent.")+ require(design.designIntent == enum.HybridDesignIntentType, "hybrid_design_required", "Internal components require Hybrid design intent. Create a new Hybrid design; existing intent is never changed implicitly.")+++def transform(spec=None):+ spec = spec or {}+ matrix = adsk.core.Matrix3D.create()+ angle = number(spec.get("angle", 0), "angle")+ axis = spec.get("axis", [0, 0, 1])+ vector = adsk.core.Vector3D.create(*axis)+ require(vector.length > 1e-9, "invalid_input", "Rotation axis must be nonzero.")+ require(matrix.setToRotation(math.radians(angle), vector, adsk.core.Point3D.create(0, 0, 0)), "invalid_transform", "Fusion refused rotation transform.")+ matrix.translation = adsk.core.Vector3D.create(*[number(n, "position") / 10 for n in spec.get("position", [0, 0, 0])])+ return matrix+++def occurrence_data(occ, value):+ matrix = list(occ.transform2.asArray())+ for index in (3, 7, 11):+ matrix[index] *= 10+ return {"ref": ref(occ, value), "component": {"ref": ref(occ.component, value), "id": identity(occ.component), **metadata(occ.component)},+ "path": occ.fullPathName, "transform": matrix, "transformLayout": "row-major", "translationUnit": "mm",+ "space": "assembly_context", "grounded": occ.isGrounded, "groundedToParent": occ.isGroundToParent}+++def require_transform(actual, expected, message):+ require_transform_values(list(actual.asArray()), list(expected.asArray()), message)+++def require_transform_values(actual_values, expected_values, message):+ require(len(actual_values) == len(expected_values) == 16+ and all(math.isfinite(a) and math.isfinite(b) and abs(a-b) < 1e-8+ for a, b in zip(actual_values, expected_values)), "placement_refused", message)+++def created_occurrence_contexts(design, parent, occurrence):+ """Find placed root proxies without reading a definition-local token."""+ if same(parent, design.rootComponent):+ return [occurrence]+ native = getattr(occurrence, "nativeObject", None) or occurrence+ all_occurrences = items(design.rootComponent.allOccurrences)+ contexts = [o for o in all_occurrences if same(getattr(o, "nativeObject", None) or o, native)]+ if not contexts:+ parents = [o for o in all_occurrences if same(o.component, parent)]+ contexts = [native.createForAssemblyContext(o) for o in parents]+ require(contexts and all(o is not None and o.isValid for o in contexts), "occurrence_context_failed", "Could not obtain placed root-context instances for the new occurrence.")+ return contexts+++def context_placements(design, parent, contexts, expected):+ local_values = list(expected.asArray())+ require_transform_values(local_values, local_values, "Requested transform must be a complete finite matrix.")+ if same(parent, design.rootComponent):+ return [(context, local_values) for context in contexts]+ parents_by_path = {}+ for candidate in items(design.rootComponent.allOccurrences):+ if same(candidate.component, parent):+ parents_by_path.setdefault(candidate.fullPathName, []).append(candidate)+ placements, seen_parents = [], set()+ for context in contexts:+ parent_context = context.assemblyContext+ parent_matches = parents_by_path.get(parent_context.fullPathName, []) if parent_context is not None else []+ require(parent_context is not None and same(parent_context.component, parent)+ and len(parent_matches) == 1 and same(parent_matches[0], parent_context),+ "occurrence_context_failed", "New occurrence's parent must identify an exact root-context instance.")+ require(parent_context.fullPathName not in seen_parents, "occurrence_context_failed", "New occurrence has duplicate parent contexts.")+ seen_parents.add(parent_context.fullPathName)+ parent_values = list(parent_context.transform2.asArray())+ require_transform_values(parent_values, parent_values, "Parent transform must be a complete finite matrix.")+ # Row-major matrices: parent root pose composed with requested local pose.+ world_values = [sum(parent_values[row*4+k] * local_values[k*4+column] for k in range(4))+ for row in range(4) for column in range(4)]+ placements.append((context, world_values))+ require(seen_parents == set(parents_by_path), "occurrence_context_failed", "New occurrence must resolve in every placed parent instance.")+ return placements+++def place_created_occurrence(design, parent, occurrence, expected):+ # Paste New may leave a pending pose and reused parent instances can inherit+ # the source pose. Transform overrides must use root proxies, never the local+ # occurrence. Apply every instance and capture once before shared recompute.+ contexts = created_occurrence_contexts(design, parent, occurrence)+ for context, values in context_placements(design, parent, contexts, expected):+ matrix = expected+ if not same(parent, design.rootComponent):+ matrix = adsk.core.Matrix3D.create()+ require(matrix.setWithArray(values), "placement_failed", "Could not construct the requested root-context placement.")+ context.transform2 = matrix+ require_transform_values(list(context.transform2.asArray()), values, "Fusion refused the requested occurrence transform.")+ captured = False+ if design.snapshots.hasPendingSnapshot:+ require(design.snapshots.add() is not None, "placement_failed", "Could not capture the new occurrence positions.")+ captured = True+ return captured+++def created_occurrence_result(design, parent, occurrence, value, expected=None):+ """Return and verify every placed instance in root assembly coordinates.++ The local transform can retain its base pose even when captured positions+ are correct. Verify the computed root proxies, each against its exact parent.+ """+ contexts = created_occurrence_contexts(design, parent, occurrence)+ if expected is not None:+ for context, values in context_placements(design, parent, contexts, expected):+ require_transform_values(list(context.transform2.asArray()), values,+ "Recompute did not retain the requested placement in every parent instance.")+ rows = [occurrence_data(o, value) for o in contexts]+ return {"occurrence": rows[0], "affectedOccurrences": rows,+ "placementSpace": "parent_component", "referenceSpace": "root_assembly",+ "placementScope": "all_current_parent_instances", "editScope": "parent_component_definition"}+++def parent_component(design, value, args):+ return component(design, value, {"component": args["parent"]} if "parent" in args else {})+++def component_create(design, value, args):+ hybrid(design)+ parent = parent_component(design, value, args)+ expected = transform(args.get("transform"))+ occ = parent.occurrences.addNewComponent(expected)+ require(occ and occ.isValid, "creation_failed", "Component creation failed.")+ named(occ.component, args)+ if args.get("metadata"):+ apply_metadata(occ.component, args["metadata"])+ captured = place_created_occurrence(design, parent, occ, expected)+ return lambda fresh: {**created_occurrence_result(design, parent, occ, fresh, expected), "positionCaptured": captured}+++def occurrence_insert(design, value, args):+ hybrid(design)+ parent = parent_component(design, value, args)+ comp = resolve(design, value, args["component"], ("Component",))+ require(not same(comp, design.rootComponent), "invalid_component", "Root component cannot be instanced.")+ # Avoid cyclic containment before asking the kernel to insert.+ descendants = [comp] + [o.component for o in items(comp.allOccurrences)]+ require(not any(same(parent, c) for c in descendants), "cyclic_assembly", "A component cannot contain itself or its ancestor.")+ method = parent.occurrences.addNewComponentCopy if args.get("independentCopy", False) else parent.occurrences.addExistingComponent+ expected = transform(args.get("transform"))+ occ = method(comp, expected)+ require(occ and occ.isValid, "creation_failed", "Occurrence insertion failed.")+ captured = place_created_occurrence(design, parent, occ, expected)+ return lambda fresh: {**created_occurrence_result(design, parent, occ, fresh, expected), "positionCaptured": captured}+++def occurrence_update(design, value, args):+ require(any(k in args for k in ("transform", "grounded", "groundedToParent")), "invalid_input", "Occurrence update requires a placement or grounding change.")+ occ = resolve(design, value, args["occurrence"], ("Occurrence",))+ if "grounded" in args:+ occ.isGrounded = args["grounded"]+ if "groundedToParent" in args:+ occ.isGroundToParent = args["groundedToParent"]+ if "transform" in args:+ require(not occ.isGrounded and not occ.isGroundToParent, "grounded_occurrence", "Unground the occurrence explicitly before moving it.")+ expected = transform(args["transform"])+ occ.transform2 = expected+ actual = occ.transform2.asArray()+ require(all(abs(a-b) < 1e-8 for a,b in zip(actual, expected.asArray())), "placement_refused", "Constraints prevented the requested occurrence transform.")+ if design.snapshots.hasPendingSnapshot:+ require(design.snapshots.add() is not None, "placement_failed", "Could not capture occurrence position in the timeline.")+ require("grounded" not in args or occ.isGrounded == args["grounded"], "grounding_refused", "Grounding did not match the request.")+ require("groundedToParent" not in args or occ.isGroundToParent == args["groundedToParent"], "grounding_refused", "Parent grounding did not match the request.")+ def result(fresh):+ if "transform" in args:+ expected = transform(args["transform"])+ require(all(abs(a-b) < 1e-8 for a,b in zip(occ.transform2.asArray(), expected.asArray())),+ "placement_refused", "Recompute did not retain the requested occurrence transform.")+ require("grounded" not in args or occ.isGrounded == args["grounded"], "grounding_refused", "Recompute did not retain grounding.")+ require("groundedToParent" not in args or occ.isGroundToParent == args["groundedToParent"], "grounding_refused", "Recompute did not retain parent grounding.")+ return {"occurrence": occurrence_data(occ, fresh)}+ return result+++def occurrence_delete(design, value, args):+ occ = resolve(design, value, args["occurrence"], ("Occurrence",))+ path = occ.fullPathName+ require(occ.deleteMe(), "delete_failed", "Fusion refused occurrence deletion.")+ return {"deletedPath": path}+++def apply_metadata(comp, changes):+ for key in ("name", "partNumber", "description"):+ if key in changes:+ setattr(comp, key, changes[key])+ import json+ for key in changes.keys() - {"name", "partNumber", "description"}:+ require(comp.attributes.add(GROUP, key, json.dumps(changes[key], sort_keys=True)) is not None, "metadata_failed", "Could not persist " + key)+++def component_metadata(design, value, args):+ comp = component(design, value, args)+ apply_metadata(comp, args["changes"])+ return lambda fresh: {"component": {"ref": ref(comp, fresh), **metadata(comp)}}+++def require_root_context(design, entity):+ context = entity if entity.objectType.endswith("::Occurrence") else getattr(entity, "assemblyContext", None)+ if context is not None:+ require(any(same(o, context) and o.fullPathName == context.fullPathName for o in items(design.rootComponent.allOccurrences)),+ "root_context_required", "Assembly analysis and joints require a root-context occurrence reference from inspect.")+ else:+ owner = getattr(entity, "parentComponent", None) or getattr(entity, "component", None)+ if hasattr(entity, "body"):+ owner = entity.body.parentComponent+ if hasattr(entity, "parentSketch"):+ owner = entity.parentSketch.parentComponent+ require(owner is not None and same(owner, design.rootComponent), "occurrence_context_required", "Non-root geometry requires a specific occurrence-context reference.")+++def joint_geometry(design, value, raw):+ entity = resolve(design, value, raw["entity"], ("SketchPoint", "ConstructionPoint", "BRepVertex", "BRepEdge", "BRepFace"))+ require_root_context(design, entity)+ kind = entity.objectType.split("::")[-1]+ default = "middle" if kind == "BRepFace" and entity.geometry.objectType.endswith(("::Cylinder", "::Cone")) else "center"+ key = getattr(adsk.fusion.JointKeyPointTypes, {"center": "CenterKeyPoint", "start": "StartKeyPoint", "middle": "MiddleKeyPoint", "end": "EndKeyPoint"}[raw.get("keyPoint", default)])+ if kind in ("SketchPoint", "ConstructionPoint", "BRepVertex"):+ result = adsk.fusion.JointGeometry.createByPoint(entity)+ elif kind == "BRepEdge":+ result = adsk.fusion.JointGeometry.createByCurve(entity, key)+ elif entity.geometry.objectType.endswith("::Plane"):+ result = adsk.fusion.JointGeometry.createByPlanarFace(entity, None, key)+ else:+ result = adsk.fusion.JointGeometry.createByNonPlanarFace(entity, key)+ require(result is not None, "invalid_joint_geometry", "Fusion could not infer the joint origin.")+ return result+++def set_limits(motion, name, values, scale):+ require(hasattr(motion, name), "wrong_joint_type", "Joint does not support " + name)+ limits = getattr(motion, name)+ minimum = values.get("minimum", limits.minimumValue * scale)+ maximum = values.get("maximum", limits.maximumValue * scale)+ minimum_enabled = values.get("minimumEnabled", "minimum" in values or limits.isMinimumValueEnabled)+ maximum_enabled = values.get("maximumEnabled", "maximum" in values or limits.isMaximumValueEnabled)+ require(not (minimum_enabled and maximum_enabled) or minimum <= maximum, "invalid_limits", "Minimum joint limit must not exceed maximum.")+ rest = values.get("rest", limits.restValue * scale)+ rest_enabled = values.get("restEnabled", "rest" in values or limits.isRestValueEnabled)+ require(not rest_enabled or (not minimum_enabled or rest >= minimum) and (not maximum_enabled or rest <= maximum), "invalid_limits", "Rest position must lie within enabled limits.")+ limits.isMinimumValueEnabled = False+ limits.isMaximumValueEnabled = False+ for key in ("minimum", "maximum", "rest"):+ if key in values:+ setattr(limits, key + "Value", number(values[key], key) / scale)+ limits.isMinimumValueEnabled = minimum_enabled+ limits.isMaximumValueEnabled = maximum_enabled+ limits.isRestValueEnabled = rest_enabled+++def configure_joint(design, joint, args):+ if "name" in args:+ joint.name = args["name"]+ if "suppressed" in args:+ joint.isSuppressed = args["suppressed"]+ motion = joint_motion(joint)+ for prefix, scale in MOTION_SCALES.items():+ if prefix + "Limits" in args:+ set_limits(motion, prefix + "Limits", args[prefix + "Limits"], scale)+ if prefix + "Value" in args:+ require(hasattr(motion, prefix + "Value"), "wrong_joint_type", "Joint does not support " + prefix)+ number_value = number(args[prefix + "Value"], prefix + "Value") / scale+ limits = getattr(motion, prefix + "Limits")+ require(not limits.isMinimumValueEnabled or number_value >= limits.minimumValue, "joint_limit_exceeded", "Drive value is below minimum.")+ require(not limits.isMaximumValueEnabled or number_value <= limits.maximumValue, "joint_limit_exceeded", "Drive value is above maximum.")+ setattr(motion, prefix + "Value", number_value)+ # Joint value and suppression setters alter pending assembly state. Capture+ # once, after all requested changes, so computeAll replays that state instead+ # of resetting it. Rest values and limit flags stay intact.+ captured = False+ if ("suppressed" in args or any(prefix + "Value" in args for prefix in MOTION_SCALES)) and design.snapshots.hasPendingSnapshot:+ require(design.snapshots.add() is not None, "joint_capture_failed", "Could not capture the edited assembly state.")+ captured = True+ return captured+++def joint_result(joint, value, args):+ result = joint_data(joint, value)+ for field in ("name", "suppressed"):+ if field in args:+ require(result[field] == args[field], "joint_edit_refused", "Joint did not retain requested " + field + ".")+ for prefix in MOTION_SCALES:+ for suffix in ("Value", "Limits"):+ key = prefix + suffix+ if key in args:+ require(key in result, "joint_readback_failed", "Joint motion readback is unavailable.")+ if suffix == "Value":+ require(math.isclose(result[key], args[key], rel_tol=1e-8, abs_tol=1e-6), "joint_drive_refused", "Joint did not reach the requested drive value.")+ else:+ expected_limits = dict(args[key])+ for field in ("minimum", "maximum", "rest"):+ if field in expected_limits and field + "Enabled" not in expected_limits:+ expected_limits[field + "Enabled"] = True+ for field, expected in expected_limits.items():+ actual = result[key][field]+ require(actual == expected if isinstance(expected, bool) else math.isclose(actual, expected, rel_tol=1e-8, abs_tol=1e-6), "joint_limits_refused", "Joint limit did not read back: " + field)+ return {"joint": result}+++def rigid_group_result(group, value, args):+ result = rigid_group_data(group, value)+ for field in ("name", "suppressed"):+ if field in args:+ require(result[field] == args[field], "rigid_group_edit_refused", "Rigid group did not retain requested " + field + ".")+ return {"rigidGroup": result}+++def joint_create(design, value, args):+ first, second = [resolve(design, value, args[key], ("Occurrence",)) for key in ("occurrenceOne", "occurrenceTwo")]+ require(not same(first, second), "invalid_joint", "Joint requires two distinct occurrences.")+ for occurrence in (first, second):+ require_root_context(design, occurrence)+ geometry = joint_geometry(design, value, args["geometry"]) if args["type"] != "rigid" else None+ group = design.rootComponent.asBuiltJoints+ inp = group.createInput(first, second, geometry)+ method = getattr(inp, {"rigid": "setAsRigidJointMotion", "revolute": "setAsRevoluteJointMotion", "slider": "setAsSliderJointMotion", "cylindrical": "setAsCylindricalJointMotion", "pin_slot": "setAsPinSlotJointMotion", "planar": "setAsPlanarJointMotion", "ball": "setAsBallJointMotion"}[args["type"]])+ direction = getattr(adsk.fusion.JointDirections, args.get("axis", "z").upper() + "AxisJointDirection")+ if args["type"] == "rigid":+ ok = method()+ elif args["type"] == "ball":+ ok = method(adsk.fusion.JointDirections.ZAxisJointDirection, adsk.fusion.JointDirections.XAxisJointDirection)+ elif args["type"] == "pin_slot":+ require(args.get("axis", "z") != args.get("slideAxis", "x"), "invalid_joint_axes", "Pin-slot rotation and slide directions must differ.")+ ok = method(direction, getattr(adsk.fusion.JointDirections, args.get("slideAxis", "x").upper() + "AxisJointDirection"))+ else:+ ok = method(direction)+ require(ok, "joint_failed", "Joint motion definition failed.")+ joint = group.add(inp)+ require(joint and joint.isValid, "joint_failed", "As-built joint creation failed.")+ captured = configure_joint(design, joint, args)+ return lambda fresh: {**joint_result(joint, fresh, args), "positionCaptured": captured}+++def joint_edit(design, value, args):+ require(any(k in args for k in ("name", "suppressed")) or any(prefix + suffix in args for prefix in MOTION_SCALES for suffix in ("Limits", "Value")), "invalid_input", "Joint edit requires a change.")+ joint = resolve(design, value, args["joint"], ("Joint", "AsBuiltJoint"))+ captured = configure_joint(design, joint, args)+ return lambda fresh: {**joint_result(joint, fresh, args), "positionCaptured": captured}+++def joint_delete(design, value, args):+ joint = resolve(design, value, args["joint"], ("Joint", "AsBuiltJoint"))+ name = joint.name+ require(joint.deleteMe(), "delete_failed", "Fusion refused joint deletion.")+ return {"deletedJoint": name}+++def rigid_group_create(design, value, args):+ occurrences = [resolve(design, value, raw, ("Occurrence",)) for raw in args["occurrences"]]+ require(len({identity(o) for o in occurrences}) == len(occurrences), "duplicate_selection", "Rigid group occurrences must be distinct.")+ for occurrence in occurrences:+ require_root_context(design, occurrence)+ group = design.rootComponent.rigidGroups.add(collection(occurrences), args.get("includeChildren", True))+ named(group, args)+ return lambda fresh: rigid_group_result(group, fresh, args)+++def rigid_group_edit(design, value, args):+ require("name" in args or "suppressed" in args, "invalid_input", "Rigid group edit requires a change.")+ group = resolve(design, value, args["group"], ("RigidGroup",))+ if "name" in args:+ group.name = args["name"]+ if "suppressed" in args:+ group.isSuppressed = args["suppressed"]+ captured = False+ if "suppressed" in args and design.snapshots.hasPendingSnapshot:+ require(design.snapshots.add() is not None, "rigid_group_capture_failed", "Could not capture the edited rigid group state.")+ captured = True+ return lambda fresh: {**rigid_group_result(group, fresh, args), "positionCaptured": captured}+++def rigid_group_delete(design, value, args):+ group = resolve(design, value, args["group"], ("RigidGroup",))+ name = group.name+ require(group.deleteMe(), "delete_failed", "Fusion refused rigid group deletion.")+ return {"deletedRigidGroup": name}+++def assembly_properties(app, args):+ _, design, value = target(app, args)+ entity = resolve(design, value, args["entity"], ("Component", "Occurrence", "BRepBody")) if args.get("entity") else design.rootComponent+ props = entity.getPhysicalProperties(adsk.fusion.CalculationAccuracy.HighCalculationAccuracy)+ volume = props.volume * 1000+ is_occurrence = entity.objectType.endswith("::Occurrence")+ return {"target": value, "entity": ref(entity, value), "mass": props.mass, "volume": volume,+ "area": props.area * 100, "centerOfMass": point_mm(props.centerOfMass),+ "averageDensity": props.mass / volume if volume else None,+ "units": {"mass": "kg", "volume": "mm3", "area": "mm2", "centerOfMass": "mm", "averageDensity": "kg/mm3"},+ "scope": "body" if entity.objectType.endswith("::BRepBody") else "component_subtree",+ "space": "assembly_context" if is_occurrence or getattr(entity, "assemblyContext", None) else "component",+ "materialBasis": "Fusion assigned/default material; supplier provenance does not certify modeled material density"}+++def interference(app, args):+ _, design, value = target(app, args)+ entities = [resolve(design, value, r, ("Occurrence", "BRepBody")) for r in args["entities"]]+ selected_bodies = set()+ walked = 0+ def body_instances(entity, depth=0):+ nonlocal walked+ walked += 1+ require(depth <= 100 and walked <= 20000, "inspection_budget", "Interference assembly exceeds traversal budget.")+ if entity.objectType.endswith("::BRepBody"):+ native = getattr(entity, "nativeObject", None) or entity+ context = getattr(entity, "assemblyContext", None)+ return {(identity(native), context.fullPathName if context else "<root>")}+ result = set()+ for body in items(entity.bRepBodies):+ walked += 1+ require(walked <= 20000, "inspection_budget", "Interference assembly exceeds shared body traversal budget.")+ native = getattr(body, "nativeObject", None) or body+ result.add((identity(native), entity.fullPathName))+ for child in items(entity.childOccurrences):+ result.update(body_instances(child, depth + 1))+ require(len(result) <= 20000, "inspection_budget", "Interference assembly exceeds body budget.")+ return result+ for index, entity in enumerate(entities):+ require(not any(same(entity, earlier) for earlier in entities[:index]), "duplicate_selection", "Interference entities must be distinct.")+ require_root_context(design, entity)+ instances = body_instances(entity)+ require(not selected_bodies.intersection(instances), "overlapping_selection", "Selections include the same physical body instance more than once; choose disjoint occurrences/bodies.")+ selected_bodies.update(instances)+ require(len(selected_bodies) <= 20000, "inspection_budget", "Interference selection exceeds physical body instance budget.")+ inp = design.createInterferenceInput(collection(entities))+ inp.areCoincidentFacesIncluded = args.get("includeTouching", False)+ results = design.analyzeInterference(inp)+ require(results is not None, "interference_failed", "Fusion did not return an interference result.")+ rows = []+ for result in items(results):+ body = result.interferenceBody+ volume = body.volume * 1000 if body else 0.0+ rows.append({"entityOne": ref(result.entityOne, value), "entityTwo": ref(result.entityTwo, value),+ "volume": volume, "classification": "overlap" if volume > args.get("volumeTolerance", 1e-6) else "touching"})+ return {"target": value, "complete": True, "results": rows, "volumeUnit": "mm3", "bodiesCreated": False}+++OPERATIONS = {"component_create": component_create, "occurrence_insert": occurrence_insert,+ "occurrence_update": occurrence_update, "occurrence_delete": occurrence_delete,+ "component_metadata": component_metadata, "joint_create": joint_create, "joint_edit": joint_edit,+ "joint_delete": joint_delete, "rigid_group_create": rigid_group_create,+ "rigid_group_edit": rigid_group_edit, "rigid_group_delete": rigid_group_delete}+READS = {"interference": interference, "assembly_properties": assembly_properties}
addin/AdomBridge/commands/mechanical/assembly_state.pyadded+94@@ -0,0 +1,94 @@+"""Assembly readback shared by inspection, stale guards and recovery witnesses."""+import json+import math+import adsk.fusion++from .core import identity, items, ref, require++GROUP = "AdomMechanical"+MOTION_SCALES = {"rotation": 180 / math.pi, "slide": 10, "primarySlide": 10, "secondarySlide": 10,+ "pitch": 180 / math.pi, "roll": 180 / math.pi, "yaw": 180 / math.pi}+++def attributes(entity):+ attrs = getattr(entity, "attributes", None)+ return {attr.name: attr.value for attr in items(attrs) if attr.groupName == GROUP} if attrs else {}+++def metadata(component):+ raw = attributes(component)+ result = {"name": component.name, "partNumber": getattr(component, "partNumber", ""),+ "description": getattr(component, "description", ""), "attributes": raw}+ for name in ("supplier", "supplierPartNumber", "sourceUrl", "sourceFile", "sha256", "asPurchased", "excludeFromBom"):+ if name in raw:+ result[name] = json.loads(raw[name])+ material = getattr(component, "material", None)+ result["material"] = {"id": material.id, "name": material.name} if material else None+ return result+++def limits_data(limits, scale):+ return {"minimumEnabled": limits.isMinimumValueEnabled, "minimum": limits.minimumValue * scale,+ "maximumEnabled": limits.isMaximumValueEnabled, "maximum": limits.maximumValue * scale,+ "restEnabled": limits.isRestValueEnabled, "rest": limits.restValue * scale}+++def joint_motion(joint):+ base = joint.jointMotion+ kind = base.objectType.split("::")[-1]+ require(kind in ("RigidJointMotion", "RevoluteJointMotion", "SliderJointMotion", "CylindricalJointMotion",+ "PinSlotJointMotion", "PlanarJointMotion", "BallJointMotion"), "unsupported_joint_motion", "Cannot inspect joint motion type: " + kind)+ cls = getattr(adsk.fusion, kind, None)+ require(cls is not None, "unsupported_joint_motion", "Fusion motion wrapper is unavailable: " + kind)+ motion = cls.cast(base)+ require(motion is not None, "unsupported_joint_motion", "Fusion could not cast joint motion: " + kind)+ return motion+++def joint_data(joint, value=None):+ motion = joint_motion(joint)+ result = {"name": joint.name, "type": joint.objectType, "motionType": motion.objectType,+ "suppressed": joint.isSuppressed,+ "occurrenceOneId": identity(joint.occurrenceOne) if joint.occurrenceOne else None,+ "occurrenceTwoId": identity(joint.occurrenceTwo) if joint.occurrenceTwo else None}+ for name, scale in MOTION_SCALES.items():+ if hasattr(motion, name + "Limits"):+ result[name + "Limits"] = limits_data(getattr(motion, name + "Limits"), scale)+ if hasattr(motion, name + "Value"):+ result[name + "Value"] = getattr(motion, name + "Value") * scale+ for name in ("rotationAxisVector", "slideDirectionVector", "normalDirectionVector", "primarySlideDirectionVector", "secondarySlideDirectionVector"):+ if hasattr(motion, name):+ vector = getattr(motion, name)+ result[name] = [vector.x, vector.y, vector.z] if vector else None+ if hasattr(joint, "transform"):+ matrix = joint.transform+ result["transform"] = list(matrix.asArray()) if matrix else None+ if value:+ result["ref"] = ref(joint, value)+ result["units"] = {"length": "mm", "angle": "deg", "transformTranslation": "cm"}+ return result+++def rigid_group_data(group, value=None):+ result = {"name": group.name, "suppressed": group.isSuppressed,+ "occurrenceIds": [identity(o) for o in items(group.occurrences)]}+ if value:+ result["ref"] = ref(group, value)+ result["occurrenceRefs"] = [ref(o, value) for o in items(group.occurrences)]+ return result+++def component_state(comp):+ result = metadata(comp)+ result["joints"] = [joint_data(joint) for name in ("joints", "asBuiltJoints")+ for joint in items(getattr(comp, name))] if hasattr(comp, "joints") else []+ result["rigidGroups"] = [rigid_group_data(group) for group in items(comp.rigidGroups)] if hasattr(comp, "rigidGroups") else []+ result["bodyMaterials"] = [{"id": body.material.id, "name": body.material.name} if body.material else None+ for body in items(comp.bRepBodies)] if all(hasattr(b, "material") for b in items(comp.bRepBodies)) else []+ return result+++def occurrence_state(occurrence):+ return {"name": getattr(occurrence, "name", None), "grounded": occurrence.isGrounded,+ "groundedToParent": getattr(occurrence, "isGroundToParent", None),+ "attributes": attributes(occurrence)}
addin/AdomBridge/commands/mechanical/bill_of_materials.pyadded+116@@ -0,0 +1,116 @@+"""Definition identity, nested instance quantities, purchased collapse and CSV."""+import csv+from pathlib import Path+import tempfile+import adsk.fusion++from .assembly_state import metadata+from .core import identity, items, occurrence_suppression, ref, require, target+from .exporting import publish_staged+++def generate(design, value, args):+ parts, instances, excluded = {}, [], []+ physical = {"mass": 0.0, "volume": 0.0, "bodyInstances": 0}+ accuracy = adsk.fusion.CalculationAccuracy.HighCalculationAccuracy+ budget = {"visited": 0}+ def visit(comp, depth, ancestry):+ budget["visited"] += 1+ require(depth <= 100 and budget["visited"] <= 20000, "bom_budget", "Assembly exceeds combined purchasing/physical traversal budget.")+ key = identity(comp)+ require(key not in ancestry, "cyclic_assembly", "Assembly contains cyclic component containment.")+ return key+ # Physical totals are independent of purchasing collapse. Count direct bodies+ # once per physical instance, including root bodies and repeated children.+ def physical_walk(comp, occurrence=None, depth=0, ancestry=()):+ key = visit(comp, depth, ancestry)+ bodies = items(occurrence.bRepBodies if occurrence else comp.bRepBodies)+ for body in bodies:+ props = body.getPhysicalProperties(accuracy)+ physical["mass"] += props.mass+ physical["volume"] += props.volume * 1000+ physical["bodyInstances"] += 1+ children = items(occurrence.childOccurrences if occurrence else comp.occurrences)+ for child in children:+ if occurrence_suppression(child) is not True:+ physical_walk(child.component, child, depth + 1, ancestry + (key,))++ def walk(comp, occurrence=None, parent_path=None, depth=0, ancestry=()):+ key = visit(comp, depth, ancestry)+ path = occurrence.fullPathName if occurrence else "<root>"+ data = metadata(comp)+ if occurrence and occurrence_suppression(occurrence) is True:+ excluded.append({"path": path, "reason": "suppressed"})+ return+ if data.get("excludeFromBom", False):+ excluded.append({"path": path, "reason": "excludeFromBom"})+ return+ children = items(occurrence.childOccurrences if occurrence else comp.occurrences)+ purchased = bool(data.get("asPurchased", False)) and not args.get("explodePurchased", False)+ row = {"path": path, "parentPath": parent_path, "depth": depth, "componentId": key, "metadata": data,+ "bodyCount": comp.bRepBodies.count, "childCount": len(children), "asPurchased": purchased,+ "componentRef": ref(comp, value), "occurrenceRef": ref(occurrence, value) if occurrence else None}+ instances.append(row)+ if comp.bRepBodies.count or purchased:+ if key not in parts:+ props = comp.getPhysicalProperties(accuracy) if purchased else None+ direct_properties = [] if purchased else [b.getPhysicalProperties(accuracy) for b in items(comp.bRepBodies)]+ parts[key] = {"componentId": key, **data, "quantity": 0, "occurrencePaths": [],+ "scope": "component_subtree" if purchased else "direct_component_bodies",+ "unitMass": props.mass if props else sum(p.mass for p in direct_properties),+ "unitVolume": props.volume * 1000 if props else sum(p.volume * 1000 for p in direct_properties)}+ parts[key]["quantity"] += 1+ parts[key]["occurrencePaths"].append(path)+ if not purchased:+ for child in children:+ walk(child.component, child, path, depth + 1, ancestry + (key,))++ walk(design.rootComponent)+ physical_walk(design.rootComponent)+ rows = list(parts.values())+ return {"target": value, "complete": True, "parts": rows, "instances": instances, "excluded": excluded,+ "partCount": len(rows), "totalPurchasingInstances": sum(r["quantity"] for r in rows),+ "physical": {**physical, "scope": "all unsuppressed direct-body instances; BOM exclusions do not remove physical mass",+ "materialBasis": "Fusion assigned/default material; supplier provenance does not certify modeled material density"},+ "units": {"mass": "kg", "volume": "mm3"}, "calculationAccuracy": "high",+ "identityScope": "running add-in session; supplier metadata persists in native archives"}+++def bom(app, args):+ _, design, value = target(app, args)+ return generate(design, value, args)+++def bom_export(app, args):+ _, design, value = target(app, args, True)+ destination = Path(args["filename"])+ require(destination.is_absolute() and destination.suffix.lower() == ".csv" and not destination.is_symlink() and not destination.is_dir(), "invalid_destination", "BOM destination must be an absolute regular .csv path.")+ require(args.get("overwrite", False) or not destination.exists(), "destination_exists", "Pass overwrite:true to replace an existing CSV.")+ result = generate(design, value, args)+ destination.parent.mkdir(parents=True, exist_ok=True)+ published = {}+ try:+ with tempfile.TemporaryDirectory(prefix=".adom-bom-", dir=str(destination.parent)) as folder:+ staged = Path(folder) / "bom.csv"+ keys = ["componentId", "partNumber", "name", "description", "quantity", "supplier", "supplierPartNumber", "sourceUrl", "sha256", "unitMass", "unitVolume", "scope"]+ rows = result["parts"]+ if args.get("mode", "flat") == "structured":+ keys = ["path", "parentPath", "depth", "componentId", "name", "partNumber", "description", "quantity", "bodyCount", "childCount", "asPurchased", "supplier", "supplierPartNumber", "sourceUrl", "sha256"]+ rows = [{**row["metadata"], **row, "quantity": 1} for row in result["instances"]]+ with staged.open("w", encoding="utf-8", newline="") as stream:+ writer = csv.writer(stream)+ writer.writerow(keys)+ for part in rows:+ values = [part.get(key, "") for key in keys]+ writer.writerow(["'" + v if isinstance(v, str) and v[:1] in ("=", "+", "-", "@") else v for v in values])+ published.update(publish_staged(staged, destination, args.get("overwrite", False)))+ except Exception as exc:+ if not published.get("published"):+ raise+ published["cleanupWarning"] = str(exc)+ return {"target": value, "partCount": result["partCount"], "mode": args.get("mode", "flat"),+ "calculationAccuracy": result["calculationAccuracy"], **published}+++OPERATIONS = {"bom": bom, "bom_export": bom_export}+WRITES = {"bom_export"}
addin/AdomBridge/commands/mechanical/core.pyadded+287@@ -0,0 +1,287 @@+"""Main-thread mechanical identity, revisions, references and health.++Session IDs are capabilities for this running add-in, not persistent CAD IDs. Tokens+are only resolver inputs: they are never compared to decide entity identity.+"""+import hashlib+import json+import math+import threading+import uuid++import adsk.core+import adsk.fusion++SESSION_ID = str(uuid.uuid4())+_documents = []+_entities = []+MAX_ENTITIES = 20000+UNITS = {"length": "mm", "angle": "deg", "mass": "kg", "area": "mm2", "volume": "mm3"}+++class MechanicalError(Exception):+ def __init__(self, code, message, **details):+ super().__init__(message)+ self.code, self.details = code, details+++def require(condition, code, message, **details):+ if not condition:+ raise MechanicalError(code, message, **details)+++def items(collection):+ require(collection.count <= MAX_ENTITIES, "inspection_budget", "Collection exceeds inspection budget.")+ return [collection.item(i) for i in range(collection.count)]+++def same(a, b):+ return a is b or a == b+++def identity(entity):+ """Object equality, never name or token equality. Retained for this session only."""+ for obj, key in _entities:+ if obj.isValid and same(obj, entity):+ return key+ require(len(_entities) < MAX_ENTITIES, "identity_budget", "Session entity budget exhausted.")+ key = str(uuid.uuid4())+ _entities.append((entity, key))+ return key+++def active(app):+ require(threading.current_thread() is threading.main_thread(), "wrong_thread", "Mechanical API requires the Fusion main thread.")+ doc = app.activeDocument+ design = adsk.fusion.Design.cast(app.activeProduct)+ require(doc and design, "no_design", "The active product must be a Fusion Design.")+ require(same(design.parentDocument, doc), "wrong_document", "Active product and document disagree.")+ for previous, key in _documents:+ if previous.isValid and same(previous, doc):+ return doc, design, key+ key = SESSION_ID + ":" + str(uuid.uuid4())+ _documents.append((doc, key))+ return doc, design, key+++def digest(value):+ return hashlib.sha256(json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False).encode()).hexdigest()+++def revision(design):+ """Aggregate every component, body, sketch, parameter and occurrence transform.++ Fail closed when any required API read fails. A root revision alone misses edits+ to child definitions. Native revision IDs catch equal-volume topology changes.+ """+ from .assembly_state import component_state, occurrence_state+ from .readback import feature_data+ components = []+ for comp in items(design.allComponents):+ components.append([identity(comp), str(comp.revisionId), comp.name,+ [[identity(b), str(b.revisionId)] for b in items(comp.bRepBodies)],+ [[identity(s), str(s.revisionId)] for s in items(comp.sketches)],+ component_state(comp), [feature_data(f, order=i) for i, f in enumerate(items(comp.features))] if hasattr(comp, "features") else []])+ occurrences = [[identity(o), identity(o.component), list(o.transform2.asArray()),+ occurrence_suppression(o), occurrence_state(o)] for o in items(design.rootComponent.allOccurrences)]+ params = [[p.name, p.expression, p.unit] for p in items(design.allParameters)]+ return digest([components, occurrences, params, design.timeline.count, design.timeline.markerPosition])+++def occurrence_suppression(occurrence):+ timeline = occurrence.timelineObject+ return bool(timeline.isSuppressed) if timeline is not None else None+++def target(app, args, write=False):+ doc, design, key = active(app)+ wanted = args.get("target")+ require(isinstance(wanted, dict), "target_required", "Pass target from mechanical inspect.")+ require(wanted.get("documentId") == key, "wrong_document", "Target is not the active document.", activeDocumentId=key)+ rev = revision(design)+ if write or "revision" in wanted:+ require(wanted.get("revision") == rev, "stale_revision", "The model changed; inspect it before a new operation.", currentRevision=rev)+ return doc, design, {"documentId": key, "revision": rev}+++def current_target(app):+ doc, design, key = active(app)+ return {"documentId": key, "revision": revision(design)}+++def ref(entity, target_value, occurrence=None):+ if entity.objectType == "adsk::fusion::Profile":+ from .readback import profile_ref+ sketch = entity.parentSketch+ matches = [index for index, profile in enumerate(items(sketch.profiles)) if same(profile, entity)]+ require(len(matches) == 1, "ambiguous_reference", "Profile must belong uniquely to its sketch.")+ return profile_ref(sketch, entity, matches[0], target_value)+ is_occurrence = entity.objectType.endswith("::Occurrence")+ native = entity if is_occurrence else (getattr(entity, "nativeObject", None) or entity)+ context = None if is_occurrence else (occurrence or getattr(entity, "assemblyContext", None))+ result = {"documentId": target_value["documentId"], "revision": target_value["revision"],+ "token": native.entityToken, "objectType": native.objectType,+ "occurrenceToken": context.entityToken if context else None,+ "occurrencePath": context.fullPathName if context else (entity.fullPathName if is_occurrence else None)}+ if native.objectType == "adsk::fusion::Component" and same(native, native.parentDesign.rootComponent):+ # Fusion can emit a root token that findEntityByToken cannot resolve.+ # Bind this explicit root reference to its live API identity instead.+ result["rootComponentId"] = identity(native)+ return result+++def occurrence_context(design, entity, path):+ require(entity.objectType.endswith("::Occurrence"), "invalid_context", "Context must resolve to an occurrence.")+ native = getattr(entity, "nativeObject", None) or entity+ candidates = [o for o in items(design.rootComponent.allOccurrences)+ if o.fullPathName == path and same(getattr(o, "nativeObject", None) or o, native)]+ if candidates:+ require(len(candidates) == 1, "ambiguous_context", "Occurrence path must identify one instance.")+ return candidates[0]+ # Native definition references have a path relative to their owner. Only+ # retain that context when the token and saved path both resolve exactly.+ require(entity.fullPathName == path, "invalid_context", "Occurrence path changed.")+ return entity+++def resolve(design, target_value, value, allowed=()):+ require(isinstance(value, dict), "invalid_reference", "An entity reference object is required.")+ require(value.get("documentId") == target_value["documentId"] and value.get("revision") == target_value["revision"],+ "stale_reference", "Reference is from another document or revision.")+ if value.get("objectType") == "adsk::fusion::Profile":+ # Bind profile selection to a uniquely+ # resolved sketch, this exact aggregate revision and geometric witness.+ from .readback import profile_signature+ require(not allowed or "Profile" in allowed, "wrong_entity_type", "Operation does not accept profiles.")+ require(isinstance(value.get("sketchToken"), str), "invalid_reference", "Profile sketch token is required.")+ sketches = design.findEntityByToken(value["sketchToken"])+ require(len(sketches) == 1 and sketches[0].objectType.endswith("::Sketch"), "ambiguous_reference", "Profile sketch must resolve uniquely.")+ index = value.get("profileIndex")+ require(isinstance(index, int) and not isinstance(index, bool) and 0 <= index < sketches[0].profiles.count,+ "invalid_reference", "Profile index is no longer valid.")+ profile = sketches[0].profiles.item(index)+ require(digest(profile_signature(profile)) == value.get("fingerprint"), "stale_reference", "Profile geometry changed.")+ return profile+ if "rootComponentId" in value:+ entity = design.rootComponent+ require(value.get("objectType") == "adsk::fusion::Component"+ and value["rootComponentId"] == identity(entity)+ and not value.get("occurrenceToken") and not value.get("occurrencePath"),+ "invalid_reference", "Root reference does not identify this active design's root component.")+ else:+ require(isinstance(value.get("token"), str) and value["token"], "invalid_reference", "Reference token is missing.")+ matches = design.findEntityByToken(value["token"])+ require(len(matches) <= MAX_ENTITIES, "inspection_budget", "Token lookup exceeds inspection budget.")+ if len(matches) > 1 and value.get("objectType") == "adsk::fusion::Component":+ # Repeated definitions can return duplicate API wrappers. Only+ # actual Component equality makes them one entity; face splits and+ # occurrence instances retain the strict one-result rule below.+ first = matches[0]+ for candidate in matches:+ require(candidate.isValid and candidate.objectType == "adsk::fusion::Component"+ and same(first, candidate), "ambiguous_reference",+ "Component token resolves to distinct or invalid entities.", matchCount=len(matches))+ matches = [first]+ require(len(matches) == 1, "ambiguous_reference", "Token must resolve to exactly one live entity.", matchCount=len(matches))+ entity = matches[0]+ require(entity.isValid and entity.objectType == value.get("objectType"), "invalid_reference", "Entity type or validity changed.")+ require(not allowed or entity.objectType.split("::")[-1] in allowed, "wrong_entity_type", "Operation does not accept this entity type.")+ if entity.objectType.endswith("::Occurrence") and value.get("occurrencePath"):+ entity = occurrence_context(design, entity, value["occurrencePath"])+ if value.get("occurrenceToken"):+ contexts = design.findEntityByToken(value["occurrenceToken"])+ require(len(contexts) == 1, "ambiguous_context", "Occurrence context must resolve uniquely.")+ context = occurrence_context(design, contexts[0], value.get("occurrencePath"))+ owner = getattr(entity, "parentComponent", None)+ if owner is None and hasattr(entity, "component"):+ owner = entity.component+ if owner is None and hasattr(entity, "parentSketch"):+ owner = entity.parentSketch.parentComponent+ if owner is None and hasattr(entity, "body"):+ owner = entity.body.parentComponent+ require(owner and same(owner, context.component), "invalid_context", "Entity is not owned by this occurrence component.")+ entity = entity.createForAssemblyContext(context)+ require(entity and entity.isValid, "invalid_context", "Could not create occurrence-context proxy.")+ return entity+++def health(design, recompute=False):+ computed = None+ if recompute:+ computed = bool(design.computeAll())+ faults, unknown, suppressed = [], [], []+ pending = [(str(index), item) for index, item in enumerate(items(design.timeline))]+ while pending:+ index, item = pending.pop(0)+ try:+ if getattr(item, "isGroup", False):+ group = adsk.fusion.TimelineGroup.cast(item)+ pending.extend((index + "." + str(i), child) for i, child in enumerate(items(group)))+ continue+ if getattr(item, "isSuppressed", False):+ suppressed.append({"index": index, "name": item.name})+ continue+ state = item.healthState+ if state != adsk.fusion.FeatureHealthStates.HealthyFeatureHealthState:+ faults.append({"index": index, "name": item.name, "state": int(state),+ "message": item.errorOrWarningMessage})+ except Exception as exc:+ unknown.append({"index": index, "error": str(exc)})+ return {"healthy": computed is not False and not faults and not unknown,+ "computeSucceeded": computed, "complete": not unknown, "faults": faults,+ "unknown": unknown, "suppressed": suppressed, "timelineCount": design.timeline.count}+++def require_healthy(design, recompute=True):+ state = health(design, recompute)+ require(state["healthy"], "unhealthy_model", "Recompute or feature health check failed.", health=state)+ return state+++def point_mm(point):+ return [point.x * 10, point.y * 10, point.z * 10]+++def body_data(body):+ pp = body.physicalProperties+ box = body.boundingBox+ return {"name": body.name, "volume": pp.volume * 1000, "area": pp.area * 100,+ "mass": pp.mass, "centerOfMass": point_mm(pp.centerOfMass),+ "bounds": {"min": point_mm(box.minPoint), "max": point_mm(box.maxPoint)},+ "faces": body.faces.count, "edges": body.edges.count, "isSolid": body.isSolid,+ "space": "component", "units": UNITS}+++def parameter_data(design, parameter):+ unit = parameter.unit+ # Fusion numeric values always use its internal units (cm/rad/kg), regardless+ # of the display unit. Conversion occurs here, never in individual handlers.+ value, normalized = None, unit+ for canonical in ("mm", "deg", "kg", ""):+ try:+ if design.unitsManager.isValidExpression("1 " + canonical, unit):+ value = design.unitsManager.convert(parameter.value, "internalUnits", canonical)+ normalized = canonical or "unitless"+ break+ except Exception:+ continue+ return {"name": parameter.name, "expression": parameter.expression,+ "value": value, "unit": normalized, "displayUnit": unit}+++def recovery_snapshot(design):+ """Semantic recovery witness; native revision IDs legitimately change on undo."""+ from .readback import feature_data, sketch_data, topology_witness+ from .assembly_state import component_state, occurrence_state+ return {"parameters": [[p.name, p.expression, p.unit] for p in items(design.allParameters)],+ "components": [[identity(c), c.name, [topology_witness(b) for b in items(c.bRepBodies)],+ [sketch_data(s) for s in items(c.sketches)],+ [feature_data(f, order=i) for i, f in enumerate(items(c.features))], component_state(c)] for c in items(design.allComponents)],+ "occurrences": [[identity(o), list(o.transform2.asArray()), occurrence_state(o)] for o in items(design.rootComponent.allOccurrences)],+ "timeline": design.timeline.count, "health": health(design)}+++def number(value, name, positive=False):+ require(isinstance(value, (int, float)) and not isinstance(value, bool) and math.isfinite(value), "invalid_input", name + " must be a finite number.")+ require(not positive or value > 0, "invalid_input", name + " must be positive.")+ return float(value)
addin/AdomBridge/commands/mechanical/exporting.pyadded+93@@ -0,0 +1,93 @@+"""Single-file exports: preflight, isolated staging, verified atomic publication."""+import hashlib+import os+from pathlib import Path+import tempfile++import adsk.fusion++from .core import MechanicalError, require++FORMATS = {+ "step": ("createSTEPExportOptions", (".step", ".stp"), "file"),+ "stl": ("createSTLExportOptions", (".stl",), "entity"),+ "3mf": ("createC3MFExportOptions", (".3mf",), "entity"),+ "f3d": ("createFusionArchiveExportOptions", (".f3d",), "file"),+ "iges": ("createIGESExportOptions", (".igs", ".iges"), "file"),+ "sat": ("createSATExportOptions", (".sat",), "file"),+ "smt": ("createSMTExportOptions", (".smt",), "file"),+ "usdz": ("createUSDExportOptions", (".usdz",), "file"),+ "fbx": ("createFBXExportOptions", (".fbx",), "file"),+ "skp": ("createSketchUpExportOptions", (".skp",), "file"),+}+++def publish_staged(staged, destination, overwrite):+ require(staged.is_file() and staged.stat().st_size > 0, "empty_export", "Exporter produced no nonempty file.")+ size = staged.stat().st_size+ sha = hashlib.sha256(staged.read_bytes()).hexdigest()+ result = {"outputPath": str(destination), "fileSize": size, "sha256": sha,+ "published": True, "overwrite": overwrite}+ if overwrite:+ os.replace(str(staged), str(destination))+ else:+ # Atomic exclusive publication. Checking exists then replace has a race that+ # could overwrite another writer's file. A hardlink never replaces it.+ os.link(str(staged), str(destination))+ try:+ staged.unlink()+ except OSError as exc:+ # The hardlink is the publication commit point. A leftover staging+ # link is cleanup work, not a failed export or preserved destination.+ result["cleanupWarning"] = str(exc)+ return result+++def export_design(design, args):+ fmt = args.get("format", "step").lower()+ require(fmt in FORMATS, "unsupported_format", "Single-file export format is unavailable. Sketch DXF requires an explicit sketch; OBJ sidecars need a bundle exporter.")+ method, suffixes, mode = FORMATS[fmt]+ manager = design.exportManager+ factory = getattr(manager, method, None)+ require(callable(factory), "unsupported_capability", method + " is unavailable in this Fusion build.")+ raw = args.get("outputPath")+ require(isinstance(raw, str) and raw, "invalid_path", "outputPath is required.")+ destination = Path(raw)+ require(destination.is_absolute(), "invalid_path", "outputPath must be absolute on the Fusion host.")+ require(destination.suffix.lower() in suffixes, "extension_mismatch", "File extension does not match requested format.")+ overwrite = args.get("overwrite", False)+ require(isinstance(overwrite, bool), "invalid_input", "overwrite must be a boolean.")+ require(not destination.exists() or overwrite, "destination_exists", "Destination exists; pass overwrite:true to atomically replace it.")+ require(not destination.is_symlink() and not destination.is_dir(), "invalid_path", "Destination must be a regular file path.")+ destination.parent.mkdir(parents=True, exist_ok=True)+ # Entire unique directory prevents the exporter seeing an existing file and+ # raising an overwrite dialog. Same filesystem permits atomic publication.+ out = None+ try:+ with tempfile.TemporaryDirectory(prefix=".adom-export-", dir=str(destination.parent)) as folder:+ staged = Path(folder) / ("model" + destination.suffix)+ options = factory(design.rootComponent, str(staged)) if mode == "entity" else factory(str(staged))+ require(options is not None, "export_preflight_failed", "Exporter did not create options.")+ if hasattr(options, "isViewFit"):+ options.isViewFit = False+ if fmt in ("stl", "3mf"):+ options.sendToPrintUtility = False+ options.isOneFilePerBody = False+ if fmt == "stl":+ refinement = args.get("refinement", "medium")+ settings = {"low": "MeshRefinementLow", "medium": "MeshRefinementMedium", "high": "MeshRefinementHigh"}+ require(refinement in settings, "invalid_input", "refinement must be low, medium or high.")+ options.meshRefinement = getattr(adsk.fusion.MeshRefinementSettings, settings[refinement])+ # STL has no embedded unit declaration; request millimetres explicitly.+ require(hasattr(options, "unitType"), "unsupported_capability", "STL millimetre unit selection is unavailable.")+ options.unitType = adsk.fusion.DistanceUnits.MillimeterDistanceUnits+ require(bool(manager.execute(options)), "export_failed", "Fusion exporter returned false; destination was preserved.")+ out = publish_staged(staged, destination, overwrite)+ out.update({"format": fmt, "externalEffect": "file_published", "modelRollbackApplies": False})+ if fmt == "stl":+ out["lengthUnit"] = "mm"+ except Exception as exc:+ if out is None:+ raise+ out["cleanupWarning"] = str(exc)+ return out
addin/AdomBridge/commands/mechanical/features.pyadded+238@@ -0,0 +1,238 @@+"""Solid feature operations; selection always resolves against the guarded model."""+import math++import adsk.core+import adsk.fusion++from .core import items, parameter_data, ref, require, resolve, same+from .readback import feature_data, topology_data+from .sketches import axis, collection, component, named, plane, point, quantity+++def owner(entity):+ if hasattr(entity, "body"):+ return entity.body.parentComponent+ if hasattr(entity, "parentComponent"):+ return entity.parentComponent+ if hasattr(entity, "parentSketch"):+ return entity.parentSketch.parentComponent+ return None+++def selected(design, value, args, name, types, comp):+ raw = args.get(name, [])+ require(isinstance(raw, list) and raw, "invalid_selection", name + " requires at least one reference.")+ result = [resolve(design, value, r, types) for r in raw]+ for entity in result:+ require(getattr(entity, "assemblyContext", None) is None, "definition_reference_required", "Feature authoring requires native definition references.")+ require(same(owner(entity), comp), "wrong_component", "Selected entity belongs to another component; pass its component reference.")+ return result+++def operation(value):+ return getattr(adsk.fusion.FeatureOperations, {"new_body": "NewBodyFeatureOperation", "join": "JoinFeatureOperation",+ "cut": "CutFeatureOperation", "intersect": "IntersectFeatureOperation"}[value])+++def factory(features, name):+ result = getattr(features, name, None)+ require(result is not None, "unsupported_capability", name + " is unavailable in this Fusion build.")+ return result+++def feature_create(design, value, args):+ comp = component(design, value, args)+ features, kind = comp.features, args["type"]+ q = lambda key, unit="mm", positive=True: quantity(design, args[key], unit, positive)+ select = lambda key, types: selected(design, value, args, key, types, comp)+ operation_name = args.get("operation", "new_body")+ if operation_name == "join" and kind in ("extrude", "revolve", "loft", "sweep"):+ require(comp.bRepBodies.count == 1, "ambiguous_join", "Join requires one existing body in the component; create a new body then use combine for explicit multi-body selection.")+ if kind == "extrude":+ profiles = select("profiles", ("Profile",))+ group = factory(features, "extrudeFeatures")+ inp = group.createInput(collection(profiles), operation(operation_name))+ if args.get("direction", "positive") == "symmetric":+ require(inp.setSymmetricExtent(q("distance"), True, quantity(design, args.get("taper", 0), "deg")), "invalid_extent", "Symmetric extrusion extent was refused.")+ else:+ extent = adsk.fusion.DistanceExtentDefinition.create(q("distance"))+ direction = getattr(adsk.fusion.ExtentDirections, "NegativeExtentDirection" if args.get("direction") == "negative" else "PositiveExtentDirection")+ require(inp.setOneSideExtent(extent, direction, quantity(design, args.get("taper", 0), "deg")), "invalid_extent", "Extrusion extent was refused.")+ if operation_name in ("cut", "intersect"):+ inp.participantBodies = select("bodies", ("BRepBody",))+ elif kind == "revolve":+ profiles = select("profiles", ("Profile",))+ group = factory(features, "revolveFeatures")+ inp = group.createInput(collection(profiles), axis(design, value, comp, args["axis"]), operation(operation_name))+ require(inp.setAngleExtent(False, q("angle", "deg")), "invalid_extent", "Revolve angle was refused.")+ if operation_name in ("cut", "intersect"):+ inp.participantBodies = select("bodies", ("BRepBody",))+ elif kind == "fillet":+ group = factory(features, "filletFeatures")+ inp = group.createInput()+ inp.edgeSetInputs.addConstantRadiusEdgeSet(collection(select("edges", ("BRepEdge",))), q("radius"), args.get("tangentChain", False))+ elif kind == "chamfer":+ group = factory(features, "chamferFeatures")+ require(hasattr(group, "createInput2"), "unsupported_capability", "Modern chamfer input API unavailable.")+ inp = group.createInput2()+ inp.chamferEdgeSets.addEqualDistanceChamferEdgeSet(collection(select("edges", ("BRepEdge",))), q("distance"), args.get("tangentChain", False))+ elif kind == "shell":+ group = factory(features, "shellFeatures")+ inp = group.createInput(collection(select("faces", ("BRepFace",))), args.get("tangentChain", False))+ inp.insideThickness = q("thickness")+ elif kind == "hole":+ group = factory(features, "holeFeatures")+ inp = group.createSimpleInput(q("diameter"))+ require(inp.setPositionBySketchPoints(collection(select("points", ("SketchPoint",)))), "hole_position_failed", "Hole positions were refused.")+ require(inp.setDistanceExtent(q("depth")), "invalid_extent", "Hole depth was refused.")+ inp.participantBodies = select("bodies", ("BRepBody",))+ elif kind == "loft":+ group = factory(features, "loftFeatures")+ inp = group.createInput(operation(operation_name))+ profiles = select("profiles", ("Profile",))+ require(len(profiles) >= 2, "invalid_selection", "Loft requires at least two profiles.")+ for profile in profiles:+ inp.loftSections.add(profile)+ inp.isSolid = True+ if operation_name in ("cut", "intersect"):+ inp.participantBodies = select("bodies", ("BRepBody",))+ elif kind == "sweep":+ group = factory(features, "sweepFeatures")+ profiles = select("profiles", ("Profile",))+ require(len(profiles) == 1, "invalid_selection", "Sweep requires exactly one profile.")+ path = adsk.fusion.Path.create(collection(select("path", ("SketchLine", "SketchArc", "SketchFittedSpline", "BRepEdge"))), adsk.fusion.ChainedCurveOptions.noChainedCurves)+ require(path is not None, "invalid_path", "Sweep path must form a connected curve chain.")+ inp = group.createInput(profiles[0], path, operation(operation_name))+ if operation_name in ("cut", "intersect"):+ inp.participantBodies = select("bodies", ("BRepBody",))+ elif kind == "combine":+ group = factory(features, "combineFeatures")+ target_body = resolve(design, value, args["body"], ("BRepBody",))+ require(getattr(target_body, "assemblyContext", None) is None, "definition_reference_required", "Combine requires a native target body reference.")+ require(same(owner(target_body), comp), "wrong_component", "Target body is in another component.")+ tools = select("tools", ("BRepBody",))+ require(not any(same(target_body, tool) for tool in tools), "invalid_selection", "Target cannot also be a tool body.")+ inp = group.createInput(target_body, collection(tools))+ require(operation_name in ("join", "cut", "intersect"), "invalid_input", "Combine operation must be join, cut or intersect.")+ inp.operation = operation(operation_name)+ inp.isKeepToolBodies = args.get("keepTools", True)+ elif kind == "split":+ group = factory(features, "splitBodyFeatures")+ bodies = select("bodies", ("BRepBody",))+ require(len(bodies) == 1, "invalid_selection", "Split requires one body.")+ tool = plane(design, value, comp, args["plane"])+ inp = group.createInput(bodies[0], tool, args.get("extend", True))+ elif kind == "move":+ group = factory(features, "moveFeatures")+ require(hasattr(group, "createInput2"), "unsupported_capability", "Modern move input API unavailable.")+ inp = group.createInput2(collection(select("bodies", ("BRepBody",))))+ matrix = adsk.core.Matrix3D.create()+ if args.get("angle", 0):+ vector = args.get("axis", [0, 0, 1])+ rotation_axis = adsk.core.Vector3D.create(*vector)+ require(rotation_axis.length > 1e-9, "invalid_input", "Rotation axis must be nonzero.")+ angle_value = design.unitsManager.evaluateExpression(str(args["angle"]) + " deg", "deg")+ require(matrix.setToRotation(angle_value, rotation_axis, point(args.get("origin", [0, 0, 0]))), "invalid_transform", "Rotation matrix creation failed.")+ translation = point(args.get("translation", [0, 0, 0]))+ existing = matrix.translation+ matrix.translation = adsk.core.Vector3D.create(existing.x + translation.x, existing.y + translation.y, existing.z + translation.z)+ require(inp.defineAsFreeMove(matrix), "invalid_transform", "Move transform was refused.")+ elif kind == "mirror":+ group = factory(features, "mirrorFeatures")+ inp = group.createInput(collection(select("bodies", ("BRepBody",))), plane(design, value, comp, args["plane"]))+ inp.isCombine = False+ elif kind == "rectangular_pattern":+ if any(key in args for key in ("axis2", "count2", "spacing2")):+ require("count2" in args and "spacing2" in args, "invalid_input", "Second pattern direction requires count2 and spacing2; axis2 defaults to y.")+ group = factory(features, "rectangularPatternFeatures")+ inp = group.createInput(collection(select("bodies", ("BRepBody",))), axis(design, value, comp, args["axis"]),+ q("count", ""), q("spacing"), adsk.fusion.PatternDistanceType.SpacingPatternDistanceType)+ inp.quantityTwo = quantity(design, 1, "", True)+ inp.isSymmetricInDirectionOne = False+ inp.isSymmetricInDirectionTwo = False+ if "count2" in args:+ require(inp.setDirectionTwo(axis(design, value, comp, args.get("axis2", "y")), q("count2", ""), q("spacing2")), "pattern_failed", "Second pattern direction was refused.")+ elif kind == "circular_pattern":+ group = factory(features, "circularPatternFeatures")+ inp = group.createInput(collection(select("bodies", ("BRepBody",))), axis(design, value, comp, args["axis"]))+ inp.quantity = q("count", "")+ inp.totalAngle = quantity(design, args.get("angle", 360), "deg", True)+ inp.isSymmetric = False+ elif kind == "draft":+ group = factory(features, "draftFeatures")+ inp = group.createInput(select("faces", ("BRepFace",)), plane(design, value, comp, args["plane"]), args.get("tangentChain", False))+ require(inp.setSingleAngle(False, q("angle", "deg", False)), "draft_failed", "Draft angle was refused.")+ elif kind == "thread":+ group = factory(features, "threadFeatures")+ create_info = getattr(getattr(adsk.fusion, "ThreadInfo", None), "create", None)+ require(callable(create_info), "unsupported_capability", "ThreadInfo.create is unavailable.")+ info = create_info(False, args["internal"], args["threadType"], args["designation"], args["threadClass"], True)+ require(info is not None, "invalid_thread", "Requested thread standard/designation/class is unavailable.")+ inp = group.createInput(collection(select("faces", ("BRepFace",))), info)+ inp.isModeled = args.get("modeled", False)+ inp.isFullLength = True+ else:+ require(False, "unsupported_feature", "This feature type is not supported.")+ feature = named(group.add(inp), args)+ return lambda fresh: {"feature": feature_data(feature, fresh),+ "bodies": [topology_data(body, fresh) for body in items(feature.bodies)]}+++def feature_edit(design, value, args):+ require(any(key in args for key in ("name", "suppressed", "parameters")), "invalid_input", "Specify a feature property to edit.")+ feature = resolve(design, value, args["feature"])+ timeline = getattr(feature, "timelineObject", None)+ require(timeline is not None, "wrong_entity_type", "Feature must have a timeline object.")+ if "name" in args:+ feature.name = args["name"]+ if "suppressed" in args:+ timeline.isSuppressed = args["suppressed"]+ for name, expression in args.get("parameters", {}).items():+ parameter = design.allParameters.itemByName(name)+ require(parameter is not None and same(getattr(parameter, "createdBy", None), feature), "wrong_parameter", "Parameter is not owned by this feature: " + name)+ require(design.unitsManager.isValidExpression(expression, parameter.unit), "invalid_expression", "Invalid parameter expression.")+ parameter.expression = expression+ return lambda fresh: {"feature": feature_data(feature, fresh)}+++def entity_delete(design, value, args):+ entity = resolve(design, value, args["entity"])+ kind = entity.objectType.split("::")[-1]+ require(kind in ("Sketch", "SketchLine", "SketchCircle", "SketchArc", "SketchPoint", "SketchFittedSpline", "ConstructionPlane") or kind.endswith("Feature"),+ "unsupported_delete", "Delete supports sketches, sketch geometry, construction planes and timeline features.")+ description = {"name": getattr(entity, "name", None), "type": entity.objectType}+ timeline = getattr(entity, "timelineObject", None)+ if timeline:+ require(timeline.isDeletable, "delete_refused", "Fusion reports this timeline entity cannot be deleted independently.")+ require(timeline.deleteObject(), "delete_failed", "Feature deletion failed.")+ else:+ require(entity.deleteMe(), "delete_failed", "Entity deletion failed.")+ return {"deleted": description}+++def parameter_batch(design, value, args):+ changed = []+ for change in args["changes"]:+ name, action = change["name"], change["action"]+ parameter = design.allParameters.itemByName(name)+ if action == "create":+ require(parameter is None, "parameter_exists", "Parameter exists: " + name)+ parameter = design.userParameters.add(name, quantity(design, change["expression"], change["unit"]), change["unit"], change.get("comment", ""))+ require(parameter is not None, "parameter_create_failed", "Parameter creation failed.")+ else:+ require(parameter is not None, "parameter_missing", "Parameter not found: " + name)+ if action == "delete":+ user = design.userParameters.itemByName(name)+ require(user is not None, "delete_refused", "Only user parameters can be deleted.")+ require(user.deleteMe(), "delete_refused", "Parameter is in use or cannot be deleted.")+ changed.append({"name": name, "deleted": True})+ continue+ expression = change["expression"]+ require(design.unitsManager.isValidExpression(expression, parameter.unit), "invalid_expression", "Invalid expression for " + name)+ parameter.expression = expression+ changed.append(parameter_data(design, parameter))+ return {"parameters": changed}+++OPERATIONS = {"feature_create": feature_create, "feature_edit": feature_edit,+ "entity_delete": entity_delete, "parameter_batch": parameter_batch}
addin/AdomBridge/commands/mechanical/operations.pyadded+219@@ -0,0 +1,219 @@+"""Typed mechanical operations. Add new operations here behind shared guards."""+import re++import adsk.core+import adsk.fusion++from .core import (MechanicalError, active, body_data, current_target, health,+ identity, items, number, parameter_data, recovery_snapshot,+ ref, require, require_healthy, resolve, target, UNITS)+from .exporting import export_design+++def inspect(app, args):+ from .assembly_state import metadata, joint_data, rigid_group_data+ doc, design, key = active(app)+ value = target(app, args)[2] if args.get("target") else current_target(app)+ bodies, components, occurrences, sketches, features = [], [], [], [], []+ for comp in items(design.allComponents):+ components.append({"id": identity(comp), **metadata(comp), "ref": ref(comp, value),+ "bodyCount": comp.bRepBodies.count, "sketchCount": comp.sketches.count})+ for body in items(comp.bRepBodies):+ row = body_data(body)+ row.update({"ref": ref(body, value), "componentId": identity(comp)})+ bodies.append(row)+ for sketch in items(comp.sketches):+ sketches.append({"ref": ref(sketch, value), "name": sketch.name, "componentId": identity(comp),+ "profileCount": sketch.profiles.count, "fullyConstrained": sketch.isFullyConstrained})+ for index, feature in enumerate(items(comp.features)):+ from .readback import feature_data+ features.append(feature_data(feature, value, order=index))+ for occ in items(design.rootComponent.allOccurrences):+ matrix = list(occ.transform2.asArray())+ # Matrix4x4.asArray is row-major; translation lies at 3,7,11.+ for i in (3, 7, 11):+ matrix[i] *= 10+ occurrences.append({"ref": ref(occ, value), "componentId": identity(occ.component),+ "path": occ.fullPathName, "transform": matrix,+ "transformLayout": "row-major", "translationUnit": "mm",+ "space": "root", "grounded": occ.isGrounded})+ return {"target": value, "document": {"name": doc.name, "creationId": doc.creationId,+ "saved": doc.isSaved}, "designIntent": str(getattr(design, "designIntent", "unavailable")),+ "units": UNITS, "components": components, "bodies": bodies, "occurrences": occurrences,+ "sketches": sketches, "features": features,+ "joints": [joint_data(j, value) for comp in items(design.allComponents)+ for name in ("joints", "asBuiltJoints") for j in items(getattr(comp, name))],+ "rigidGroups": [rigid_group_data(g, value) for comp in items(design.allComponents) for g in items(comp.rigidGroups)],+ "parameters": [parameter_data(design, p) for p in items(design.allParameters)],+ "health": health(design), "complete": True}+++def inspect_entity(app, args):+ _, design, value = target(app, args)+ entity = resolve(design, value, args.get("entity"))+ result = {"ref": ref(entity, value), "objectType": entity.objectType, "name": getattr(entity, "name", None)}+ if entity.objectType.endswith("::BRepBody"):+ from .readback import topology_data+ result.update(topology_data(entity, value))+ result["space"] = "assembly_context" if args["entity"].get("occurrenceToken") else "component"+ result["faceRefs"] = [ref(f, value) for f in items(entity.faces)]+ result["edgeRefs"] = [ref(e, value) for e in items(entity.edges)]+ elif entity.objectType.endswith("::Sketch"):+ from .readback import sketch_data+ result.update(sketch_data(entity, value))+ elif entity.objectType.endswith("::Occurrence"):+ result["bodyRefs"] = [ref(b, value, entity) for b in items(entity.component.bRepBodies)]+ result["childRefs"] = [ref(o, value) for o in items(entity.childOccurrences)]+ elif entity.objectType.endswith(("::AsBuiltJoint", "::Joint")):+ from .assembly_state import joint_data+ result.update(joint_data(entity, value))+ elif entity.objectType.endswith("::Component"):+ from .assembly_state import metadata+ result.update(metadata(entity))+ elif entity.objectType.endswith("::RigidGroup"):+ from .assembly_state import rigid_group_data+ result.update(rigid_group_data(entity, value))+ return {"target": value, "entity": result}+++def new_design(app, args):+ name = args.get("name", "Adom mechanical")+ require(isinstance(name, str) and 0 < len(name) <= 120, "invalid_input", "name must be 1..120 characters.")+ box = args.get("box")+ if box is not None:+ require(isinstance(box, dict), "invalid_input", "box must contain width, height and depth in mm.")+ dims = [number(box.get(n), n, positive=True) for n in ("width", "height", "depth")]+ previous = app.activeDocument+ doc = None+ try:+ doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)+ require(doc is not None, "create_failed", "Fusion did not create a document.")+ design = adsk.fusion.Design.cast(doc.products.itemByProductType("DesignProductType"))+ require(design is not None, "create_failed", "Created document has no Design product.")+ design.designType = adsk.fusion.DesignTypes.ParametricDesignType+ from . import transactions+ if not transactions.capability()["verified"]:+ transactions.probe(app, {"target": current_target(app)})+ if box is not None:+ create_box(design, dims)+ require_healthy(design)+ # Naming a never-saved Fusion document makes close(False) capable of+ # raising a save dialog. Keep the scratch document unnamed and store the+ # requested label as model metadata until an explicit save operation.+ design.rootComponent.attributes.add("AdomMechanical", "requestedName", name)+ result = inspect(app, {})+ result["document"]["requestedName"] = name+ return result+ except Exception as exc:+ recovery = {"strategy": "discard_new_unsaved_document", "verified": False}+ if doc is not None:+ try:+ require(not doc.isSaved, "recovery_refused", "New document unexpectedly saved.")+ require(doc.name.lower().startswith("untitled"), "recovery_refused", "Document was renamed; refusing a close that could prompt.")+ doc.close(False)+ recovery["verified"] = not doc.isValid+ if previous and previous.isValid:+ previous.activate()+ except Exception as close_error:+ recovery["error"] = str(close_error)+ raise MechanicalError("create_failed", str(exc), recovery=recovery)+++def create_box(design, dimensions):+ root = design.rootComponent+ for name, value in zip(("width", "height", "depth"), dimensions):+ design.userParameters.add(name, adsk.core.ValueInput.createByString(str(value) + " mm"), "mm", "Adom driving dimension")+ width, height, _ = [n / 10 for n in dimensions]+ sketch = root.sketches.add(root.xYConstructionPlane)+ sketch.name = "Base rectangle"+ origin = adsk.core.Point3D.create(0, 0, 0)+ lines = sketch.sketchCurves.sketchLines.addTwoPointRectangle(origin, adsk.core.Point3D.create(width, height, 0))+ first = lines.item(0)+ second = lines.item(1)+ orient = adsk.fusion.DimensionOrientations+ sx = sketch.sketchDimensions.addDistanceDimension(first.startSketchPoint, first.endSketchPoint,+ orient.HorizontalDimensionOrientation, adsk.core.Point3D.create(width / 2, -height / 3, 0))+ sy = sketch.sketchDimensions.addDistanceDimension(second.startSketchPoint, second.endSketchPoint,+ orient.VerticalDimensionOrientation, adsk.core.Point3D.create(width * 1.3, height / 2, 0))+ sx.parameter.expression, sy.parameter.expression = "width", "height"+ # addTwoPointRectangle at the origin supplies the origin coincidence itself.+ feature_input = root.features.extrudeFeatures.createInput(sketch.profiles.item(0), adsk.fusion.FeatureOperations.NewBodyFeatureOperation)+ extent = adsk.fusion.DistanceExtentDefinition.create(adsk.core.ValueInput.createByString("depth"))+ feature_input.setOneSideExtent(extent, adsk.fusion.ExtentDirections.PositiveExtentDirection)+ feature = root.features.extrudeFeatures.add(feature_input)+ feature.name = "Base extrusion"+ feature.bodies.item(0).name = "Block"+++def parameter_set(app, args):+ _, design, before_target = target(app, args, True)+ require_healthy(design, False)+ name, expression = args.get("name"), args.get("expression")+ require(isinstance(name, str) and isinstance(expression, str) and expression.strip(), "invalid_input", "name and expression are required strings.")+ parameter = design.allParameters.itemByName(name)+ require(parameter is not None, "parameter_missing", "No parameter named " + name)+ require(design.unitsManager.isValidExpression(expression, parameter.unit), "invalid_expression", "Expression is invalid for the parameter's unit.")+ before, old = recovery_snapshot(design), parameter.expression+ try:+ parameter.expression = expression+ state = require_healthy(design)+ except Exception as exc:+ recovery = {"strategy": "restore_parameter_expression", "verified": False,+ "scope": "parameter expressions, body metrics, occurrence transforms, counts and health"}+ try:+ parameter.expression = old+ require_healthy(design)+ recovery["verified"] = recovery_snapshot(design) == before+ except Exception as restore_error:+ recovery["error"] = str(restore_error)+ raise MechanicalError("parameter_edit_failed", str(exc), recovery=recovery, target=current_target(app))+ return {"target": current_target(app), "parameter": parameter_data(design, parameter),+ "health": state, "recoveryStrategy": "restore_parameter_expression", "transactional": False}+++def parameter_create(app, args):+ _, design, _ = target(app, args, True)+ require_healthy(design, False)+ name, expression, unit = args.get("name"), args.get("expression"), args.get("unit")+ require(isinstance(name, str) and re.fullmatch(r"[A-Za-z][A-Za-z0-9_]{0,63}", name), "invalid_input", "Use a short parameter identifier.")+ require(unit in ("mm", "deg", "kg", ""), "invalid_input", "unit must be mm, deg, kg or empty for unitless.")+ require(isinstance(expression, str) and design.unitsManager.isValidExpression(expression, unit), "invalid_expression", "Expression must match the declared unit.")+ require(design.allParameters.itemByName(name) is None, "parameter_exists", "Parameter already exists.")+ before = recovery_snapshot(design)+ parameter = None+ try:+ parameter = design.userParameters.add(name, adsk.core.ValueInput.createByString(expression), unit, args.get("comment", ""))+ require(parameter is not None, "parameter_create_failed", "Fusion returned no parameter.")+ state = require_healthy(design)+ except Exception as exc:+ recovery = {"strategy": "delete_created_parameter", "verified": False}+ try:+ created = parameter or design.userParameters.itemByName(name)+ if created:+ created.deleteMe()+ require_healthy(design)+ recovery["verified"] = recovery_snapshot(design) == before+ except Exception as restore_error:+ recovery["error"] = str(restore_error)+ raise MechanicalError("parameter_create_failed", str(exc), recovery=recovery)+ return {"target": current_target(app), "parameter": parameter_data(design, parameter), "health": state, "transactional": False}+++def check_health(app, args):+ _, design, _ = target(app, args, args.get("recompute", False))+ state = health(design, args.get("recompute", False))+ return {"target": current_target(app), "health": state}+++def export(app, args):+ _, design, value = target(app, args, True)+ require_healthy(design, False)+ result = export_design(design, args)+ result["target"] = value+ return result+++OPERATIONS = {"inspect": inspect, "inspect_entity": inspect_entity, "new_design": new_design,+ "parameter_set": parameter_set, "parameter_create": parameter_create,+ "health": check_health, "export": export}+WRITES = {"new_design", "parameter_set", "parameter_create", "export"}
addin/AdomBridge/commands/mechanical/purchased.pyadded+137@@ -0,0 +1,137 @@+"""Local supplier CAD ingestion and Fusion's native McMaster command."""+import hashlib+from pathlib import Path+from urllib.parse import urlparse++import adsk.core++from . import transactions+from .assemblies import apply_metadata, created_occurrence_result, hybrid, parent_component, place_created_occurrence, transform+from .assembly_state import metadata+from .core import MechanicalError, active, current_target, items, ref, require, resolve, target++MCM_COMMAND = "InsertMcMasterCarrComponentCommand"+++def file_hash(path):+ result = hashlib.sha256()+ with path.open("rb") as stream:+ for block in iter(lambda: stream.read(1024 * 1024), b""):+ result.update(block)+ return result.hexdigest()+++def preflight_file(args):+ path = Path(args["filename"])+ require(path.is_absolute() and path.is_file() and not path.is_symlink(), "invalid_source", "Supplier CAD must be an absolute regular local file.")+ require(path.suffix.lower() in (".step", ".stp", ".sat"), "unsupported_format", "Local supplier ingestion supports STEP and SAT.")+ require(0 < path.stat().st_size <= 512 * 1024 * 1024, "invalid_source", "Supplier CAD must be nonempty and no larger than 512 MiB.")+ provenance = args["provenance"]+ url = urlparse(provenance["sourceUrl"])+ require(url.scheme == "https" and url.hostname and not url.username and not url.password, "invalid_provenance", "sourceUrl must be an HTTPS supplier URL without credentials.")+ if provenance["supplier"].lower() in ("mcmaster", "mcmaster-carr"):+ require(url.hostname.lower() == "mcmaster.com" or url.hostname.lower().endswith(".mcmaster.com"), "invalid_provenance", "McMaster provenance must use the supplier's domain.")+ sha = file_hash(path)+ if "sha256" in args:+ require(args["sha256"].lower() == sha, "source_hash_mismatch", "Downloaded CAD does not match the expected SHA-256.")+ return path, sha+++def cad_import(app, args):+ # Source preflight runs before any transaction/model mutation. The importer+ # only reads this file; no cloud upload, browser download or file rewrite.+ target(app, args, True)+ path, sha = preflight_file(args)+ document_count = app.documents.count+ manager = app.importManager+ factory = manager.createSATImportOptions if path.suffix.lower() == ".sat" else manager.createSTEPImportOptions+ options = factory(str(path))+ require(options is not None, "import_unavailable", "Fusion refused import options.")+ options.isViewFit = False++ def mutate(design, value, request):+ hybrid(design)+ parent = parent_component(design, value, request)+ expected = transform(request.get("transform"))+ occurrence = parent.occurrences.addNewComponent(expected)+ require(occurrence is not None, "import_failed", "Could not create import wrapper component.")+ comp = occurrence.component+ comp.name = request.get("name", path.stem)+ imported = manager.importToTarget2(options, comp)+ require(imported is not None and imported.count > 0, "import_failed", "Fusion returned no imported objects.")+ require(app.documents.count == document_count, "import_document_side_effect", "Importer changed the document set; inspect documents before continuing.")+ components = [comp] + [o.component for o in items(comp.allOccurrences)]+ require(any(c.bRepBodies.count for c in components), "import_empty", "Imported CAD contains no BRep bodies.")+ require(file_hash(path) == sha, "source_changed", "Supplier CAD changed while import was running.")+ provenance = {**request["provenance"], "sourceFile": str(path), "sha256": sha,+ "asPurchased": request.get("asPurchased", True), "partNumber": request["provenance"]["supplierPartNumber"]}+ apply_metadata(comp, provenance)+ captured = place_created_occurrence(design, parent, occurrence, expected)+ return lambda fresh: {**created_occurrence_result(design, parent, occurrence, fresh, expected), "positionCaptured": captured,+ "source": {"filename": str(path), "sha256": sha},+ "importedObjectCount": imported.count, "externalEffects": "read-only source file; no cloud or document creation requested"}+ try:+ return transactions.execute(app, args, mutate)+ except MechanicalError as exc:+ exc.details["sourceFileModified"] = False+ exc.details["documentSetUnchanged"] = app.documents.count == document_count+ raise+++def mcmaster_discover(app, args):+ _, design, _ = active(app)+ command = app.userInterface.commandDefinitions.itemById(MCM_COMMAND)+ return {"target": current_target(app), "commandId": MCM_COMMAND, "available": command is not None,+ "name": command.name if command else None, "designIntent": str(getattr(design, "designIntent", "unavailable")),+ "requirements": ["Hybrid design", "online supplier access", "interactive selection and download"],+ "downloadedCadAlternative": "cad_import with local STEP/SAT and supplier provenance"}+++def mcmaster_open(app, args):+ _, design, value = target(app, args, True)+ hybrid(design)+ command = app.userInterface.commandDefinitions.itemById(MCM_COMMAND)+ require(command is not None, "mcmaster_unavailable", "Fusion's native McMaster command is not installed.")+ require(command.execute(), "mcmaster_launch_failed", "Fusion refused the native McMaster command.")+ return {"commandId": MCM_COMMAND, "launchRequested": True, "targetAtLaunch": value,+ "completion": "interactive; inspect after inserting or cancelling", "refreshRequired": True,+ "transactional": False, "recovery": "native command controls its own user interaction"}+++def material_list(app, args):+ _, design, value = target(app, args)+ libraries = [{"id": library.id, "name": library.name, "count": library.materials.count} for library in items(app.materialLibraries)]+ source = design.materials+ if args.get("libraryId"):+ matches = [lib for lib in items(app.materialLibraries) if lib.id == args["libraryId"]]+ require(len(matches) == 1, "material_library_missing", "Material library ID must identify one loaded library.")+ source = matches[0].materials+ query = args.get("query", "").lower()+ rows = [{"id": material.id, "name": material.name} for material in items(source) if query in material.name.lower()]+ limit = args.get("limit", 100)+ return {"target": value, "libraries": libraries, "materials": rows[:limit], "complete": len(rows) <= limit,+ "matchingCount": len(rows), "libraryId": args.get("libraryId")}+++def material_assign(app, args):+ def mutate(design, value, request):+ entity = resolve(design, value, request["entity"], ("Component", "BRepBody"))+ require(getattr(entity, "assemblyContext", None) is None, "definition_reference_required", "Material assignment affects a native component or body definition.")+ source = design.materials+ if request.get("libraryId"):+ matches = [lib for lib in items(app.materialLibraries) if lib.id == request["libraryId"]]+ require(len(matches) == 1, "material_library_missing", "Material library ID must identify one loaded library.")+ source = matches[0].materials+ material = source.itemById(request["materialId"])+ require(material is not None, "material_missing", "Material ID was not found in the selected source.")+ entity.material = material+ def result(fresh):+ require(entity.material is not None and entity.material.id == material.id, "material_failed", "Assigned material ID did not read back; same display names are not material identity.")+ return {"entity": ref(entity, fresh), "material": {"id": entity.material.id, "name": entity.material.name}}+ return result+ return transactions.execute(app, args, mutate)+++OPERATIONS = {"cad_import": cad_import, "mcmaster_open": mcmaster_open, "material_assign": material_assign,+ "mcmaster_discover": mcmaster_discover, "material_list": material_list}+WRITES = {"cad_import", "mcmaster_open", "material_assign"}
addin/AdomBridge/commands/mechanical/readback.pyadded+119@@ -0,0 +1,119 @@+"""Detailed topology and sketch readback using resolvable guarded references."""+import json+from .core import body_data, digest, items, point_mm, ref, require, same+++def geometry_data(geometry):+ result = {"type": geometry.objectType}+ for name in ("startPoint", "endPoint", "center", "origin"):+ if hasattr(geometry, name):+ result[name] = point_mm(getattr(geometry, name))+ for name in ("normal", "direction", "majorAxis", "minorAxis"):+ if hasattr(geometry, name):+ p = getattr(geometry, name)+ result[name] = [p.x, p.y, p.z]+ for name in ("radius", "majorRadius", "minorRadius"):+ if hasattr(geometry, name):+ result[name] = getattr(geometry, name) * 10+ return result+++def edge_geometry_data(edge):+ geometry = edge.geometry+ if geometry is not None:+ return geometry_data(geometry)+ require(edge.isDegenerate, "unavailable_geometry", "Nondegenerate BRep edge has no readable curve geometry.")+ vertices = [point_mm(vertex.geometry) for vertex in (edge.startVertex, edge.endVertex) if vertex is not None]+ require(vertices, "unavailable_geometry", "Degenerate BRep edge has no readable vertex position.")+ return {"type": "degenerate", "isDegenerate": True, "vertices": vertices}+++def profile_signature(profile):+ props = profile.areaProperties()+ return {"area": props.area * 100, "centroid": point_mm(props.centroid), "loops": profile.profileLoops.count}+++def profile_ref(sketch, profile, index, value):+ return {**value, "objectType": "adsk::fusion::Profile", "sketchToken": sketch.entityToken,+ "profileIndex": index, "fingerprint": digest(profile_signature(profile))}+++def curve_data(curve, value=None):+ result = {"type": curve.objectType, "construction": curve.isConstruction,+ "fixed": curve.isFixed, "geometry": geometry_data(curve.geometry)}+ if value:+ result["ref"] = ref(curve, value)+ for name in ("startSketchPoint", "endSketchPoint", "centerSketchPoint"):+ if hasattr(curve, name):+ point = getattr(curve, name)+ result[name] = {"position": point_mm(point.geometry)}+ if value:+ result[name]["ref"] = ref(point, value)+ if hasattr(curve, "fitPoints"):+ result["fitPoints"] = [point_mm(p.geometry) for p in items(curve.fitPoints)]+ return result+++def sketch_data(sketch, value=None):+ result = {"name": sketch.name, "space": "sketch", "lengthUnit": "mm",+ "fullyConstrained": sketch.isFullyConstrained,+ "curves": [curve_data(curve, value) for curve in items(sketch.sketchCurves)],+ "points": [{"position": point_mm(p.geometry), "fixed": p.isFixed, **({"ref": ref(p, value)} if value else {})}+ for p in items(sketch.sketchPoints)],+ "constraints": [{"type": constraint.objectType} for constraint in items(sketch.geometricConstraints)],+ "dimensions": [{"type": dimension.objectType, "name": dimension.parameter.name,+ "expression": dimension.parameter.expression, "driving": dimension.isDriving}+ for dimension in items(sketch.sketchDimensions)]}+ if value:+ result["ref"] = ref(sketch, value)+ result["originRef"] = ref(sketch.originPoint, value)+ result["profiles"] = [{**profile_signature(profile), "ref": profile_ref(sketch, profile, index, value)}+ for index, profile in enumerate(items(sketch.profiles))]+ return result+++def topology_data(body, value):+ result = body_data(body)+ result["ref"] = ref(body, value)+ result["faces"] = [{"ref": ref(face, value), "area": face.area * 100,+ "point": point_mm(face.pointOnFace), "surface": geometry_data(face.geometry),+ "edges": [ref(edge, value) for edge in items(face.edges)]}+ for face in items(body.faces)]+ result["edges"] = [{"ref": ref(edge, value), "length": edge.length * 10,+ "curve": edge_geometry_data(edge)} for edge in items(body.edges)]+ return result+++def topology_witness(body):+ result = body_data(body)+ # Compare geometry rather than revision or transient topology IDs after undo.+ result["faceGeometry"] = sorted([+ {"area": f.area * 100, "point": point_mm(f.pointOnFace), "surface": geometry_data(f.geometry)}+ for f in items(body.faces)], key=lambda row: json.dumps(row, sort_keys=True))+ result["edgeGeometry"] = sorted([+ {"length": e.length * 10, "curve": edge_geometry_data(e)} for e in items(body.edges)],+ key=lambda row: json.dumps(row, sort_keys=True))+ return result+++def feature_data(feature, value=None, order=None):+ result = {"name": feature.name, "type": feature.objectType}+ if order is not None:+ result["componentFeatureOrder"] = order+ if value:+ result["ref"] = ref(feature, value)+ timeline = getattr(feature, "timelineObject", None)+ if timeline:+ result["suppressed"] = timeline.isSuppressed+ try:+ result["index"] = timeline.index+ except RuntimeError as exc:+ # Imported/native grouped features can have a valid timeline object+ # whose index getter rejects its documented non-indexed position.+ # Only this known getter failure is optional; retain name, type,+ # suppression and component collection order in semantic witnesses.+ if "InternalValidationError : res >= 0" not in str(exc):+ raise+ require(timeline.isValid, "invalid_timeline", "Feature timeline object is no longer valid.")+ result.update(index=None, indexUnavailable="native_timeline_position_unavailable")+ return result
addin/AdomBridge/commands/mechanical/schema.jsonadded+4880@@ -0,0 +1,4880 @@+{+ "inspect": {+ "type": "object",+ "required": [+ "op"+ ],+ "properties": {},+ "description": "Inspect the active Design without mutation. Returns target identity/revision, native component-space bodies and occurrence transforms, parameters and feature health."+ },+ "inspect_entity": {+ "type": "object",+ "required": [+ "op",+ "target",+ "entity"+ ],+ "properties": {+ "entity": {+ "type": "object",+ "description": "Exact reference returned by inspect; resolves uniquely with document/revision/type/occurrence guards."+ }+ }+ },+ "new_design": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "operationId"+ ],+ "properties": {+ "name": {+ "type": "string"+ },+ "box": {+ "type": "object",+ "required": [+ "width",+ "height",+ "depth"+ ],+ "additionalProperties": false,+ "properties": {+ "width": {+ "type": "number",+ "exclusiveMinimum": 0+ },+ "height": {+ "type": "number",+ "exclusiveMinimum": 0+ },+ "depth": {+ "type": "number",+ "exclusiveMinimum": 0+ }+ }+ }+ },+ "description": "Create an unnamed unsaved parametric hybrid Design; name is retained as requestedName metadata to keep failure recovery free of save dialogs. Optional box dimensions in mm create a driving-parameter fixture. Never edits an existing document."+ },+ "parameter_set": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "name",+ "expression"+ ],+ "properties": {+ "name": {+ "type": "string"+ },+ "expression": {+ "type": "string"+ }+ },+ "description": "Set an expression, recompute and inspect health. Failure restores old expression and reports a semantic recovery witness; not an atomic transaction."+ },+ "parameter_create": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "name",+ "expression",+ "unit"+ ],+ "properties": {+ "name": {+ "type": "string"+ },+ "expression": {+ "type": "string"+ },+ "unit": {+ "enum": [+ "mm",+ "deg",+ "kg",+ ""+ ]+ },+ "comment": {+ "type": "string"+ }+ }+ },+ "health": {+ "type": "object",+ "required": [+ "op",+ "target"+ ],+ "properties": {+ "recompute": {+ "type": "boolean",+ "default": false+ }+ },+ "description": "Read timeline warnings/errors. recompute:true also requires current target revision, sessionId and operationId."+ },+ "export": {+ "type": "object",+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "outputPath"+ ],+ "properties": {+ "format": {+ "enum": [+ "step",+ "stl",+ "3mf",+ "f3d",+ "iges",+ "sat",+ "smt",+ "usdz",+ "fbx",+ "skp"+ ],+ "default": "step"+ },+ "outputPath": {+ "type": "string"+ },+ "overwrite": {+ "type": "boolean",+ "default": false+ },+ "refinement": {+ "enum": [+ "low",+ "medium",+ "high"+ ],+ "default": "medium"+ }+ },+ "description": "Export entire design using runtime-checked API. Preflight and unique same-filesystem staging preserve the destination on failure; publish only nonempty verified output. Availability differs by Fusion build. STL numeric coordinates use mm."+ },+ "transaction_probe": {+ "type": "object",+ "properties": {},+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target"+ ],+ "description": "Verify runtime PTransaction abort+commit using temporary user parameters, remove probe data and compare semantic restoration. Required once per running add-in session before feature/sketch/atomic-batch writes. Returns fresh target; inspect again for current references."+ },+ "sketch_create": {+ "type": "object",+ "properties": {+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target"+ ],+ "description": "Create a native component-definition sketch on an origin/construction plane or planar face. Coordinates in subsequent geometry are sketch-space mm."+ },+ "sketch_geometry": {+ "type": "object",+ "properties": {+ "sketch": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "items": {+ "type": "array",+ "items": {+ "oneOf": [+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "point"+ ]+ },+ "position": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ }+ },+ "required": [+ "type",+ "position"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "line"+ ]+ },+ "start": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "end": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "construction": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "start",+ "end"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "rectangle"+ ]+ },+ "start": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "end": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "construction": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "start",+ "end"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "circle"+ ]+ },+ "center": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "radius": {+ "type": "number",+ "exclusiveMinimum": 0+ },+ "construction": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "center",+ "radius"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "arc"+ ]+ },+ "center": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "start": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "sweep": {+ "type": "number"+ },+ "construction": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "center",+ "start",+ "sweep"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "polygon"+ ]+ },+ "center": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "radius": {+ "type": "number",+ "exclusiveMinimum": 0+ },+ "sides": {+ "type": "integer",+ "minimum": 3,+ "maximum": 128+ },+ "angle": {+ "type": "number"+ },+ "construction": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "center",+ "radius",+ "sides"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "slot"+ ]+ },+ "start": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "end": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "width": {+ "type": "number",+ "exclusiveMinimum": 0+ },+ "construction": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "start",+ "end",+ "width"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "spline"+ ]+ },+ "points": {+ "type": "array",+ "items": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "minItems": 2,+ "maxItems": 128+ },+ "closed": {+ "type": "boolean"+ },+ "construction": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "points"+ ],+ "additionalProperties": false+ }+ ]+ },+ "minItems": 1,+ "maxItems": 128+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "items"+ ],+ "description": "Create a transactionally grouped set of sketch primitives. Numeric geometry uses mm and arc sweeps/polygon angles use deg."+ },+ "sketch_constraint": {+ "type": "object",+ "properties": {+ "sketch": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "type": {+ "enum": [+ "horizontal",+ "vertical",+ "coincident",+ "parallel",+ "perpendicular",+ "tangent",+ "equal",+ "concentric",+ "collinear",+ "midpoint",+ "symmetry",+ "fix"+ ]+ },+ "entities": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "type",+ "entities"+ ],+ "description": "Constrain entities in one sketch. midpoint order is point,line; symmetry order entity1,entity2,symmetryLine. fix sets one entity fixed."+ },+ "sketch_dimension": {+ "type": "object",+ "properties": {+ "sketch": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "type": {+ "enum": [+ "distance",+ "horizontal",+ "vertical",+ "radius",+ "diameter",+ "angle"+ ]+ },+ "entities": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "expression": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "position": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "parameterName": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "type",+ "entities",+ "expression",+ "position"+ ],+ "description": "Add driving dimensions. Distance uses two point references; radius/diameter one curve; angle two lines. Numeric expressions use mm or deg."+ },+ "sketch_project": {+ "type": "object",+ "properties": {+ "sketch": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "entities": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "entities"+ ],+ "description": "Project selected topology into a sketch with Fusion associative projection."+ },+ "sketch_edit": {+ "type": "object",+ "properties": {+ "sketch": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "changes": {+ "type": "object",+ "properties": {+ "position": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "start": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "end": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "center": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "radius": {+ "type": "number"+ },+ "construction": {+ "type": "boolean"+ },+ "fixed": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "entity",+ "changes"+ ],+ "description": "Move sketch points/endpoints/centers in sketch-space mm, change radius or construction/fixed flags; solver failure aborts the operation."+ },+ "plane_create": {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "offset",+ "angle"+ ]+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "offset": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "type"+ ],+ "description": "Create offset plane (offset in mm) or angled plane around axis (angle in deg).",+ "oneOf": [+ {+ "type": "object",+ "required": [+ "type",+ "offset"+ ],+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ]+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "type": {+ "enum": [+ "offset"+ ]+ },+ "offset": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ }+ },+ "additionalProperties": false+ },+ {+ "type": "object",+ "required": [+ "type",+ "axis",+ "angle"+ ],+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ]+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "type": {+ "enum": [+ "angle"+ ]+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ }+ },+ "additionalProperties": false+ }+ ]+ },+ "feature_create": {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "extrude",+ "revolve",+ "fillet",+ "chamfer",+ "shell",+ "hole",+ "loft",+ "sweep",+ "combine",+ "split",+ "move",+ "mirror",+ "rectangular_pattern",+ "circular_pattern",+ "draft",+ "thread"+ ]+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "profiles": {},+ "distance": {},+ "direction": {},+ "taper": {},+ "bodies": {},+ "operation": {},+ "axis": {},+ "angle": {},+ "edges": {},+ "radius": {},+ "tangentChain": {},+ "faces": {},+ "thickness": {},+ "points": {},+ "diameter": {},+ "depth": {},+ "path": {},+ "body": {},+ "tools": {},+ "keepTools": {},+ "plane": {},+ "extend": {},+ "translation": {},+ "origin": {},+ "count": {},+ "spacing": {},+ "axis2": {},+ "count2": {},+ "spacing2": {},+ "internal": {},+ "threadType": {},+ "designation": {},+ "threadClass": {},+ "modeled": {}+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "type"+ ],+ "description": "Create a typed native solid feature. All length quantities are mm (or expressions), angles deg. Cut/intersect require explicit participant bodies. Join needs a single existing component body; combine selects multiple bodies explicitly. Feature availability is runtime-checked; missing APIs fail before commit.",+ "oneOf": [+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "extrude"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "profiles": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "distance": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "direction": {+ "enum": [+ "positive",+ "negative",+ "symmetric"+ ]+ },+ "taper": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ }+ },+ "required": [+ "type",+ "profiles",+ "distance"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "revolve"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "profiles": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ }+ },+ "required": [+ "type",+ "profiles",+ "axis",+ "angle"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "fillet"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "edges": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "radius": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "tangentChain": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "edges",+ "radius"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "chamfer"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "edges": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "distance": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "tangentChain": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "edges",+ "distance"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "shell"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "faces": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "thickness": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "tangentChain": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "faces",+ "thickness"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "hole"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "points": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "diameter": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "depth": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ }+ },+ "required": [+ "type",+ "points",+ "diameter",+ "depth",+ "bodies"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "loft"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "profiles": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ }+ },+ "required": [+ "type",+ "profiles"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "sweep"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "profiles": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "path": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ }+ },+ "required": [+ "type",+ "profiles",+ "path"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "combine"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "body": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "tools": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "operation": {+ "enum": [+ "join",+ "cut",+ "intersect"+ ]+ },+ "keepTools": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "body",+ "tools",+ "operation"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "split"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "extend": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "bodies",+ "plane"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "move"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "translation": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ },+ "axis": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "angle": {+ "type": "number"+ },+ "origin": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 2,+ "maxItems": 3+ }+ },+ "required": [+ "type",+ "bodies"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "mirror"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ }+ },+ "required": [+ "type",+ "bodies",+ "plane"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "rectangular_pattern"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "count": {+ "type": "integer",+ "minimum": 2,+ "maximum": 1000+ },+ "spacing": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "axis2": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "count2": {+ "type": "integer",+ "minimum": 1,+ "maximum": 1000+ },+ "spacing2": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ }+ },+ "required": [+ "type",+ "bodies",+ "axis",+ "count",+ "spacing"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "circular_pattern"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "bodies": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "count": {+ "type": "integer",+ "minimum": 2,+ "maximum": 1000+ },+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ }+ },+ "required": [+ "type",+ "bodies",+ "axis",+ "count"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "draft"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "faces": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ ]+ },+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "tangentChain": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "faces",+ "plane",+ "angle"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "thread"+ ]+ },+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object",+ "required": [+ "documentId",+ "revision"+ ],+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "additionalProperties": false+ },+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "faces": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "minItems": 1,+ "maxItems": 256+ },+ "internal": {+ "type": "boolean"+ },+ "threadType": {+ "type": "string"+ },+ "designation": {+ "type": "string"+ },+ "threadClass": {+ "type": "string"+ },+ "modeled": {+ "type": "boolean"+ }+ },+ "required": [+ "type",+ "faces",+ "internal",+ "threadType",+ "designation",+ "threadClass"+ ],+ "additionalProperties": false+ }+ ]+ },+ "feature_edit": {+ "type": "object",+ "properties": {+ "feature": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "parameters": {+ "type": "object",+ "additionalProperties": {+ "type": "string"+ }+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "feature"+ ],+ "description": "Rename/suppress a feature or change expressions of model parameters whose createdBy is that exact feature; read health and abort on downstream errors."+ },+ "entity_delete": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring."+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "entity"+ ],+ "description": "Delete sketch geometry or independently deletable timeline features. Model transaction and semantic recovery cover downstream failures; document and external file deletion are excluded."+ },+ "parameter_batch": {+ "type": "object",+ "properties": {+ "changes": {+ "type": "array",+ "items": {+ "oneOf": [+ {+ "type": "object",+ "properties": {+ "action": {+ "enum": [+ "create"+ ]+ },+ "name": {+ "type": "string"+ },+ "expression": {+ "type": "string"+ },+ "unit": {+ "enum": [+ "mm",+ "deg",+ "kg",+ ""+ ]+ },+ "comment": {+ "type": "string"+ }+ },+ "required": [+ "action",+ "name",+ "expression",+ "unit"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "action": {+ "enum": [+ "set"+ ]+ },+ "name": {+ "type": "string"+ },+ "expression": {+ "type": "string"+ }+ },+ "required": [+ "action",+ "name",+ "expression"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "action": {+ "enum": [+ "delete"+ ]+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "action",+ "name"+ ],+ "additionalProperties": false+ }+ ]+ },+ "minItems": 1,+ "maxItems": 128+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "changes"+ ],+ "description": "Atomic sequential create/set/delete parameter edits with one recompute+health gate; delete supports user parameters only. Any failure aborts all edits and reports semantic recovery."+ },+ "component_create": {+ "type": "object",+ "properties": {+ "parent": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "transform": {+ "type": "object",+ "properties": {+ "position": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "axis": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "angle": {+ "type": "number"+ }+ },+ "required": [],+ "additionalProperties": false,+ "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context."+ },+ "metadata": {+ "type": "object",+ "properties": {+ "name": {+ "type": "string"+ },+ "partNumber": {+ "type": "string"+ },+ "description": {+ "type": "string"+ },+ "supplier": {+ "type": "string"+ },+ "supplierPartNumber": {+ "type": "string"+ },+ "sourceUrl": {+ "type": "string"+ },+ "asPurchased": {+ "type": "boolean"+ },+ "excludeFromBom": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "name"+ ],+ "description": "Create a native internal component and its first occurrence in a Hybrid design. parent is a component definition; edits to it affect every instance. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused."+ },+ "occurrence_insert": {+ "type": "object",+ "properties": {+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "parent": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "transform": {+ "type": "object",+ "properties": {+ "position": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "axis": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "angle": {+ "type": "number"+ }+ },+ "required": [],+ "additionalProperties": false,+ "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context."+ },+ "independentCopy": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "component"+ ],+ "description": "Insert another occurrence of an existing definition; independentCopy:true uses Paste New to create a separate definition. Nested placement is in parent component coordinates. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused."+ },+ "occurrence_update": {+ "type": "object",+ "properties": {+ "occurrence": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "transform": {+ "type": "object",+ "properties": {+ "position": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "axis": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "angle": {+ "type": "number"+ }+ },+ "required": [],+ "additionalProperties": false,+ "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context."+ },+ "grounded": {+ "type": "boolean"+ },+ "groundedToParent": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "occurrence"+ ],+ "description": "Set occurrence pose in its assembly context and capture position; explicit grounding/ungrounding. Grounded or constrained transforms fail with recovery."+ },+ "occurrence_delete": {+ "type": "object",+ "properties": {+ "occurrence": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "occurrence"+ ],+ "description": "Delete one selected occurrence through the shared transaction executor."+ },+ "component_metadata": {+ "type": "object",+ "properties": {+ "component": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "changes": {+ "type": "object",+ "properties": {+ "name": {+ "type": "string"+ },+ "partNumber": {+ "type": "string"+ },+ "description": {+ "type": "string"+ },+ "supplier": {+ "type": "string"+ },+ "supplierPartNumber": {+ "type": "string"+ },+ "sourceUrl": {+ "type": "string"+ },+ "asPurchased": {+ "type": "boolean"+ },+ "excludeFromBom": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "changes"+ ],+ "description": "Update component-definition name/part number/description and persistent supplier or BOM attributes. Shared occurrences all see this metadata."+ },+ "joint_create": {+ "type": "object",+ "properties": {+ "type": {+ "enum": [+ "rigid",+ "revolute",+ "slider",+ "cylindrical",+ "pin_slot",+ "planar",+ "ball"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "rotationLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "slideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rotationValue": {+ "type": "number"+ },+ "slideValue": {+ "type": "number"+ },+ "primarySlideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "primarySlideValue": {+ "type": "number"+ },+ "secondarySlideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "secondarySlideValue": {+ "type": "number"+ },+ "pitchLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "pitchValue": {+ "type": "number"+ },+ "rollLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rollValue": {+ "type": "number"+ },+ "yawLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "yawValue": {+ "type": "number"+ },+ "slideAxis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "type",+ "occurrenceOne",+ "occurrenceTwo"+ ],+ "description": "Create an as-built joint without moving occurrences. Non-rigid motion requires explicit joint geometry; x/y/z are joint-coordinate directions. Limits and drive values use mm/deg. Seven native motion types; ball uses joint Z pitch/X yaw; planar uses native primary slide direction reported on readback. Geometry-moving regular joint creation is not exposed.",+ "oneOf": [+ {+ "type": "object",+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "rigid"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ }+ },+ "required": [+ "type"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "revolute"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "rotationLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rotationValue": {+ "type": "number"+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "slider"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "slideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "slideValue": {+ "type": "number"+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "cylindrical"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "rotationLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rotationValue": {+ "type": "number"+ },+ "slideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "slideValue": {+ "type": "number"+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "pin_slot"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "slideAxis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "rotationLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rotationValue": {+ "type": "number"+ },+ "slideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "slideValue": {+ "type": "number"+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "planar"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "rotationLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rotationValue": {+ "type": "number"+ },+ "primarySlideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "primarySlideValue": {+ "type": "number"+ },+ "secondarySlideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "secondarySlideValue": {+ "type": "number"+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "additionalProperties": false+ },+ {+ "type": "object",+ "properties": {+ "op": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "ball"+ ]+ },+ "occurrenceOne": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "occurrenceTwo": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "geometry": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "additionalProperties": false+ },+ "pitchLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "pitchValue": {+ "type": "number"+ },+ "rollLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rollValue": {+ "type": "number"+ },+ "yawLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "yawValue": {+ "type": "number"+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "additionalProperties": false+ }+ ]+ },+ "joint_edit": {+ "type": "object",+ "properties": {+ "joint": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "rotationLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "slideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rotationValue": {+ "type": "number"+ },+ "slideValue": {+ "type": "number"+ },+ "primarySlideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "primarySlideValue": {+ "type": "number"+ },+ "secondarySlideLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "secondarySlideValue": {+ "type": "number"+ },+ "pitchLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "pitchValue": {+ "type": "number"+ },+ "rollLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "rollValue": {+ "type": "number"+ },+ "yawLimits": {+ "type": "object",+ "properties": {+ "minimum": {+ "type": "number"+ },+ "maximum": {+ "type": "number"+ },+ "rest": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "additionalProperties": false,+ "minProperties": 1+ },+ "yawValue": {+ "type": "number"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "joint"+ ],+ "description": "Edit joint name/suppression, enabled limits, rest and drive values; wrong motion type or out-of-limit values fail with recovery."+ },+ "joint_delete": {+ "type": "object",+ "properties": {+ "joint": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "joint"+ ],+ "description": "Delete one selected Joint or AsBuiltJoint with recovery verification."+ },+ "interference": {+ "type": "object",+ "properties": {+ "entities": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "minItems": 2,+ "maxItems": 256+ },+ "includeTouching": {+ "type": "boolean"+ },+ "volumeTolerance": {+ "type": "number",+ "minimum": 0+ }+ },+ "required": [+ "op",+ "target",+ "entities"+ ],+ "description": "Analyze root-context occurrences/body proxies; returns overlap volume mm3 or touching. Does not create interference bodies."+ },+ "bom": {+ "type": "object",+ "properties": {+ "explodePurchased": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "target"+ ],+ "description": "Structured component-definition and instance BOM; quantities by actual identity, root bodies plus nested children; purchased metadata collapses subtrees unless exploded. Physical mass includes all unsuppressed bodies exactly once per instance."+ },+ "bom_export": {+ "type": "object",+ "properties": {+ "filename": {+ "type": "string"+ },+ "overwrite": {+ "type": "boolean"+ },+ "explodePurchased": {+ "type": "boolean"+ },+ "mode": {+ "enum": [+ "flat",+ "structured"+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "filename"+ ],+ "description": "Export flat grouped purchasing rows or structured parent/path/depth instance rows and supplier provenance to CSV with exclusive/atomic publication. This external effect is separate from model transactions."+ },+ "cad_import": {+ "type": "object",+ "properties": {+ "filename": {+ "type": "string"+ },+ "sha256": {+ "type": "string"+ },+ "name": {+ "type": "string"+ },+ "parent": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "transform": {+ "type": "object",+ "properties": {+ "position": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "axis": {+ "type": "array",+ "items": {+ "type": "number"+ },+ "minItems": 3,+ "maxItems": 3+ },+ "angle": {+ "type": "number"+ }+ },+ "required": [],+ "additionalProperties": false,+ "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context."+ },+ "provenance": {+ "type": "object",+ "properties": {+ "supplier": {+ "type": "string"+ },+ "supplierPartNumber": {+ "type": "string"+ },+ "sourceUrl": {+ "type": "string"+ },+ "description": {+ "type": "string"+ }+ },+ "required": [+ "supplier",+ "supplierPartNumber",+ "sourceUrl"+ ],+ "additionalProperties": false+ },+ "asPurchased": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "filename",+ "provenance"+ ],+ "description": "Import a pre-downloaded local STEP/SAT into a new wrapper component in Hybrid design. Validate optional expected SHA-256, record actual source/hash/supplier metadata, preserve camera, measure model recovery. Does not fetch URLs or create cloud documents. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused."+ },+ "mcmaster_discover": {+ "type": "object",+ "properties": {},+ "required": [+ "op"+ ],+ "description": "Discover Fusion native Insert McMaster-Carr command and requirements in the active design."+ },+ "mcmaster_open": {+ "type": "object",+ "properties": {},+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target"+ ],+ "description": "Invoke Fusion native McMaster UI in the targeted Hybrid design. Interactive external operation: completion/insert/cancel stays with Fusion; inspect afterward. Idempotency records launch only."+ },+ "material_list": {+ "type": "object",+ "properties": {+ "libraryId": {+ "type": "string"+ },+ "query": {+ "type": "string"+ },+ "limit": {+ "type": "integer",+ "minimum": 1,+ "maximum": 1000+ }+ },+ "required": [+ "op",+ "target"+ ],+ "description": "List loaded material libraries and matching materials by stable library/material IDs. Omit libraryId for document materials."+ },+ "material_assign": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "libraryId": {+ "type": "string"+ },+ "materialId": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "entity",+ "materialId"+ ],+ "description": "Assign a loaded library or document material to an exact native Component/BRepBody; verify material ID readback with model transaction recovery. Query assembly_properties for resulting mass."+ },+ "rigid_group_create": {+ "type": "object",+ "properties": {+ "occurrences": {+ "type": "array",+ "items": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "minItems": 2,+ "maxItems": 256+ },+ "includeChildren": {+ "type": "boolean"+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "occurrences"+ ],+ "description": "Create a native rigid group from exact occurrence instances; includeChildren defaults true."+ },+ "rigid_group_edit": {+ "type": "object",+ "properties": {+ "group": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "group"+ ],+ "description": "Rename or suppress an exact rigid group with transaction recovery."+ },+ "rigid_group_delete": {+ "type": "object",+ "properties": {+ "group": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "group"+ ],+ "description": "Delete an exact rigid group with transaction recovery."+ },+ "assembly_properties": {+ "type": "object",+ "properties": {+ "entity": {+ "type": "object",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context."+ }+ },+ "required": [+ "op",+ "target"+ ],+ "description": "High-accuracy physical properties of whole root assembly (default) or an exact Component/Occurrence/BRepBody. Returns mass kg, volume mm3, area mm2, center of mass mm, mean density kg/mm3 and definition/instance coordinate scope."+ }+}
addin/AdomBridge/commands/mechanical/sketches.pyadded+234@@ -0,0 +1,234 @@+"""Typed sketches, dimensions, constraints and construction planes (mm/deg)."""+import math++import adsk.core+import adsk.fusion++from .core import items, number, ref, require, resolve, same+from .readback import sketch_data+++def collection(entities):+ result = adsk.core.ObjectCollection.create()+ for entity in entities:+ result.add(entity)+ return result+++def point(value):+ require(isinstance(value, list) and len(value) in (2, 3), "invalid_input", "Point must be [x,y] or [x,y,z] in mm.")+ coords = [number(v, "coordinate") / 10 for v in value]+ return adsk.core.Point3D.create(*(coords + [0] if len(coords) == 2 else coords))+++def quantity(design, value, unit="mm", positive=False):+ if isinstance(value, (int, float)) and not isinstance(value, bool):+ expression = str(number(value, "quantity", positive)) + (" " + unit if unit else "")+ else:+ require(isinstance(value, str) and value.strip(), "invalid_input", "Quantity must be a number or unit-bearing expression.")+ expression = value+ require(design.unitsManager.isValidExpression(expression, unit), "invalid_expression", "Quantity does not match " + (unit or "unitless") + ".")+ evaluated = design.unitsManager.evaluateExpression(expression, unit)+ require(math.isfinite(evaluated) and (not positive or evaluated > 0), "invalid_quantity", "Quantity must be finite" + (" and positive." if positive else "."))+ return adsk.core.ValueInput.createByString(expression)+++def component(design, value, args):+ if args.get("component"):+ return resolve(design, value, args["component"], ("Component",))+ return design.rootComponent+++def plane(design, value, comp, selector):+ if isinstance(selector, str):+ require(selector in ("xy", "xz", "yz"), "invalid_plane", "Plane must be xy, xz, yz or a guarded reference.")+ return getattr(comp, {"xy": "xYConstructionPlane", "xz": "xZConstructionPlane", "yz": "yZConstructionPlane"}[selector])+ entity = resolve(design, value, selector, ("ConstructionPlane", "BRepFace"))+ owner = entity.body.parentComponent if hasattr(entity, "body") else entity.component+ require(getattr(entity, "assemblyContext", None) is None and same(owner, comp), "wrong_component", "Plane reference must belong to this native component definition.")+ return entity+++def axis(design, value, comp, selector):+ if isinstance(selector, str):+ require(selector in ("x", "y", "z"), "invalid_axis", "Axis must be x, y, z or a guarded reference.")+ return getattr(comp, selector + "ConstructionAxis")+ entity = resolve(design, value, selector, ("ConstructionAxis", "SketchLine", "BRepEdge"))+ owner = entity.body.parentComponent if hasattr(entity, "body") else (entity.parentSketch.parentComponent if hasattr(entity, "parentSketch") else entity.component)+ require(getattr(entity, "assemblyContext", None) is None and same(owner, comp), "wrong_component", "Axis reference must belong to this native component definition.")+ return entity+++def named(entity, args):+ require(entity is not None and entity.isValid, "creation_failed", "Fusion did not return a valid entity.")+ if args.get("name"):+ entity.name = args["name"]+ return entity+++def get_sketch(design, value, args):+ sketch = resolve(design, value, args["sketch"], ("Sketch",))+ require(getattr(sketch, "assemblyContext", None) is None, "definition_reference_required", "Sketch edits require a native definition reference.")+ return sketch+++def sketch_create(design, value, args):+ comp = component(design, value, args)+ support = plane(design, value, comp, args.get("plane", "xy"))+ sketch = named(comp.sketches.add(support), args)+ return lambda fresh: {"sketch": sketch_data(sketch, fresh)}+++def sketch_geometry(design, value, args):+ sketch = get_sketch(design, value, args)+ curves = sketch.sketchCurves+ for item in args["items"]:+ kind = item["type"]+ created = []+ if kind == "point":+ created = [sketch.sketchPoints.add(point(item["position"]))]+ elif kind == "line":+ created = [curves.sketchLines.addByTwoPoints(point(item["start"]), point(item["end"]))]+ elif kind == "rectangle":+ created = items(curves.sketchLines.addTwoPointRectangle(point(item["start"]), point(item["end"])))+ elif kind == "circle":+ radius = number(item["radius"], "radius", True) / 10+ created = [curves.sketchCircles.addByCenterRadius(point(item["center"]), radius)]+ elif kind == "arc":+ sweep = math.radians(number(item["sweep"], "sweep"))+ require(0 < abs(sweep) < 2 * math.pi, "invalid_input", "Arc sweep magnitude must be between 0 and 360 deg.")+ created = [curves.sketchArcs.addByCenterStartSweep(point(item["center"]), point(item["start"]), sweep)]+ elif kind == "polygon":+ center = point(item["center"])+ count = item["sides"]+ require(isinstance(count, int) and not isinstance(count, bool) and 3 <= count <= 128, "invalid_input", "Polygon sides must be 3..128.")+ radius = number(item["radius"], "radius", True) / 10+ angle = math.radians(number(item.get("angle", 0), "angle"))+ vertices = [adsk.core.Point3D.create(center.x + radius * math.cos(angle + 2 * math.pi * i / count),+ center.y + radius * math.sin(angle + 2 * math.pi * i / count), center.z) for i in range(count)]+ created = [curves.sketchLines.addByTwoPoints(vertices[i], vertices[(i + 1) % count]) for i in range(count)]+ elif kind == "slot":+ start, end = point(item["start"]), point(item["end"])+ require(abs(start.z - end.z) < 1e-9, "invalid_input", "Slot center points must share their sketch-space Z coordinate.")+ radius = number(item["width"], "width", True) / 20+ dx, dy = end.x - start.x, end.y - start.y+ length = math.hypot(dx, dy)+ require(length > 1e-8, "invalid_input", "Slot center points must differ.")+ ox, oy = -dy * radius / length, dx * radius / length+ p = lambda center, sign: adsk.core.Point3D.create(center.x + sign * ox, center.y + sign * oy, center.z)+ a, b, cc, d = p(start, 1), p(end, 1), p(end, -1), p(start, -1)+ created = [curves.sketchLines.addByTwoPoints(a, b),+ curves.sketchArcs.addByCenterStartSweep(end, b, -math.pi),+ curves.sketchLines.addByTwoPoints(cc, d),+ curves.sketchArcs.addByCenterStartSweep(start, d, -math.pi)]+ elif kind == "spline":+ spline = curves.sketchFittedSplines.add(collection([point(p) for p in item["points"]]))+ if item.get("closed"):+ spline.isClosed = True+ created = [spline]+ else:+ require(False, "unsupported_geometry", "Unsupported sketch primitive.")+ for entity in created:+ require(entity and entity.isValid, "creation_failed", "Sketch primitive creation failed.")+ if "construction" in item:+ require(hasattr(entity, "isConstruction"), "invalid_input", "Construction applies to curves.")+ entity.isConstruction = item["construction"]+ return lambda fresh: {"sketch": sketch_data(sketch, fresh)}+++def sketch_entities(design, value, args, sketch):+ entities = [resolve(design, value, entity) for entity in args["entities"]]+ for entity in entities:+ require(hasattr(entity, "parentSketch") and same(entity.parentSketch, sketch), "wrong_sketch", "Every selected entity must belong to the specified sketch.")+ return entities+++def sketch_constraint(design, value, args):+ sketch = get_sketch(design, value, args)+ entities = sketch_entities(design, value, args, sketch)+ methods = {"horizontal": ("addHorizontal", 1), "vertical": ("addVertical", 1),+ "coincident": ("addCoincident", 2), "parallel": ("addParallel", 2),+ "perpendicular": ("addPerpendicular", 2), "tangent": ("addTangent", 2),+ "equal": ("addEqual", 2), "concentric": ("addConcentric", 2),+ "collinear": ("addCollinear", 2), "midpoint": ("addMidPoint", 2),+ "symmetry": ("addSymmetry", 3)}+ if args["type"] == "fix":+ require(len(entities) == 1, "invalid_input", "fix requires one entity.")+ entities[0].isFixed = True+ else:+ method, count = methods[args["type"]]+ require(len(entities) == count, "invalid_input", "Constraint requires " + str(count) + " entities.")+ result = getattr(sketch.geometricConstraints, method)(*entities)+ require(result is not None, "constraint_failed", "Fusion did not create the constraint.")+ return lambda fresh: {"sketch": sketch_data(sketch, fresh)}+++def sketch_dimension(design, value, args):+ sketch = get_sketch(design, value, args)+ entities = sketch_entities(design, value, args, sketch)+ position, kind = point(args["position"]), args["type"]+ dims = sketch.sketchDimensions+ if kind in ("distance", "horizontal", "vertical"):+ require(len(entities) == 2, "invalid_input", "Distance dimension requires two sketch points.")+ orientation = getattr(adsk.fusion.DimensionOrientations, {"distance": "AlignedDimensionOrientation", "horizontal": "HorizontalDimensionOrientation", "vertical": "VerticalDimensionOrientation"}[kind])+ dimension = dims.addDistanceDimension(entities[0], entities[1], orientation, position)+ elif kind == "angle":+ require(len(entities) == 2, "invalid_input", "Angle dimension requires two lines.")+ dimension = dims.addAngularDimension(entities[0], entities[1], position)+ else:+ require(len(entities) == 1, "invalid_input", "Radius/diameter dimension requires one circle or arc.")+ dimension = getattr(dims, "addRadialDimension" if kind == "radius" else "addDiameterDimension")(entities[0], position)+ require(dimension is not None, "dimension_failed", "Fusion did not create the dimension.")+ expression = args["expression"]+ quantity(design, expression, "deg" if kind == "angle" else "mm")+ dimension.parameter.expression = str(expression) + (" deg" if kind == "angle" else " mm") if isinstance(expression, (int, float)) else expression+ if args.get("parameterName"):+ dimension.parameter.name = args["parameterName"]+ return lambda fresh: {"sketch": sketch_data(sketch, fresh), "parameterName": dimension.parameter.name}+++def sketch_project(design, value, args):+ sketch = get_sketch(design, value, args)+ projected = []+ for reference in args["entities"]:+ entity = resolve(design, value, reference, ("BRepEdge", "BRepFace", "BRepVertex", "SketchPoint", "SketchLine", "SketchCircle", "SketchArc"))+ projected.extend(items(sketch.project(entity)))+ require(projected, "projection_failed", "No sketch entities were projected.")+ return lambda fresh: {"sketch": sketch_data(sketch, fresh), "projected": [ref(e, fresh) for e in projected]}+++def sketch_edit(design, value, args):+ sketch = get_sketch(design, value, args)+ entity = resolve(design, value, args["entity"])+ require(same(entity.parentSketch, sketch), "wrong_sketch", "Entity is not in this sketch.")+ changes = args["changes"]+ for key, val in changes.items():+ if key in ("construction", "fixed"):+ setattr(entity, "isConstruction" if key == "construction" else "isFixed", val)+ elif key == "radius":+ entity.radius = number(val, "radius", True) / 10+ elif key in ("position", "start", "end", "center"):+ handle = entity if key == "position" else getattr(entity, {"start": "startSketchPoint", "end": "endSketchPoint", "center": "centerSketchPoint"}[key])+ wanted, old = point(val), handle.geometry+ require(handle.move(adsk.core.Vector3D.create(wanted.x - old.x, wanted.y - old.y, wanted.z - old.z)), "edit_failed", "Sketch point move was refused.")+ else:+ require(False, "invalid_input", "Unknown sketch edit property.")+ return lambda fresh: {"sketch": sketch_data(sketch, fresh)}+++def plane_create(design, value, args):+ comp = component(design, value, args)+ base = plane(design, value, comp, args.get("plane", "xy"))+ inp = comp.constructionPlanes.createInput()+ if args.get("type", "offset") == "offset":+ require(inp.setByOffset(base, quantity(design, args["offset"])), "plane_failed", "Offset plane input failed.")+ else:+ rotation = axis(design, value, comp, args["axis"])+ require(inp.setByAngle(rotation, quantity(design, args["angle"], "deg"), base), "plane_failed", "Angled plane input failed.")+ created = named(comp.constructionPlanes.add(inp), args)+ return lambda fresh: {"plane": {"ref": ref(created, fresh), "name": created.name}}+++OPERATIONS = {"sketch_create": sketch_create, "sketch_geometry": sketch_geometry,+ "sketch_constraint": sketch_constraint, "sketch_dimension": sketch_dimension,+ "sketch_project": sketch_project, "sketch_edit": sketch_edit, "plane_create": plane_create}
addin/AdomBridge/commands/mechanical/transactions.pyadded+144@@ -0,0 +1,144 @@+"""Verified Fusion PTransaction adapter; excludes documents and external files.++Autodesk's FusionMCPSample uses these text commands. Availability alone is not+proof: this adapter is enabled only after a session probe demonstrates both abort+and commit effects, followed by semantic restoration. Commands fail closed.+"""+import json+import math+import uuid++import adsk.core++from .core import (MechanicalError, active, current_target, recovery_snapshot,+ require, require_healthy, same, target)++_verified = False+_probe_evidence = None+++def capability():+ return {"verified": _verified, "backend": "PTransaction", "evidence": _probe_evidence,+ "scope": "one active Fusion Design; no document lifecycle, files or cloud effects"}+++def command(app, text):+ response = str(app.executeTextCommand(text)).strip()+ require(response == "1", "transaction_unavailable", "Fusion did not acknowledge transaction command.",+ command=text.split()[0], response=response)+++def equivalent(left, right):+ if isinstance(left, float) and isinstance(right, (float, int)):+ return math.isclose(left, right, rel_tol=1e-8, abs_tol=1e-8)+ if isinstance(left, dict) and isinstance(right, dict):+ return left.keys() == right.keys() and all(equivalent(left[k], right[k]) for k in left)+ if isinstance(left, list) and isinstance(right, list):+ return len(left) == len(right) and all(equivalent(a, b) for a, b in zip(left, right))+ return left == right+++def probe(app, args):+ global _verified, _probe_evidence+ doc, design, _ = target(app, args, True)+ require_healthy(design, False)+ before = recovery_snapshot(design)+ name = "AdomProbe" + uuid.uuid4().hex+ started = False+ try:+ command(app, 'PTransaction.Start "Adom recovery capability probe"')+ started = True+ parameter = design.userParameters.add(name, adsk.core.ValueInput.createByString("1 mm"), "mm", "temporary recovery probe")+ require(parameter is not None, "transaction_probe_failed", "Probe parameter creation failed.")+ command(app, "PTransaction.Abort")+ started = False+ require(design.userParameters.itemByName(name) is None, "transaction_probe_failed", "Abort did not remove the probe parameter.")+ command(app, 'PTransaction.Start "Adom commit capability probe"')+ started = True+ design.userParameters.add(name, adsk.core.ValueInput.createByString("2 mm"), "mm", "temporary recovery probe")+ command(app, "PTransaction.Commit")+ started = False+ parameter = design.userParameters.itemByName(name)+ require(parameter is not None and abs(parameter.value - 0.2) < 1e-9, "transaction_probe_failed", "Commit did not preserve the probe parameter.")+ require(bool(parameter.deleteMe()), "transaction_probe_failed", "Could not remove committed probe parameter.")+ require_healthy(design)+ require(equivalent(before, recovery_snapshot(design)), "transaction_probe_failed", "Probe did not restore the semantic witness.")+ _verified = True+ _probe_evidence = {"abortRemovedParameter": True, "commitPreservedParameter": True,+ "semanticRestoration": True, "applicationVersion": str(getattr(app, "version", "unknown"))}+ return {"target": current_target(app), "transaction": capability()}+ except Exception as exc:+ _verified = False+ recovery = {"verified": False, "strategy": "abort_and_remove_probe_parameter"}+ try:+ require(same(app.activeDocument, doc), "wrong_document", "Active document changed during probe.")+ if started:+ command(app, "PTransaction.Abort")+ parameter = design.userParameters.itemByName(name)+ if parameter:+ require(parameter.deleteMe(), "recovery_failed", "Probe parameter deletion failed.")+ require_healthy(design)+ recovery["verified"] = equivalent(before, recovery_snapshot(design))+ except Exception as restore_error:+ recovery["error"] = str(restore_error)+ raise MechanicalError("transaction_probe_failed", str(exc), recovery=recovery)+++def _retarget(value, fresh):+ if isinstance(value, dict):+ if "documentId" in value and "revision" in value:+ value.update(fresh)+ for nested in value.values():+ _retarget(nested, fresh)+ elif isinstance(value, list):+ for nested in value:+ _retarget(nested, fresh)+++def execute(app, args, operation):+ require(_verified, "transaction_not_verified", "Run transaction_probe in this add-in session before typed feature mutations.")+ doc, design, value = target(app, args, True)+ require(design.timeline.markerPosition == design.timeline.count, "timeline_not_at_end", "Finish editing history before a typed model mutation.")+ require_healthy(design, False)+ before = recovery_snapshot(design)+ started, committed = False, False+ try:+ command(app, 'PTransaction.Start "Adom mechanical operation"')+ started = True+ serialize = operation(design, value, args)+ require(same(app.activeDocument, doc), "wrong_document", "Active document changed during the operation.")+ state = require_healthy(design)+ provisional = current_target(app)+ result = serialize(provisional) if callable(serialize) else serialize+ result.update(target=provisional, health=state, transactional=True)+ json.dumps(result, allow_nan=False) # Serialization is validated before commit.+ command(app, "PTransaction.Commit")+ committed = True+ fresh = current_target(app)+ _retarget(result, fresh)+ result["transaction"] = {"committed": True, "backend": "PTransaction"}+ return result+ except Exception as exc:+ if committed:+ # Readback after commit can fail, but the model has already changed.+ return {"transaction": {"committed": True, "backend": "PTransaction"},+ "inspectionError": str(exc), "refreshRequired": True}+ recovery = {"strategy": "PTransaction.Abort", "verified": False,+ "witness": "parameters, feature state, sketch geometry/constraints, body geometry metrics, component metadata/materials, occurrence transforms/grounding and joint motion/limits"}+ try:+ require(same(app.activeDocument, doc), "wrong_document", "Refusing to abort another document's transaction.")+ if started:+ command(app, "PTransaction.Abort")+ require_healthy(design)+ recovery["verified"] = equivalent(before, recovery_snapshot(design))+ except Exception as restore_error:+ recovery["error"] = str(restore_error)+ details = {"recovery": recovery, "causeCode": exc.code if isinstance(exc, MechanicalError) else+ ("unsupported_capability" if isinstance(exc, AttributeError) else "kernel_error")}+ if isinstance(exc, MechanicalError) and exc.details:+ details["causeDetails"] = exc.details+ try:+ details["target"] = current_target(app)+ except Exception:+ details["refreshRequired"] = True+ raise MechanicalError("mutation_failed", str(exc), **details)
addin/AdomBridge/commands/physical_properties.py+40−52@@ -1,64 +1,52 @@-"""Per-component physical properties (volume, mass, density, area, center of mass).--Fusion exposes physical properties only through the modeling API, so before this verb a-caller had to run getPhysicalProperties inside fusion_run_modeling_script. This verb reads-them directly, per component, so BOM/costing tools can price by volume or mass without a-custom script.-"""-+"""Definition-scoped mass properties, including root-owned bodies.""" import adsk.core import adsk.fusion--_ACC = {- "low": adsk.fusion.CalculationAccuracy.LowCalculationAccuracy,- "medium": adsk.fusion.CalculationAccuracy.MediumCalculationAccuracy,- "high": adsk.fusion.CalculationAccuracy.HighCalculationAccuracy,- "veryhigh": adsk.fusion.CalculationAccuracy.VeryHighCalculationAccuracy,-}+from .mechanical.core import identity, items++_ACC = {name: getattr(adsk.fusion.CalculationAccuracy, api) for name, api in (+ ("low", "LowCalculationAccuracy"), ("medium", "MediumCalculationAccuracy"),+ ("high", "HighCalculationAccuracy"), ("veryhigh", "VeryHighCalculationAccuracy"))}+++def own_properties(comp, accuracy):+ area = volume = mass = 0.0+ weighted = [0.0, 0.0, 0.0]+ for body in items(comp.bRepBodies):+ pp = body.getPhysicalProperties(accuracy)+ area += pp.area+ volume += pp.volume+ mass += pp.mass+ for i, value in enumerate((pp.centerOfMass.x, pp.centerOfMass.y, pp.centerOfMass.z)):+ weighted[i] += value * pp.mass+ return {"volume_cm3": volume, "mass_kg": mass, "area_cm2": area,+ "density": mass / volume if volume else None, "densityUnit": "kg/cm3",+ "center_of_mass": [v / mass for v in weighted] if mass else None,+ "centerOfMassUnit": "cm", "coordinateSpace": "component",+ "scope": "direct_component_bodies", "bodies": comp.bRepBodies.count} def handle_physical_properties(app: adsk.core.Application, args: dict) -> dict:- """Return physical properties per unique component in the active design.-- args:- names optional list of component names to measure (default: all).- accuracy optional "low" | "medium" | "high" | "veryhigh" (default: low).- """ design = adsk.fusion.Design.cast(app.activeProduct) if not design:- return {"success": False, "error": "No active Fusion Design.",- "_hint": "Open a design in the Design workspace, then retry."}-+ return {"success": False, "error": "No active Fusion Design."} args = args or {}+ accuracy = args.get("accuracy", "low").lower()+ if accuracy not in _ACC:+ return {"success": False, "errorCode": "invalid_accuracy", "error": "accuracy must be low, medium, high or veryhigh."} names = set(args.get("names") or [])- acc = _ACC.get((args.get("accuracy") or "low").lower(),- adsk.fusion.CalculationAccuracy.LowCalculationAccuracy)-- out = {}- seen = set()- for occ in design.rootComponent.allOccurrences:- comp = occ.component- if comp.name in seen:- continue+ rows, errors = [], []+ for comp in items(design.allComponents): if names and comp.name not in names: continue- seen.add(comp.name) try:- pp = comp.getPhysicalProperties(acc)- entry = {- "volume_cm3": round(pp.volume, 4),- "mass_kg": round(pp.mass, 6),- "density": round(pp.density, 6),- "area_cm2": round(pp.area, 4),- }- try:- com = pp.centerOfMass- entry["center_of_mass"] = [round(com.x, 4), round(com.y, 4), round(com.z, 4)]- except Exception:- pass- out[comp.name] = entry- except Exception as e:- out[comp.name] = {"error": str(e)[:80]}-- return {"success": True, "count": len(out), "accuracy": (args.get("accuracy") or "low"),- "properties": out}+ rows.append({"componentId": identity(comp), "componentName": comp.name,+ **own_properties(comp, _ACC[accuracy])})+ except Exception as exc:+ errors.append({"componentName": comp.name, "error": str(exc)})+ counts = {}+ for row in rows:+ counts[row["componentName"]] = counts.get(row["componentName"], 0) + 1+ properties = {(r["componentName"] if counts[r["componentName"]] == 1 else+ r["componentName"] + "#" + r["componentId"]): r for r in rows}+ return {"success": not errors, "complete": not errors, "count": len(rows),+ "accuracy": accuracy, "properties": properties, "components": rows, "errors": errors}
addin/AdomBridge/http_server.py+17−2@@ -183,6 +183,7 @@ COMMAND_TIMEOUT = 300 # seconds # Per-command timeout overrides. Fast commands keep short timeouts so a # hung main thread is surfaced quickly. PER_COMMAND_TIMEOUT = {+ "mechanical": 300, "get_app_state": 10, "document_info": 15, "take_screenshot": 30,@@ -255,9 +256,8 @@ def _thread_name_histogram(limit: int = 8) -> dict: def _wait_for_result(request_id: str, timeout: float) -> dict: """Wait for the main thread to deliver a result for this request."""- event = threading.Event() with _lock:- _result_events[request_id] = event+ event = _result_events.setdefault(request_id, threading.Event()) got_result = event.wait(timeout=timeout) @@ -368,6 +368,18 @@ class AdomBridgeHandler(BaseHTTPRequestHandler): args = request.get("args", {}) request_id = str(uuid.uuid4()) + # These handlers read Python-owned metadata only. Keeping them outside+ # CustomEvent/the singleton lock lets a timed-out mutation be observed+ # while Fusion is busy. Never add a handler that touches the Fusion API.+ if command in ("mech_operation_status", "mech_capabilities"):+ from .commands.mechanical import operation_status, capabilities+ if not isinstance(args, dict):+ self._respond(400, {"success": False, "errorCode": "invalid_input", "error": "Arguments must be an object."})+ return+ handler = operation_status if command == "mech_operation_status" else capabilities+ self._respond(200, handler(None, args))+ return+ # Per-command timeout timeout = PER_COMMAND_TIMEOUT.get(command, COMMAND_TIMEOUT) # Allow caller override (useful for very large models)@@ -414,6 +426,7 @@ class AdomBridgeHandler(BaseHTTPRequestHandler): # Track as pending before firing with _lock: _pending_request_ids.add(request_id)+ _result_events[request_id] = threading.Event() # Fire custom event to marshal to main thread try:@@ -424,6 +437,8 @@ class AdomBridgeHandler(BaseHTTPRequestHandler): except Exception as e: with _lock: _pending_request_ids.discard(request_id)+ _result_events.pop(request_id, None)+ _result_data.pop(request_id, None) self._respond(500, {"success": False, "error": f"Failed to fire event: {e}"}) return
adom-bridge-fusion-manifest.json+2−2@@ -1,8 +1,8 @@ { "manifest_version": 1, "name": "fusion360",- "version": "1.11.9",- "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.11.9/adom-bridge-fusion-v1.11.9.zip",+ "version": "1.12.0-dev.3",+ "url": "https://wiki.adom.inc/download/adom/fusion-bridge/1.12.0-dev.3/adom-bridge-fusion-v1.12.0-dev.3.zip", "sha256": "331d3fe843af0093d337fdb138101283529999ab772ce41322699699978a82fc", "size": 6546160, "verbPrefixes": [
bridge.json+4−1@@ -2,7 +2,7 @@ "manifest_version": 1, "name": "fusion360", "displayName": "Autodesk Fusion 360",- "version": "1.11.9",+ "version": "1.12.0-dev.3", "description": "Drive Autodesk Fusion 360 from the cloud: launch Fusion, electronics board layout, design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers/BOM/CPL), fast APS server-indexed cloud search plus browse/recent/file-info/versions, cloud file download/upload and folder creation, and in-app parametric modeling (fusion_run_modeling_script). Never-charge: APS calls are capped to the free tier.", "homepage": "https://wiki.adom.inc/adom/fusion-bridge", "author": "Adom Inc.",@@ -126,6 +126,9 @@ "fusion_mcp_resources", "fusion_mcp_status", "fusion_mcp_tools",+ "fusion_mech_capabilities",+ "fusion_mech_operation_status",+ "fusion_mechanical", "fusion_narrate", "fusion_new_electronics_from_eagle", "fusion_notify_owner",
contracts/describe.json+9818−2@@ -1,6 +1,6 @@ { "contract": "fusion-bridge verb catalog",- "frozen": "2026-09-23",+ "frozen": "2026-10-02", "note": "The Python bridge and the Rust bridge must both serve this catalog byte-for-byte in meaning: same names, same args, same result shapes, same timeouts. Regenerate ONLY from describe.py and diff in CI.", "source": "describe.py", "verbs": [@@ -1942,7 +1942,7 @@ { "example": { "arguments": {- "queryType": "summary"+ "queryType": "activeCommand" }, "tool": "fusion_mcp_read" },@@ -2020,6 +2020,9822 @@ "summary": "Full tool list from Autodesk's Fusion MCP server INCLUDING input schemas, so you can construct a valid fusion_mcp_call. These are Autodesk's tools, not this bridge's.", "timeoutSeconds": 45 },+ {+ "example": {},+ "input": {},+ "longRunning": false,+ "name": "fusion_mech_capabilities",+ "output": {+ "idempotency": "object",+ "operations": {+ "assembly_properties": {+ "description": "High-accuracy physical properties of whole root assembly (default) or an exact Component/Occurrence/BRepBody. Returns mass kg, volume mm3, area mm2, center of mass mm, mean density kg/mm3 and definition/instance coordinate scope.",+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "target"+ ],+ "type": "object"+ },+ "bom": {+ "description": "Structured component-definition and instance BOM; quantities by actual identity, root bodies plus nested children; purchased metadata collapses subtrees unless exploded. Physical mass includes all unsuppressed bodies exactly once per instance.",+ "properties": {+ "explodePurchased": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "target"+ ],+ "type": "object"+ },+ "bom_export": {+ "description": "Export flat grouped purchasing rows or structured parent/path/depth instance rows and supplier provenance to CSV with exclusive/atomic publication. This external effect is separate from model transactions.",+ "properties": {+ "explodePurchased": {+ "type": "boolean"+ },+ "filename": {+ "type": "string"+ },+ "mode": {+ "enum": [+ "flat",+ "structured"+ ]+ },+ "overwrite": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "filename"+ ],+ "type": "object"+ },+ "cad_import": {+ "description": "Import a pre-downloaded local STEP/SAT into a new wrapper component in Hybrid design. Validate optional expected SHA-256, record actual source/hash/supplier metadata, preserve camera, measure model recovery. Does not fetch URLs or create cloud documents. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.",+ "properties": {+ "asPurchased": {+ "type": "boolean"+ },+ "filename": {+ "type": "string"+ },+ "name": {+ "type": "string"+ },+ "parent": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "provenance": {+ "additionalProperties": false,+ "properties": {+ "description": {+ "type": "string"+ },+ "sourceUrl": {+ "type": "string"+ },+ "supplier": {+ "type": "string"+ },+ "supplierPartNumber": {+ "type": "string"+ }+ },+ "required": [+ "supplier",+ "supplierPartNumber",+ "sourceUrl"+ ],+ "type": "object"+ },+ "sha256": {+ "type": "string"+ },+ "transform": {+ "additionalProperties": false,+ "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.",+ "properties": {+ "angle": {+ "type": "number"+ },+ "axis": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "position": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ }+ },+ "required": [],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "filename",+ "provenance"+ ],+ "type": "object"+ },+ "component_create": {+ "description": "Create a native internal component and its first occurrence in a Hybrid design. parent is a component definition; edits to it affect every instance. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.",+ "properties": {+ "metadata": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "asPurchased": {+ "type": "boolean"+ },+ "description": {+ "type": "string"+ },+ "excludeFromBom": {+ "type": "boolean"+ },+ "name": {+ "type": "string"+ },+ "partNumber": {+ "type": "string"+ },+ "sourceUrl": {+ "type": "string"+ },+ "supplier": {+ "type": "string"+ },+ "supplierPartNumber": {+ "type": "string"+ }+ },+ "required": [],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "parent": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "transform": {+ "additionalProperties": false,+ "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.",+ "properties": {+ "angle": {+ "type": "number"+ },+ "axis": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "position": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ }+ },+ "required": [],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "name"+ ],+ "type": "object"+ },+ "component_metadata": {+ "description": "Update component-definition name/part number/description and persistent supplier or BOM attributes. Shared occurrences all see this metadata.",+ "properties": {+ "changes": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "asPurchased": {+ "type": "boolean"+ },+ "description": {+ "type": "string"+ },+ "excludeFromBom": {+ "type": "boolean"+ },+ "name": {+ "type": "string"+ },+ "partNumber": {+ "type": "string"+ },+ "sourceUrl": {+ "type": "string"+ },+ "supplier": {+ "type": "string"+ },+ "supplierPartNumber": {+ "type": "string"+ }+ },+ "required": [],+ "type": "object"+ },+ "component": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "changes"+ ],+ "type": "object"+ },+ "entity_delete": {+ "description": "Delete sketch geometry or independently deletable timeline features. Model transaction and semantic recovery cover downstream failures; document and external file deletion are excluded.",+ "properties": {+ "entity": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "entity"+ ],+ "type": "object"+ },+ "export": {+ "description": "Export entire design using runtime-checked API. Preflight and unique same-filesystem staging preserve the destination on failure; publish only nonempty verified output. Availability differs by Fusion build. STL numeric coordinates use mm.",+ "properties": {+ "format": {+ "default": "step",+ "enum": [+ "step",+ "stl",+ "3mf",+ "f3d",+ "iges",+ "sat",+ "smt",+ "usdz",+ "fbx",+ "skp"+ ]+ },+ "outputPath": {+ "type": "string"+ },+ "overwrite": {+ "default": false,+ "type": "boolean"+ },+ "refinement": {+ "default": "medium",+ "enum": [+ "low",+ "medium",+ "high"+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "outputPath"+ ],+ "type": "object"+ },+ "feature_create": {+ "description": "Create a typed native solid feature. All length quantities are mm (or expressions), angles deg. Cut/intersect require explicit participant bodies. Join needs a single existing component body; combine selects multiple bodies explicitly. Feature availability is runtime-checked; missing APIs fail before commit.",+ "oneOf": [+ {+ "additionalProperties": false,+ "properties": {+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "direction": {+ "enum": [+ "positive",+ "negative",+ "symmetric"+ ]+ },+ "distance": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ },+ "operationId": {+ "type": "string"+ },+ "profiles": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "sessionId": {+ "type": "string"+ },+ "taper": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "extrude"+ ]+ }+ },+ "required": [+ "type",+ "profiles",+ "distance"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ },+ "operationId": {+ "type": "string"+ },+ "profiles": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "revolve"+ ]+ }+ },+ "required": [+ "type",+ "profiles",+ "axis",+ "angle"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "edges": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "radius": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "sessionId": {+ "type": "string"+ },+ "tangentChain": {+ "type": "boolean"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "fillet"+ ]+ }+ },+ "required": [+ "type",+ "edges",+ "radius"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "distance": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "edges": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "tangentChain": {+ "type": "boolean"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "chamfer"+ ]+ }+ },+ "required": [+ "type",+ "edges",+ "distance"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "faces": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "tangentChain": {+ "type": "boolean"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "thickness": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "type": {+ "enum": [+ "shell"+ ]+ }+ },+ "required": [+ "type",+ "faces",+ "thickness"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "depth": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "diameter": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "points": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "hole"+ ]+ }+ },+ "required": [+ "type",+ "points",+ "diameter",+ "depth",+ "bodies"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ },+ "operationId": {+ "type": "string"+ },+ "profiles": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "loft"+ ]+ }+ },+ "required": [+ "type",+ "profiles"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ },+ "operationId": {+ "type": "string"+ },+ "path": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "profiles": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "sweep"+ ]+ }+ },+ "required": [+ "type",+ "profiles",+ "path"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "body": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keepTools": {+ "type": "boolean"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operation": {+ "enum": [+ "join",+ "cut",+ "intersect"+ ]+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "tools": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "type": {+ "enum": [+ "combine"+ ]+ }+ },+ "required": [+ "type",+ "body",+ "tools",+ "operation"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "extend": {+ "type": "boolean"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "split"+ ]+ }+ },+ "required": [+ "type",+ "bodies",+ "plane"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "angle": {+ "type": "number"+ },+ "axis": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "origin": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "translation": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "type": {+ "enum": [+ "move"+ ]+ }+ },+ "required": [+ "type",+ "bodies"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "mirror"+ ]+ }+ },+ "required": [+ "type",+ "bodies",+ "plane"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "axis2": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "count": {+ "maximum": 1000,+ "minimum": 2,+ "type": "integer"+ },+ "count2": {+ "maximum": 1000,+ "minimum": 1,+ "type": "integer"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "spacing": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "spacing2": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "rectangular_pattern"+ ]+ }+ },+ "required": [+ "type",+ "bodies",+ "axis",+ "count",+ "spacing"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "count": {+ "maximum": 1000,+ "minimum": 2,+ "type": "integer"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "circular_pattern"+ ]+ }+ },+ "required": [+ "type",+ "bodies",+ "axis",+ "count"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "faces": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "sessionId": {+ "type": "string"+ },+ "tangentChain": {+ "type": "boolean"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "draft"+ ]+ }+ },+ "required": [+ "type",+ "faces",+ "plane",+ "angle"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "designation": {+ "type": "string"+ },+ "faces": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "internal": {+ "type": "boolean"+ },+ "modeled": {+ "type": "boolean"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "threadClass": {+ "type": "string"+ },+ "threadType": {+ "type": "string"+ },+ "type": {+ "enum": [+ "thread"+ ]+ }+ },+ "required": [+ "type",+ "faces",+ "internal",+ "threadType",+ "designation",+ "threadClass"+ ],+ "type": "object"+ }+ ],+ "properties": {+ "angle": {},+ "axis": {},+ "axis2": {},+ "bodies": {},+ "body": {},+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "count": {},+ "count2": {},+ "depth": {},+ "designation": {},+ "diameter": {},+ "direction": {},+ "distance": {},+ "edges": {},+ "extend": {},+ "faces": {},+ "internal": {},+ "keepTools": {},+ "modeled": {},+ "name": {+ "type": "string"+ },+ "operation": {},+ "origin": {},+ "path": {},+ "plane": {},+ "points": {},+ "profiles": {},+ "radius": {},+ "spacing": {},+ "spacing2": {},+ "tangentChain": {},+ "taper": {},+ "thickness": {},+ "threadClass": {},+ "threadType": {},+ "tools": {},+ "translation": {},+ "type": {+ "enum": [+ "extrude",+ "revolve",+ "fillet",+ "chamfer",+ "shell",+ "hole",+ "loft",+ "sweep",+ "combine",+ "split",+ "move",+ "mirror",+ "rectangular_pattern",+ "circular_pattern",+ "draft",+ "thread"+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "type"+ ],+ "type": "object"+ },+ "feature_edit": {+ "description": "Rename/suppress a feature or change expressions of model parameters whose createdBy is that exact feature; read health and abort on downstream errors.",+ "properties": {+ "feature": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "parameters": {+ "additionalProperties": {+ "type": "string"+ },+ "type": "object"+ },+ "suppressed": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "feature"+ ],+ "type": "object"+ },+ "health": {+ "description": "Read timeline warnings/errors. recompute:true also requires current target revision, sessionId and operationId.",+ "properties": {+ "recompute": {+ "default": false,+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "target"+ ],+ "type": "object"+ },+ "inspect": {+ "description": "Inspect the active Design without mutation. Returns target identity/revision, native component-space bodies and occurrence transforms, parameters and feature health.",+ "properties": {},+ "required": [+ "op"+ ],+ "type": "object"+ },+ "inspect_entity": {+ "properties": {+ "entity": {+ "description": "Exact reference returned by inspect; resolves uniquely with document/revision/type/occurrence guards.",+ "type": "object"+ }+ },+ "required": [+ "op",+ "target",+ "entity"+ ],+ "type": "object"+ },+ "interference": {+ "description": "Analyze root-context occurrences/body proxies; returns overlap volume mm3 or touching. Does not create interference bodies.",+ "properties": {+ "entities": {+ "items": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 2,+ "type": "array"+ },+ "includeTouching": {+ "type": "boolean"+ },+ "volumeTolerance": {+ "minimum": 0,+ "type": "number"+ }+ },+ "required": [+ "op",+ "target",+ "entities"+ ],+ "type": "object"+ },+ "joint_create": {+ "description": "Create an as-built joint without moving occurrences. Non-rigid motion requires explicit joint geometry; x/y/z are joint-coordinate directions. Limits and drive values use mm/deg. Seven native motion types; ball uses joint Z pitch/X yaw; planar uses native primary slide direction reported on readback. Geometry-moving regular joint creation is not exposed.",+ "oneOf": [+ {+ "additionalProperties": false,+ "properties": {+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "rigid"+ ]+ }+ },+ "required": [+ "type"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "geometry": {+ "additionalProperties": false,+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "rotationLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rotationValue": {+ "type": "number"+ },+ "sessionId": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "revolute"+ ]+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "geometry": {+ "additionalProperties": false,+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "slideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "slideValue": {+ "type": "number"+ },+ "suppressed": {+ "type": "boolean"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "slider"+ ]+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "geometry": {+ "additionalProperties": false,+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "rotationLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rotationValue": {+ "type": "number"+ },+ "sessionId": {+ "type": "string"+ },+ "slideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "slideValue": {+ "type": "number"+ },+ "suppressed": {+ "type": "boolean"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "cylindrical"+ ]+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "geometry": {+ "additionalProperties": false,+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "rotationLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rotationValue": {+ "type": "number"+ },+ "sessionId": {+ "type": "string"+ },+ "slideAxis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "slideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "slideValue": {+ "type": "number"+ },+ "suppressed": {+ "type": "boolean"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "pin_slot"+ ]+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "geometry": {+ "additionalProperties": false,+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "primarySlideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "primarySlideValue": {+ "type": "number"+ },+ "rotationLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rotationValue": {+ "type": "number"+ },+ "secondarySlideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "secondarySlideValue": {+ "type": "number"+ },+ "sessionId": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "planar"+ ]+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "geometry": {+ "additionalProperties": false,+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "pitchLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "pitchValue": {+ "type": "number"+ },+ "rollLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rollValue": {+ "type": "number"+ },+ "sessionId": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "ball"+ ]+ },+ "yawLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "yawValue": {+ "type": "number"+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "type": "object"+ }+ ],+ "properties": {+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "geometry": {+ "additionalProperties": false,+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "pitchLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "pitchValue": {+ "type": "number"+ },+ "primarySlideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "primarySlideValue": {+ "type": "number"+ },+ "rollLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rollValue": {+ "type": "number"+ },+ "rotationLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rotationValue": {+ "type": "number"+ },+ "secondarySlideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "secondarySlideValue": {+ "type": "number"+ },+ "slideAxis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "slideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "slideValue": {+ "type": "number"+ },+ "suppressed": {+ "type": "boolean"+ },+ "type": {+ "enum": [+ "rigid",+ "revolute",+ "slider",+ "cylindrical",+ "pin_slot",+ "planar",+ "ball"+ ]+ },+ "yawLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "yawValue": {+ "type": "number"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "type",+ "occurrenceOne",+ "occurrenceTwo"+ ],+ "type": "object"+ },+ "joint_delete": {+ "description": "Delete one selected Joint or AsBuiltJoint with recovery verification.",+ "properties": {+ "joint": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "joint"+ ],+ "type": "object"+ },+ "joint_edit": {+ "description": "Edit joint name/suppression, enabled limits, rest and drive values; wrong motion type or out-of-limit values fail with recovery.",+ "properties": {+ "joint": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "pitchLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "pitchValue": {+ "type": "number"+ },+ "primarySlideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "primarySlideValue": {+ "type": "number"+ },+ "rollLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rollValue": {+ "type": "number"+ },+ "rotationLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rotationValue": {+ "type": "number"+ },+ "secondarySlideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "secondarySlideValue": {+ "type": "number"+ },+ "slideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "slideValue": {+ "type": "number"+ },+ "suppressed": {+ "type": "boolean"+ },+ "yawLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "yawValue": {+ "type": "number"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "joint"+ ],+ "type": "object"+ },+ "material_assign": {+ "description": "Assign a loaded library or document material to an exact native Component/BRepBody; verify material ID readback with model transaction recovery. Query assembly_properties for resulting mass.",+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "libraryId": {+ "type": "string"+ },+ "materialId": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "entity",+ "materialId"+ ],+ "type": "object"+ },+ "material_list": {+ "description": "List loaded material libraries and matching materials by stable library/material IDs. Omit libraryId for document materials.",+ "properties": {+ "libraryId": {+ "type": "string"+ },+ "limit": {+ "maximum": 1000,+ "minimum": 1,+ "type": "integer"+ },+ "query": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "target"+ ],+ "type": "object"+ },+ "mcmaster_discover": {+ "description": "Discover Fusion native Insert McMaster-Carr command and requirements in the active design.",+ "properties": {},+ "required": [+ "op"+ ],+ "type": "object"+ },+ "mcmaster_open": {+ "description": "Invoke Fusion native McMaster UI in the targeted Hybrid design. Interactive external operation: completion/insert/cancel stays with Fusion; inspect afterward. Idempotency records launch only.",+ "properties": {},+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target"+ ],+ "type": "object"+ },+ "new_design": {+ "description": "Create an unnamed unsaved parametric hybrid Design; name is retained as requestedName metadata to keep failure recovery free of save dialogs. Optional box dimensions in mm create a driving-parameter fixture. Never edits an existing document.",+ "properties": {+ "box": {+ "additionalProperties": false,+ "properties": {+ "depth": {+ "exclusiveMinimum": 0,+ "type": "number"+ },+ "height": {+ "exclusiveMinimum": 0,+ "type": "number"+ },+ "width": {+ "exclusiveMinimum": 0,+ "type": "number"+ }+ },+ "required": [+ "width",+ "height",+ "depth"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId"+ ],+ "type": "object"+ },+ "occurrence_delete": {+ "description": "Delete one selected occurrence through the shared transaction executor.",+ "properties": {+ "occurrence": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "occurrence"+ ],+ "type": "object"+ },+ "occurrence_insert": {+ "description": "Insert another occurrence of an existing definition; independentCopy:true uses Paste New to create a separate definition. Nested placement is in parent component coordinates. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.",+ "properties": {+ "component": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "independentCopy": {+ "type": "boolean"+ },+ "parent": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "transform": {+ "additionalProperties": false,+ "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.",+ "properties": {+ "angle": {+ "type": "number"+ },+ "axis": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "position": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ }+ },+ "required": [],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "component"+ ],+ "type": "object"+ },+ "occurrence_update": {+ "description": "Set occurrence pose in its assembly context and capture position; explicit grounding/ungrounding. Grounded or constrained transforms fail with recovery.",+ "properties": {+ "grounded": {+ "type": "boolean"+ },+ "groundedToParent": {+ "type": "boolean"+ },+ "occurrence": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "transform": {+ "additionalProperties": false,+ "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.",+ "properties": {+ "angle": {+ "type": "number"+ },+ "axis": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "position": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ }+ },+ "required": [],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "occurrence"+ ],+ "type": "object"+ },+ "parameter_batch": {+ "description": "Atomic sequential create/set/delete parameter edits with one recompute+health gate; delete supports user parameters only. Any failure aborts all edits and reports semantic recovery.",+ "properties": {+ "changes": {+ "items": {+ "oneOf": [+ {+ "additionalProperties": false,+ "properties": {+ "action": {+ "enum": [+ "create"+ ]+ },+ "comment": {+ "type": "string"+ },+ "expression": {+ "type": "string"+ },+ "name": {+ "type": "string"+ },+ "unit": {+ "enum": [+ "mm",+ "deg",+ "kg",+ ""+ ]+ }+ },+ "required": [+ "action",+ "name",+ "expression",+ "unit"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "action": {+ "enum": [+ "set"+ ]+ },+ "expression": {+ "type": "string"+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "action",+ "name",+ "expression"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "action": {+ "enum": [+ "delete"+ ]+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "action",+ "name"+ ],+ "type": "object"+ }+ ]+ },+ "maxItems": 128,+ "minItems": 1,+ "type": "array"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "changes"+ ],+ "type": "object"+ },+ "parameter_create": {+ "properties": {+ "comment": {+ "type": "string"+ },+ "expression": {+ "type": "string"+ },+ "name": {+ "type": "string"+ },+ "unit": {+ "enum": [+ "mm",+ "deg",+ "kg",+ ""+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "name",+ "expression",+ "unit"+ ],+ "type": "object"+ },+ "parameter_set": {+ "description": "Set an expression, recompute and inspect health. Failure restores old expression and reports a semantic recovery witness; not an atomic transaction.",+ "properties": {+ "expression": {+ "type": "string"+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "name",+ "expression"+ ],+ "type": "object"+ },+ "plane_create": {+ "description": "Create offset plane (offset in mm) or angled plane around axis (angle in deg).",+ "oneOf": [+ {+ "additionalProperties": false,+ "properties": {+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "offset": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "offset"+ ]+ }+ },+ "required": [+ "type",+ "offset"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "angle"+ ]+ }+ },+ "required": [+ "type",+ "axis",+ "angle"+ ],+ "type": "object"+ }+ ],+ "properties": {+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "offset": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "type": {+ "enum": [+ "offset",+ "angle"+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "type"+ ],+ "type": "object"+ },+ "rigid_group_create": {+ "description": "Create a native rigid group from exact occurrence instances; includeChildren defaults true.",+ "properties": {+ "includeChildren": {+ "type": "boolean"+ },+ "name": {+ "type": "string"+ },+ "occurrences": {+ "items": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 2,+ "type": "array"+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "occurrences"+ ],+ "type": "object"+ },+ "rigid_group_delete": {+ "description": "Delete an exact rigid group with transaction recovery.",+ "properties": {+ "group": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "group"+ ],+ "type": "object"+ },+ "rigid_group_edit": {+ "description": "Rename or suppress an exact rigid group with transaction recovery.",+ "properties": {+ "group": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "group"+ ],+ "type": "object"+ },+ "sketch_constraint": {+ "description": "Constrain entities in one sketch. midpoint order is point,line; symmetry order entity1,entity2,symmetryLine. fix sets one entity fixed.",+ "properties": {+ "entities": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "sketch": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "horizontal",+ "vertical",+ "coincident",+ "parallel",+ "perpendicular",+ "tangent",+ "equal",+ "concentric",+ "collinear",+ "midpoint",+ "symmetry",+ "fix"+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "type",+ "entities"+ ],+ "type": "object"+ },+ "sketch_create": {+ "description": "Create a native component-definition sketch on an origin/construction plane or planar face. Coordinates in subsequent geometry are sketch-space mm.",+ "properties": {+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target"+ ],+ "type": "object"+ },+ "sketch_dimension": {+ "description": "Add driving dimensions. Distance uses two point references; radius/diameter one curve; angle two lines. Numeric expressions use mm or deg.",+ "properties": {+ "entities": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "expression": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "parameterName": {+ "type": "string"+ },+ "position": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "sketch": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "distance",+ "horizontal",+ "vertical",+ "radius",+ "diameter",+ "angle"+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "type",+ "entities",+ "expression",+ "position"+ ],+ "type": "object"+ },+ "sketch_edit": {+ "description": "Move sketch points/endpoints/centers in sketch-space mm, change radius or construction/fixed flags; solver failure aborts the operation.",+ "properties": {+ "changes": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "center": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "construction": {+ "type": "boolean"+ },+ "end": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "fixed": {+ "type": "boolean"+ },+ "position": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "radius": {+ "type": "number"+ },+ "start": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ }+ },+ "required": [],+ "type": "object"+ },+ "entity": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "sketch": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "entity",+ "changes"+ ],+ "type": "object"+ },+ "sketch_geometry": {+ "description": "Create a transactionally grouped set of sketch primitives. Numeric geometry uses mm and arc sweeps/polygon angles use deg.",+ "properties": {+ "items": {+ "items": {+ "oneOf": [+ {+ "additionalProperties": false,+ "properties": {+ "position": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "type": {+ "enum": [+ "point"+ ]+ }+ },+ "required": [+ "type",+ "position"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "construction": {+ "type": "boolean"+ },+ "end": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "start": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "type": {+ "enum": [+ "line"+ ]+ }+ },+ "required": [+ "type",+ "start",+ "end"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "construction": {+ "type": "boolean"+ },+ "end": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "start": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "type": {+ "enum": [+ "rectangle"+ ]+ }+ },+ "required": [+ "type",+ "start",+ "end"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "center": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "construction": {+ "type": "boolean"+ },+ "radius": {+ "exclusiveMinimum": 0,+ "type": "number"+ },+ "type": {+ "enum": [+ "circle"+ ]+ }+ },+ "required": [+ "type",+ "center",+ "radius"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "center": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "construction": {+ "type": "boolean"+ },+ "start": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "sweep": {+ "type": "number"+ },+ "type": {+ "enum": [+ "arc"+ ]+ }+ },+ "required": [+ "type",+ "center",+ "start",+ "sweep"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "angle": {+ "type": "number"+ },+ "center": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "construction": {+ "type": "boolean"+ },+ "radius": {+ "exclusiveMinimum": 0,+ "type": "number"+ },+ "sides": {+ "maximum": 128,+ "minimum": 3,+ "type": "integer"+ },+ "type": {+ "enum": [+ "polygon"+ ]+ }+ },+ "required": [+ "type",+ "center",+ "radius",+ "sides"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "construction": {+ "type": "boolean"+ },+ "end": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "start": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "type": {+ "enum": [+ "slot"+ ]+ },+ "width": {+ "exclusiveMinimum": 0,+ "type": "number"+ }+ },+ "required": [+ "type",+ "start",+ "end",+ "width"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "closed": {+ "type": "boolean"+ },+ "construction": {+ "type": "boolean"+ },+ "points": {+ "items": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "maxItems": 128,+ "minItems": 2,+ "type": "array"+ },+ "type": {+ "enum": [+ "spline"+ ]+ }+ },+ "required": [+ "type",+ "points"+ ],+ "type": "object"+ }+ ]+ },+ "maxItems": 128,+ "minItems": 1,+ "type": "array"+ },+ "sketch": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "items"+ ],+ "type": "object"+ },+ "sketch_project": {+ "description": "Project selected topology into a sketch with Fusion associative projection.",+ "properties": {+ "entities": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "sketch": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "entities"+ ],+ "type": "object"+ },+ "transaction_probe": {+ "description": "Verify runtime PTransaction abort+commit using temporary user parameters, remove probe data and compare semantic restoration. Required once per running add-in session before feature/sketch/atomic-batch writes. Returns fresh target; inspect again for current references.",+ "properties": {},+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target"+ ],+ "type": "object"+ }+ },+ "sessionId": "str",+ "success": "bool",+ "transactions": "object"+ },+ "statusVerb": null,+ "summary": "Discover typed mechanical operations, exact input schemas, units, recovery limitations and current add-in session ID.",+ "timeoutSeconds": 30+ },+ {+ "example": {},+ "input": {+ "operationId": "required str",+ "sessionId": "required str"+ },+ "longRunning": false,+ "name": "fusion_mech_operation_status",+ "output": {+ "result": "original result",+ "state": "running|succeeded|failed",+ "success": "bool"+ },+ "statusVerb": null,+ "summary": "Read a mechanical operation result retained after HTTP timeout. Runs outside Fusion's main-thread queue, including while a model mutation is running. Old add-in session IDs fail closed; absence is unknown outcome, not proof a mutation never ran. A native call monopolizing Python's GIL may still delay all Python responses.",+ "timeoutSeconds": 30+ },+ {+ "example": {+ "op": "inspect"+ },+ "input": {+ "op": "required enum: inspect|inspect_entity|new_design|parameter_set|parameter_create|health|export|transaction_probe|sketch_create|sketch_geometry|sketch_constraint|sketch_dimension|sketch_project|sketch_edit|plane_create|feature_create|feature_edit|entity_delete|parameter_batch|component_create|occurrence_insert|occurrence_update|occurrence_delete|component_metadata|joint_create|joint_edit|joint_delete|interference|bom|bom_export|cad_import|mcmaster_discover|mcmaster_open|material_list|material_assign|rigid_group_create|rigid_group_edit|rigid_group_delete|assembly_properties",+ "operationId": "required unique write ID; reuse unchanged for retry",+ "operationSchemas": {+ "assembly_properties": {+ "description": "High-accuracy physical properties of whole root assembly (default) or an exact Component/Occurrence/BRepBody. Returns mass kg, volume mm3, area mm2, center of mass mm, mean density kg/mm3 and definition/instance coordinate scope.",+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "target"+ ],+ "type": "object"+ },+ "bom": {+ "description": "Structured component-definition and instance BOM; quantities by actual identity, root bodies plus nested children; purchased metadata collapses subtrees unless exploded. Physical mass includes all unsuppressed bodies exactly once per instance.",+ "properties": {+ "explodePurchased": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "target"+ ],+ "type": "object"+ },+ "bom_export": {+ "description": "Export flat grouped purchasing rows or structured parent/path/depth instance rows and supplier provenance to CSV with exclusive/atomic publication. This external effect is separate from model transactions.",+ "properties": {+ "explodePurchased": {+ "type": "boolean"+ },+ "filename": {+ "type": "string"+ },+ "mode": {+ "enum": [+ "flat",+ "structured"+ ]+ },+ "overwrite": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "filename"+ ],+ "type": "object"+ },+ "cad_import": {+ "description": "Import a pre-downloaded local STEP/SAT into a new wrapper component in Hybrid design. Validate optional expected SHA-256, record actual source/hash/supplier metadata, preserve camera, measure model recovery. Does not fetch URLs or create cloud documents. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.",+ "properties": {+ "asPurchased": {+ "type": "boolean"+ },+ "filename": {+ "type": "string"+ },+ "name": {+ "type": "string"+ },+ "parent": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "provenance": {+ "additionalProperties": false,+ "properties": {+ "description": {+ "type": "string"+ },+ "sourceUrl": {+ "type": "string"+ },+ "supplier": {+ "type": "string"+ },+ "supplierPartNumber": {+ "type": "string"+ }+ },+ "required": [+ "supplier",+ "supplierPartNumber",+ "sourceUrl"+ ],+ "type": "object"+ },+ "sha256": {+ "type": "string"+ },+ "transform": {+ "additionalProperties": false,+ "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.",+ "properties": {+ "angle": {+ "type": "number"+ },+ "axis": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "position": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ }+ },+ "required": [],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "filename",+ "provenance"+ ],+ "type": "object"+ },+ "component_create": {+ "description": "Create a native internal component and its first occurrence in a Hybrid design. parent is a component definition; edits to it affect every instance. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.",+ "properties": {+ "metadata": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "asPurchased": {+ "type": "boolean"+ },+ "description": {+ "type": "string"+ },+ "excludeFromBom": {+ "type": "boolean"+ },+ "name": {+ "type": "string"+ },+ "partNumber": {+ "type": "string"+ },+ "sourceUrl": {+ "type": "string"+ },+ "supplier": {+ "type": "string"+ },+ "supplierPartNumber": {+ "type": "string"+ }+ },+ "required": [],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "parent": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "transform": {+ "additionalProperties": false,+ "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.",+ "properties": {+ "angle": {+ "type": "number"+ },+ "axis": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "position": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ }+ },+ "required": [],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "name"+ ],+ "type": "object"+ },+ "component_metadata": {+ "description": "Update component-definition name/part number/description and persistent supplier or BOM attributes. Shared occurrences all see this metadata.",+ "properties": {+ "changes": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "asPurchased": {+ "type": "boolean"+ },+ "description": {+ "type": "string"+ },+ "excludeFromBom": {+ "type": "boolean"+ },+ "name": {+ "type": "string"+ },+ "partNumber": {+ "type": "string"+ },+ "sourceUrl": {+ "type": "string"+ },+ "supplier": {+ "type": "string"+ },+ "supplierPartNumber": {+ "type": "string"+ }+ },+ "required": [],+ "type": "object"+ },+ "component": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "changes"+ ],+ "type": "object"+ },+ "entity_delete": {+ "description": "Delete sketch geometry or independently deletable timeline features. Model transaction and semantic recovery cover downstream failures; document and external file deletion are excluded.",+ "properties": {+ "entity": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "entity"+ ],+ "type": "object"+ },+ "export": {+ "description": "Export entire design using runtime-checked API. Preflight and unique same-filesystem staging preserve the destination on failure; publish only nonempty verified output. Availability differs by Fusion build. STL numeric coordinates use mm.",+ "properties": {+ "format": {+ "default": "step",+ "enum": [+ "step",+ "stl",+ "3mf",+ "f3d",+ "iges",+ "sat",+ "smt",+ "usdz",+ "fbx",+ "skp"+ ]+ },+ "outputPath": {+ "type": "string"+ },+ "overwrite": {+ "default": false,+ "type": "boolean"+ },+ "refinement": {+ "default": "medium",+ "enum": [+ "low",+ "medium",+ "high"+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "outputPath"+ ],+ "type": "object"+ },+ "feature_create": {+ "description": "Create a typed native solid feature. All length quantities are mm (or expressions), angles deg. Cut/intersect require explicit participant bodies. Join needs a single existing component body; combine selects multiple bodies explicitly. Feature availability is runtime-checked; missing APIs fail before commit.",+ "oneOf": [+ {+ "additionalProperties": false,+ "properties": {+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "direction": {+ "enum": [+ "positive",+ "negative",+ "symmetric"+ ]+ },+ "distance": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ },+ "operationId": {+ "type": "string"+ },+ "profiles": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "sessionId": {+ "type": "string"+ },+ "taper": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "extrude"+ ]+ }+ },+ "required": [+ "type",+ "profiles",+ "distance"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ },+ "operationId": {+ "type": "string"+ },+ "profiles": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "revolve"+ ]+ }+ },+ "required": [+ "type",+ "profiles",+ "axis",+ "angle"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "edges": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "radius": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "sessionId": {+ "type": "string"+ },+ "tangentChain": {+ "type": "boolean"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "fillet"+ ]+ }+ },+ "required": [+ "type",+ "edges",+ "radius"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "distance": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "edges": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "tangentChain": {+ "type": "boolean"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "chamfer"+ ]+ }+ },+ "required": [+ "type",+ "edges",+ "distance"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "faces": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "tangentChain": {+ "type": "boolean"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "thickness": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "type": {+ "enum": [+ "shell"+ ]+ }+ },+ "required": [+ "type",+ "faces",+ "thickness"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "depth": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "diameter": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "points": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "hole"+ ]+ }+ },+ "required": [+ "type",+ "points",+ "diameter",+ "depth",+ "bodies"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ },+ "operationId": {+ "type": "string"+ },+ "profiles": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "loft"+ ]+ }+ },+ "required": [+ "type",+ "profiles"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operation": {+ "enum": [+ "new_body",+ "join",+ "cut",+ "intersect"+ ]+ },+ "operationId": {+ "type": "string"+ },+ "path": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "profiles": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "sweep"+ ]+ }+ },+ "required": [+ "type",+ "profiles",+ "path"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "body": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keepTools": {+ "type": "boolean"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operation": {+ "enum": [+ "join",+ "cut",+ "intersect"+ ]+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "tools": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "type": {+ "enum": [+ "combine"+ ]+ }+ },+ "required": [+ "type",+ "body",+ "tools",+ "operation"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "extend": {+ "type": "boolean"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "split"+ ]+ }+ },+ "required": [+ "type",+ "bodies",+ "plane"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "angle": {+ "type": "number"+ },+ "axis": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "origin": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "translation": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "type": {+ "enum": [+ "move"+ ]+ }+ },+ "required": [+ "type",+ "bodies"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "mirror"+ ]+ }+ },+ "required": [+ "type",+ "bodies",+ "plane"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "axis2": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "count": {+ "maximum": 1000,+ "minimum": 2,+ "type": "integer"+ },+ "count2": {+ "maximum": 1000,+ "minimum": 1,+ "type": "integer"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "spacing": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "spacing2": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "rectangular_pattern"+ ]+ }+ },+ "required": [+ "type",+ "bodies",+ "axis",+ "count",+ "spacing"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "bodies": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "count": {+ "maximum": 1000,+ "minimum": 2,+ "type": "integer"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "circular_pattern"+ ]+ }+ },+ "required": [+ "type",+ "bodies",+ "axis",+ "count"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "faces": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "sessionId": {+ "type": "string"+ },+ "tangentChain": {+ "type": "boolean"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "draft"+ ]+ }+ },+ "required": [+ "type",+ "faces",+ "plane",+ "angle"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "designation": {+ "type": "string"+ },+ "faces": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "internal": {+ "type": "boolean"+ },+ "modeled": {+ "type": "boolean"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "additionalProperties": false,+ "properties": {+ "documentId": {+ "type": "string"+ },+ "revision": {+ "type": "string"+ }+ },+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "threadClass": {+ "type": "string"+ },+ "threadType": {+ "type": "string"+ },+ "type": {+ "enum": [+ "thread"+ ]+ }+ },+ "required": [+ "type",+ "faces",+ "internal",+ "threadType",+ "designation",+ "threadClass"+ ],+ "type": "object"+ }+ ],+ "properties": {+ "angle": {},+ "axis": {},+ "axis2": {},+ "bodies": {},+ "body": {},+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "count": {},+ "count2": {},+ "depth": {},+ "designation": {},+ "diameter": {},+ "direction": {},+ "distance": {},+ "edges": {},+ "extend": {},+ "faces": {},+ "internal": {},+ "keepTools": {},+ "modeled": {},+ "name": {+ "type": "string"+ },+ "operation": {},+ "origin": {},+ "path": {},+ "plane": {},+ "points": {},+ "profiles": {},+ "radius": {},+ "spacing": {},+ "spacing2": {},+ "tangentChain": {},+ "taper": {},+ "thickness": {},+ "threadClass": {},+ "threadType": {},+ "tools": {},+ "translation": {},+ "type": {+ "enum": [+ "extrude",+ "revolve",+ "fillet",+ "chamfer",+ "shell",+ "hole",+ "loft",+ "sweep",+ "combine",+ "split",+ "move",+ "mirror",+ "rectangular_pattern",+ "circular_pattern",+ "draft",+ "thread"+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "type"+ ],+ "type": "object"+ },+ "feature_edit": {+ "description": "Rename/suppress a feature or change expressions of model parameters whose createdBy is that exact feature; read health and abort on downstream errors.",+ "properties": {+ "feature": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "parameters": {+ "additionalProperties": {+ "type": "string"+ },+ "type": "object"+ },+ "suppressed": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "feature"+ ],+ "type": "object"+ },+ "health": {+ "description": "Read timeline warnings/errors. recompute:true also requires current target revision, sessionId and operationId.",+ "properties": {+ "recompute": {+ "default": false,+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "target"+ ],+ "type": "object"+ },+ "inspect": {+ "description": "Inspect the active Design without mutation. Returns target identity/revision, native component-space bodies and occurrence transforms, parameters and feature health.",+ "properties": {},+ "required": [+ "op"+ ],+ "type": "object"+ },+ "inspect_entity": {+ "properties": {+ "entity": {+ "description": "Exact reference returned by inspect; resolves uniquely with document/revision/type/occurrence guards.",+ "type": "object"+ }+ },+ "required": [+ "op",+ "target",+ "entity"+ ],+ "type": "object"+ },+ "interference": {+ "description": "Analyze root-context occurrences/body proxies; returns overlap volume mm3 or touching. Does not create interference bodies.",+ "properties": {+ "entities": {+ "items": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 2,+ "type": "array"+ },+ "includeTouching": {+ "type": "boolean"+ },+ "volumeTolerance": {+ "minimum": 0,+ "type": "number"+ }+ },+ "required": [+ "op",+ "target",+ "entities"+ ],+ "type": "object"+ },+ "joint_create": {+ "description": "Create an as-built joint without moving occurrences. Non-rigid motion requires explicit joint geometry; x/y/z are joint-coordinate directions. Limits and drive values use mm/deg. Seven native motion types; ball uses joint Z pitch/X yaw; planar uses native primary slide direction reported on readback. Geometry-moving regular joint creation is not exposed.",+ "oneOf": [+ {+ "additionalProperties": false,+ "properties": {+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "rigid"+ ]+ }+ },+ "required": [+ "type"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "geometry": {+ "additionalProperties": false,+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "rotationLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rotationValue": {+ "type": "number"+ },+ "sessionId": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "revolute"+ ]+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "geometry": {+ "additionalProperties": false,+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "sessionId": {+ "type": "string"+ },+ "slideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "slideValue": {+ "type": "number"+ },+ "suppressed": {+ "type": "boolean"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "slider"+ ]+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "geometry": {+ "additionalProperties": false,+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "rotationLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rotationValue": {+ "type": "number"+ },+ "sessionId": {+ "type": "string"+ },+ "slideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "slideValue": {+ "type": "number"+ },+ "suppressed": {+ "type": "boolean"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "cylindrical"+ ]+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "geometry": {+ "additionalProperties": false,+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "rotationLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rotationValue": {+ "type": "number"+ },+ "sessionId": {+ "type": "string"+ },+ "slideAxis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "slideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "slideValue": {+ "type": "number"+ },+ "suppressed": {+ "type": "boolean"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "pin_slot"+ ]+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "geometry": {+ "additionalProperties": false,+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "primarySlideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "primarySlideValue": {+ "type": "number"+ },+ "rotationLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rotationValue": {+ "type": "number"+ },+ "secondarySlideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "secondarySlideValue": {+ "type": "number"+ },+ "sessionId": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "planar"+ ]+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "geometry": {+ "additionalProperties": false,+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "pitchLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "pitchValue": {+ "type": "number"+ },+ "rollLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rollValue": {+ "type": "number"+ },+ "sessionId": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ },+ "target": {+ "type": "object"+ },+ "type": {+ "enum": [+ "ball"+ ]+ },+ "yawLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "yawValue": {+ "type": "number"+ }+ },+ "required": [+ "type",+ "geometry"+ ],+ "type": "object"+ }+ ],+ "properties": {+ "axis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "geometry": {+ "additionalProperties": false,+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "keyPoint": {+ "enum": [+ "center",+ "start",+ "middle",+ "end"+ ]+ }+ },+ "required": [+ "entity"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "occurrenceOne": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "occurrenceTwo": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "pitchLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "pitchValue": {+ "type": "number"+ },+ "primarySlideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "primarySlideValue": {+ "type": "number"+ },+ "rollLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rollValue": {+ "type": "number"+ },+ "rotationLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rotationValue": {+ "type": "number"+ },+ "secondarySlideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "secondarySlideValue": {+ "type": "number"+ },+ "slideAxis": {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ "slideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "slideValue": {+ "type": "number"+ },+ "suppressed": {+ "type": "boolean"+ },+ "type": {+ "enum": [+ "rigid",+ "revolute",+ "slider",+ "cylindrical",+ "pin_slot",+ "planar",+ "ball"+ ]+ },+ "yawLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "yawValue": {+ "type": "number"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "type",+ "occurrenceOne",+ "occurrenceTwo"+ ],+ "type": "object"+ },+ "joint_delete": {+ "description": "Delete one selected Joint or AsBuiltJoint with recovery verification.",+ "properties": {+ "joint": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "joint"+ ],+ "type": "object"+ },+ "joint_edit": {+ "description": "Edit joint name/suppression, enabled limits, rest and drive values; wrong motion type or out-of-limit values fail with recovery.",+ "properties": {+ "joint": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "pitchLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "pitchValue": {+ "type": "number"+ },+ "primarySlideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "primarySlideValue": {+ "type": "number"+ },+ "rollLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rollValue": {+ "type": "number"+ },+ "rotationLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "rotationValue": {+ "type": "number"+ },+ "secondarySlideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "secondarySlideValue": {+ "type": "number"+ },+ "slideLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "slideValue": {+ "type": "number"+ },+ "suppressed": {+ "type": "boolean"+ },+ "yawLimits": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "maximum": {+ "type": "number"+ },+ "maximumEnabled": {+ "type": "boolean"+ },+ "minimum": {+ "type": "number"+ },+ "minimumEnabled": {+ "type": "boolean"+ },+ "rest": {+ "type": "number"+ },+ "restEnabled": {+ "type": "boolean"+ }+ },+ "required": [],+ "type": "object"+ },+ "yawValue": {+ "type": "number"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "joint"+ ],+ "type": "object"+ },+ "material_assign": {+ "description": "Assign a loaded library or document material to an exact native Component/BRepBody; verify material ID readback with model transaction recovery. Query assembly_properties for resulting mass.",+ "properties": {+ "entity": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "libraryId": {+ "type": "string"+ },+ "materialId": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "entity",+ "materialId"+ ],+ "type": "object"+ },+ "material_list": {+ "description": "List loaded material libraries and matching materials by stable library/material IDs. Omit libraryId for document materials.",+ "properties": {+ "libraryId": {+ "type": "string"+ },+ "limit": {+ "maximum": 1000,+ "minimum": 1,+ "type": "integer"+ },+ "query": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "target"+ ],+ "type": "object"+ },+ "mcmaster_discover": {+ "description": "Discover Fusion native Insert McMaster-Carr command and requirements in the active design.",+ "properties": {},+ "required": [+ "op"+ ],+ "type": "object"+ },+ "mcmaster_open": {+ "description": "Invoke Fusion native McMaster UI in the targeted Hybrid design. Interactive external operation: completion/insert/cancel stays with Fusion; inspect afterward. Idempotency records launch only.",+ "properties": {},+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target"+ ],+ "type": "object"+ },+ "new_design": {+ "description": "Create an unnamed unsaved parametric hybrid Design; name is retained as requestedName metadata to keep failure recovery free of save dialogs. Optional box dimensions in mm create a driving-parameter fixture. Never edits an existing document.",+ "properties": {+ "box": {+ "additionalProperties": false,+ "properties": {+ "depth": {+ "exclusiveMinimum": 0,+ "type": "number"+ },+ "height": {+ "exclusiveMinimum": 0,+ "type": "number"+ },+ "width": {+ "exclusiveMinimum": 0,+ "type": "number"+ }+ },+ "required": [+ "width",+ "height",+ "depth"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId"+ ],+ "type": "object"+ },+ "occurrence_delete": {+ "description": "Delete one selected occurrence through the shared transaction executor.",+ "properties": {+ "occurrence": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "occurrence"+ ],+ "type": "object"+ },+ "occurrence_insert": {+ "description": "Insert another occurrence of an existing definition; independentCopy:true uses Paste New to create a separate definition. Nested placement is in parent component coordinates. Returns a representative root-context occurrence and all affectedOccurrences when the parent definition is reused.",+ "properties": {+ "component": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "independentCopy": {+ "type": "boolean"+ },+ "parent": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "transform": {+ "additionalProperties": false,+ "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.",+ "properties": {+ "angle": {+ "type": "number"+ },+ "axis": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "position": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ }+ },+ "required": [],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "component"+ ],+ "type": "object"+ },+ "occurrence_update": {+ "description": "Set occurrence pose in its assembly context and capture position; explicit grounding/ungrounding. Grounded or constrained transforms fail with recovery.",+ "properties": {+ "grounded": {+ "type": "boolean"+ },+ "groundedToParent": {+ "type": "boolean"+ },+ "occurrence": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "transform": {+ "additionalProperties": false,+ "description": "Absolute rotation about the given nonzero axis through origin (deg), then translation (mm). Create/insert use parent component coordinates; updates use the selected occurrence assembly context.",+ "properties": {+ "angle": {+ "type": "number"+ },+ "axis": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ },+ "position": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 3,+ "type": "array"+ }+ },+ "required": [],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "occurrence"+ ],+ "type": "object"+ },+ "parameter_batch": {+ "description": "Atomic sequential create/set/delete parameter edits with one recompute+health gate; delete supports user parameters only. Any failure aborts all edits and reports semantic recovery.",+ "properties": {+ "changes": {+ "items": {+ "oneOf": [+ {+ "additionalProperties": false,+ "properties": {+ "action": {+ "enum": [+ "create"+ ]+ },+ "comment": {+ "type": "string"+ },+ "expression": {+ "type": "string"+ },+ "name": {+ "type": "string"+ },+ "unit": {+ "enum": [+ "mm",+ "deg",+ "kg",+ ""+ ]+ }+ },+ "required": [+ "action",+ "name",+ "expression",+ "unit"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "action": {+ "enum": [+ "set"+ ]+ },+ "expression": {+ "type": "string"+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "action",+ "name",+ "expression"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "action": {+ "enum": [+ "delete"+ ]+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "action",+ "name"+ ],+ "type": "object"+ }+ ]+ },+ "maxItems": 128,+ "minItems": 1,+ "type": "array"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "changes"+ ],+ "type": "object"+ },+ "parameter_create": {+ "properties": {+ "comment": {+ "type": "string"+ },+ "expression": {+ "type": "string"+ },+ "name": {+ "type": "string"+ },+ "unit": {+ "enum": [+ "mm",+ "deg",+ "kg",+ ""+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "name",+ "expression",+ "unit"+ ],+ "type": "object"+ },+ "parameter_set": {+ "description": "Set an expression, recompute and inspect health. Failure restores old expression and reports a semantic recovery witness; not an atomic transaction.",+ "properties": {+ "expression": {+ "type": "string"+ },+ "name": {+ "type": "string"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "name",+ "expression"+ ],+ "type": "object"+ },+ "plane_create": {+ "description": "Create offset plane (offset in mm) or angled plane around axis (angle in deg).",+ "oneOf": [+ {+ "additionalProperties": false,+ "properties": {+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "offset": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "offset"+ ]+ }+ },+ "required": [+ "type",+ "offset"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "op": {+ "type": "string"+ },+ "operationId": {+ "type": "string"+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "sessionId": {+ "type": "string"+ },+ "target": {+ "required": [+ "documentId",+ "revision"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "angle"+ ]+ }+ },+ "required": [+ "type",+ "axis",+ "angle"+ ],+ "type": "object"+ }+ ],+ "properties": {+ "angle": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "axis": {+ "oneOf": [+ {+ "enum": [+ "x",+ "y",+ "z"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "offset": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ },+ "type": {+ "enum": [+ "offset",+ "angle"+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "type"+ ],+ "type": "object"+ },+ "rigid_group_create": {+ "description": "Create a native rigid group from exact occurrence instances; includeChildren defaults true.",+ "properties": {+ "includeChildren": {+ "type": "boolean"+ },+ "name": {+ "type": "string"+ },+ "occurrences": {+ "items": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 2,+ "type": "array"+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "occurrences"+ ],+ "type": "object"+ },+ "rigid_group_delete": {+ "description": "Delete an exact rigid group with transaction recovery.",+ "properties": {+ "group": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "group"+ ],+ "type": "object"+ },+ "rigid_group_edit": {+ "description": "Rename or suppress an exact rigid group with transaction recovery.",+ "properties": {+ "group": {+ "description": "Guarded reference from inspect in this document/revision; occurrence references retain instance context.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "suppressed": {+ "type": "boolean"+ }+ },+ "required": [+ "op",+ "target",+ "sessionId",+ "operationId",+ "group"+ ],+ "type": "object"+ },+ "sketch_constraint": {+ "description": "Constrain entities in one sketch. midpoint order is point,line; symmetry order entity1,entity2,symmetryLine. fix sets one entity fixed.",+ "properties": {+ "entities": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "sketch": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "horizontal",+ "vertical",+ "coincident",+ "parallel",+ "perpendicular",+ "tangent",+ "equal",+ "concentric",+ "collinear",+ "midpoint",+ "symmetry",+ "fix"+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "type",+ "entities"+ ],+ "type": "object"+ },+ "sketch_create": {+ "description": "Create a native component-definition sketch on an origin/construction plane or planar face. Coordinates in subsequent geometry are sketch-space mm.",+ "properties": {+ "component": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "name": {+ "type": "string"+ },+ "plane": {+ "oneOf": [+ {+ "enum": [+ "xy",+ "xz",+ "yz"+ ]+ },+ {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target"+ ],+ "type": "object"+ },+ "sketch_dimension": {+ "description": "Add driving dimensions. Distance uses two point references; radius/diameter one curve; angle two lines. Numeric expressions use mm or deg.",+ "properties": {+ "entities": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "expression": {+ "oneOf": [+ {+ "type": "number"+ },+ {+ "type": "string"+ }+ ]+ },+ "parameterName": {+ "type": "string"+ },+ "position": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "sketch": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "type": {+ "enum": [+ "distance",+ "horizontal",+ "vertical",+ "radius",+ "diameter",+ "angle"+ ]+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "type",+ "entities",+ "expression",+ "position"+ ],+ "type": "object"+ },+ "sketch_edit": {+ "description": "Move sketch points/endpoints/centers in sketch-space mm, change radius or construction/fixed flags; solver failure aborts the operation.",+ "properties": {+ "changes": {+ "additionalProperties": false,+ "minProperties": 1,+ "properties": {+ "center": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "construction": {+ "type": "boolean"+ },+ "end": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "fixed": {+ "type": "boolean"+ },+ "position": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "radius": {+ "type": "number"+ },+ "start": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ }+ },+ "required": [],+ "type": "object"+ },+ "entity": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "sketch": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "entity",+ "changes"+ ],+ "type": "object"+ },+ "sketch_geometry": {+ "description": "Create a transactionally grouped set of sketch primitives. Numeric geometry uses mm and arc sweeps/polygon angles use deg.",+ "properties": {+ "items": {+ "items": {+ "oneOf": [+ {+ "additionalProperties": false,+ "properties": {+ "position": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "type": {+ "enum": [+ "point"+ ]+ }+ },+ "required": [+ "type",+ "position"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "construction": {+ "type": "boolean"+ },+ "end": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "start": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "type": {+ "enum": [+ "line"+ ]+ }+ },+ "required": [+ "type",+ "start",+ "end"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "construction": {+ "type": "boolean"+ },+ "end": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "start": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "type": {+ "enum": [+ "rectangle"+ ]+ }+ },+ "required": [+ "type",+ "start",+ "end"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "center": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "construction": {+ "type": "boolean"+ },+ "radius": {+ "exclusiveMinimum": 0,+ "type": "number"+ },+ "type": {+ "enum": [+ "circle"+ ]+ }+ },+ "required": [+ "type",+ "center",+ "radius"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "center": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "construction": {+ "type": "boolean"+ },+ "start": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "sweep": {+ "type": "number"+ },+ "type": {+ "enum": [+ "arc"+ ]+ }+ },+ "required": [+ "type",+ "center",+ "start",+ "sweep"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "angle": {+ "type": "number"+ },+ "center": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "construction": {+ "type": "boolean"+ },+ "radius": {+ "exclusiveMinimum": 0,+ "type": "number"+ },+ "sides": {+ "maximum": 128,+ "minimum": 3,+ "type": "integer"+ },+ "type": {+ "enum": [+ "polygon"+ ]+ }+ },+ "required": [+ "type",+ "center",+ "radius",+ "sides"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "construction": {+ "type": "boolean"+ },+ "end": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "start": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "type": {+ "enum": [+ "slot"+ ]+ },+ "width": {+ "exclusiveMinimum": 0,+ "type": "number"+ }+ },+ "required": [+ "type",+ "start",+ "end",+ "width"+ ],+ "type": "object"+ },+ {+ "additionalProperties": false,+ "properties": {+ "closed": {+ "type": "boolean"+ },+ "construction": {+ "type": "boolean"+ },+ "points": {+ "items": {+ "items": {+ "type": "number"+ },+ "maxItems": 3,+ "minItems": 2,+ "type": "array"+ },+ "maxItems": 128,+ "minItems": 2,+ "type": "array"+ },+ "type": {+ "enum": [+ "spline"+ ]+ }+ },+ "required": [+ "type",+ "points"+ ],+ "type": "object"+ }+ ]+ },+ "maxItems": 128,+ "minItems": 1,+ "type": "array"+ },+ "sketch": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "items"+ ],+ "type": "object"+ },+ "sketch_project": {+ "description": "Project selected topology into a sketch with Fusion associative projection.",+ "properties": {+ "entities": {+ "items": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ },+ "maxItems": 256,+ "minItems": 1,+ "type": "array"+ },+ "sketch": {+ "description": "Reference returned by inspect/inspect_entity in this document revision; native component-definition references for authoring.",+ "required": [+ "documentId",+ "revision",+ "objectType"+ ],+ "type": "object"+ }+ },+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target",+ "sketch",+ "entities"+ ],+ "type": "object"+ },+ "transaction_probe": {+ "description": "Verify runtime PTransaction abort+commit using temporary user parameters, remove probe data and compare semantic restoration. Required once per running add-in session before feature/sketch/atomic-batch writes. Returns fresh target; inspect again for current references.",+ "properties": {},+ "required": [+ "op",+ "sessionId",+ "operationId",+ "target"+ ],+ "type": "object"+ }+ },+ "sessionId": "required for writes from mech_capabilities",+ "target": "existing-document writes: {documentId,revision} from inspect"+ },+ "longRunning": true,+ "name": "fusion_mechanical",+ "output": {+ "data": "operation result including fresh target",+ "errorCode": "stable str on failure",+ "operationId": "str on writes",+ "recovery": "reported on failed mutation",+ "sessionId": "str",+ "success": "bool"+ },+ "statusVerb": "fusion_mech_operation_status",+ "summary": "Guarded main-thread parametric parts and assemblies: sketches, solid features, atomic parameter edits, component definitions/copies/placement, seven as-built joint motions and limits, rigid groups, interference, materials and assembly mass/center of mass, local supplier STEP/SAT import with SHA/provenance, native McMaster command, structured/flat BOM CSV, topology readback, health and safe exports. Typed model mutations use runtime-proven PTransaction recovery; transaction_probe verifies the backend (new_design does this automatically). Writes require sessionId,operationId and current target {documentId,revision}. Retry exact args with the same ID; query status after timeout. References expire on model changes. Files/document lifecycle are outside model transactions.",+ "timeoutSeconds": 300+ }, { "example": {}, "input": {
dashboard/Cargo.lock+1−1@@ -4,7 +4,7 @@ version = 4 [[package]] name = "fusion-dashboard"-version = "1.11.9"+version = "1.12.0-dev.3" dependencies = [ "serde_json", ]
dashboard/Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "fusion-dashboard"-version = "1.11.9"+version = "1.12.0-dev.3" edition = "2021" [dependencies]
describe.py+12−1@@ -9,10 +9,21 @@ Each entry: name, summary, input, output, timeoutSeconds, statusVerb, longRunnin example. Keep this in step with the actual handlers as verbs are added. """ +import json+from pathlib import Path++_MECHANICAL_SCHEMA = json.loads((Path(__file__).parent / "addin/AdomBridge/commands/mechanical/schema.json").read_text(encoding="utf-8")) _STATUS = "fusion_get_app_state" # Compact source table: name -> (summary, input, output, timeout, statusVerb, longRunning, example) _T = [+ ("fusion_mech_capabilities", "Discover typed mechanical operations, exact input schemas, units, recovery limitations and current add-in session ID.",+ {}, {"success":"bool", "sessionId":"str", "operations":_MECHANICAL_SCHEMA, "transactions":"object", "idempotency":"object"}, 30, None, False, {}),+ ("fusion_mechanical", "Guarded main-thread parametric parts and assemblies: sketches, solid features, atomic parameter edits, component definitions/copies/placement, seven as-built joint motions and limits, rigid groups, interference, materials and assembly mass/center of mass, local supplier STEP/SAT import with SHA/provenance, native McMaster command, structured/flat BOM CSV, topology readback, health and safe exports. Typed model mutations use runtime-proven PTransaction recovery; transaction_probe verifies the backend (new_design does this automatically). Writes require sessionId,operationId and current target {documentId,revision}. Retry exact args with the same ID; query status after timeout. References expire on model changes. Files/document lifecycle are outside model transactions.",+ {"op":"required enum: " + "|".join(_MECHANICAL_SCHEMA), "sessionId":"required for writes from mech_capabilities", "operationId":"required unique write ID; reuse unchanged for retry", "target":"existing-document writes: {documentId,revision} from inspect", "operationSchemas":_MECHANICAL_SCHEMA},+ {"success":"bool", "sessionId":"str", "operationId":"str on writes", "data":"operation result including fresh target", "errorCode":"stable str on failure", "recovery":"reported on failed mutation"}, 300, "fusion_mech_operation_status", True, {"op":"inspect"}),+ ("fusion_mech_operation_status", "Read a mechanical operation result retained after HTTP timeout. Runs outside Fusion's main-thread queue, including while a model mutation is running. Old add-in session IDs fail closed; absence is unknown outcome, not proof a mutation never ran. A native call monopolizing Python's GIL may still delay all Python responses.",+ {"sessionId":"required str", "operationId":"required str"}, {"success":"bool", "state":"running|succeeded|failed", "result":"original result"},30,None,False,{}), ("fusion_routing_state", "Read the live board's identity, geometry revision, pads, copper and per-net airwires from a fresh Fusion export.", {"expectDocument":"required exact active board name","boardId":"optional document creationId guard"}, {"boardId":"str","revision":"str","nets":"list","pads":"list","segments":"list","vias":"list","remainingNets":"list"},60,"fusion_routing_state",False,{"expectDocument":"fusion-routing"}),@@ -75,7 +86,7 @@ _T = [ {}, {"count": "int", "tools": "list"}, 45, "fusion_mcp_status", False, {}), ("fusion_mcp_call", "Call any tool on Autodesk's Fusion MCP server (fusion_mcp_read, fusion_mcp_update, fusion_mcp_execute, fusion_mcp_electronics_read). The bridge handles the MCP streamable-HTTP handshake for you (initialize -> MCP-Session-Id -> notifications/initialized) and re-establishes a dropped session automatically. MCP acts on the ACTIVE Fusion document, so open one first. PREFER a native fusion_* verb when one exists - they are tested here and return richer hints - and reach for MCP for Autodesk's text-to-CAD surface.", {"tool": "required str (from fusion_mcp_tools)", "arguments": "optional obj (per that tool's inputSchema)", "timeout": "optional int seconds, default 120"},- {"result": "obj", "tool": "str"}, 150, "fusion_mcp_status", True, {"tool": "fusion_mcp_read", "arguments": {"queryType": "summary"}}),+ {"result": "obj", "tool": "str"}, 150, "fusion_mcp_status", True, {"tool": "fusion_mcp_read", "arguments": {"queryType": "activeCommand"}}), ("fusion_mcp_resources", "List Autodesk MCP resources, or read one by uri. These are mostly the Electronics entity schemas (resource://mcp.electronics_schema_*) that describe what fusion_mcp_electronics_read can return.", {"uri": "optional str (omit to list)"}, {"count": "int", "resources": "[str]", "result": "obj"}, 60, "fusion_mcp_status", False, {}),
docs/MECHANICAL.mdadded+82@@ -0,0 +1,82 @@+# Mechanical design bridge++Mechanical operations use three public verbs: `fusion_mech_capabilities`, `fusion_mechanical` and `fusion_mech_operation_status`. Discover the live schema before constructing a request. Each operation returns `success`; inspect that field after unwrapping the Bridge transport envelope.++## Start a session++1. Call `fusion_mech_capabilities {}`. Keep its `sessionId` and operation schemas.+2. Call `fusion_mechanical {"op":"inspect"}`. Keep the returned `data.target` and entity references.+3. Before transactional sketch, feature, assembly, supplier-import, material or atomic parameter mutations on an existing document, call `transaction_probe` with the session ID, a new operation ID and the current target. It proves commit/abort on this Fusion session using a temporary parameter, removes the probe and returns a fresh target. `new_design` performs this probe automatically when needed.+4. Use the exact fresh target for the next write. Fetch references again after edits; old revisions are deliberately rejected. Pass reference objects unchanged, including the opaque `rootComponentId` used for root-component references.++To create a separate design, call `new_design` with the session ID and a unique operation ID. The optional `box` accepts width/height/depth in mm as a simple parametric fixture. A requested name is metadata; the scratch document remains unnamed until an explicit save to avoid Fusion's save dialogs.++```json+{+ "op": "new_design",+ "sessionId": "<from capabilities>",+ "operationId": "part-create-001",+ "name": "Mounting bracket"+}+```++Existing-document mutations also require `target: {"documentId":"...","revision":"..."}` from inspection. Never fabricate or cache these values across an add-in restart.++## Build a parametric part++Create a sketch with `sketch_create` on `xy`, `xz`, `yz`, a construction plane or a planar face. Use `sketch_geometry` for points, lines, rectangles, circles, arcs, polygons, slots and fitted splines. Geometry coordinates are sketch-space mm; arc sweeps and polygon angles are degrees. Use `sketch_constraint` and `sketch_dimension` to express design intent, then inspect the sketch for fully-constrained state, curves, points, dimension parameters and profile references.++Pass current profile references to `feature_create`. The schema enumerates extrusion, revolve, fillet, chamfer, shell, hole, loft, sweep, combine, split, move, mirror, rectangular/circular pattern, draft and thread inputs. Creation targets a native component definition. Assembly-context proxy geometry is for inspection; obtain native references when authoring a definition. Cut/intersect operations require explicit participant bodies. Join requires an unambiguous single body; use combine for explicit multiple-body selection.++Use `feature_edit` to rename or suppress a feature or change the expressions of parameters owned by that feature. `entity_delete` handles supported native deletable entities. `parameter_batch` groups user-parameter creation/deletion and user/model-parameter expression edits in one measured model transaction. Generic mixed operations with file/cloud rollback are outside this contract.++## Retry and recovery++Give each write a unique `operationId`. After a transport timeout, query `fusion_mech_operation_status` with that ID and the same session ID. A retry must use the exact original arguments and ID; it returns the recorded result rather than repeating a completed operation. Reusing an ID with different arguments is refused. The ledger is memory-only, limited to 2,000 operations per add-in session, and does not evict old results.++A restart changes the session ID. Previous results are then unknown: inspect the document before deciding whether a new operation is appropriate. Busy-state polling uses an HTTP path that does not wait for Fusion's main CAD thread.++A failed transactional typed model operation reports its abort result and a semantic recovery witness. Standalone `parameter_set` and `parameter_create` instead use measured compensating recovery and report `transactional:false`. `recovery.verified:false` means restoration was not proved. Successful publication followed by temporary-file cleanup failure remains a success with a warning. An operation committed successfully but failing subsequent inspection returns `refreshRequired`; read the model again before continuing.++## Export and save++`export` writes to a temporary sibling location, verifies nonempty output, then publishes to the requested path. Overwrite is explicit. Runtime format support is checked; unsupported requests preserve existing destination files. Results include byte count and SHA-256. STL coordinates are mm. Native F3D preserves Fusion data more fully than neutral geometry formats; never assume supplier attributes survive a STEP roundtrip.++`fusion_save_to_cloud` handles an explicit cloud project/folder/name. The typed export operation creates a local archive or exchange file and does not itself create a Fusion Team version.++## Coverage and verification++See [build handoff](build-2026-10-02.md) for the verified checkpoint and live host. See the [feature matrix](mechanical-comparison/FEATURE-MATRIX.md) for each surveyed external capability, its bridge route and remaining gaps. A discoverable native API or arbitrary Python execution does not establish that a dedicated bridge operation is implemented or live verified.++## Assemble parts++`component_create` creates an internal definition and its first occurrence. These operations require a Hybrid design; they never silently change the intent of an existing Part or Assembly design. `occurrence_insert` reuses a definition, or uses `independentCopy:true` to create a separate definition. `parent` is a component-definition reference, so adding children to it affects every instance of that definition.++Create/insert transforms use parent-component coordinates. Creation, insertion and CAD import apply the requested pose to every currently placed parent instance, capture pending positions, and verify the resulting root-context matrices after recompute; `affectedOccurrences` lists these instances and `placementScope` is `all_current_parent_instances`. The definition-local base transform can differ from the computed position after a capture. Occurrence updates use the selected instance's assembly context. The transform input uses `position:[x,y,z]` in mm and `axis:[x,y,z]`, `angle` in degrees; it specifies an absolute pose. `occurrence_update` can ground/unground explicitly and captures changed positions in the timeline. Constrained or grounded placements refuse changes that cannot be applied and measured.++`joint_create` creates an **as-built** rigid, revolute, slider, cylindrical, pin-slot, planar or ball joint. First place the occurrences, then supply exact occurrence references and joint geometry for non-rigid motion. Joint axes are in joint coordinates. Read the returned unit metadata: joint-geometry transform matrices retain explicitly labeled native cm translations, while motion values use mm/degrees. `joint_edit` reads/sets enabled limits, rest positions and motion values in mm/degrees, and rejects out-of-limit driving. Rigid groups have separate create/edit/delete operations. Joint and group suppression changes capture pending native state before recompute; responses report `positionCaptured`. Geometry-moving regular joints and full motion-study authoring remain comparison gaps.++`interference` analyzes selected occurrence instances or root-context body proxies and returns overlap volumes without adding interference bodies to the model. `assembly_properties` reads whole-assembly, component, occurrence or body mass, volume, area and center of mass with explicit units and coordinate scope. Material values reflect Fusion's assigned/default materials; they are not a supplier certification.++## McMaster and purchased CAD++`mcmaster_discover` reports availability of Fusion's native Insert McMaster-Carr command. `mcmaster_open` launches its interactive supplier picker in the targeted Hybrid design. Its recorded result is a launch request, not proof that a part was inserted. Inspect again after insertion or cancellation. This operation does not place orders.++For an already downloaded model, use `cad_import` with an absolute host-local STEP/SAT filename, optional expected `sha256`, and provenance:++```json+{+ "supplier": "McMaster-Carr",+ "supplierPartNumber": "3597N17",+ "sourceUrl": "https://www.mcmaster.com/3597N17/",+ "description": "Supplier CAD downloaded for this part"+}+```++The importer hashes the actual source file, imports into a new wrapper component, and stores supplier/part number/URL/source path/checksum in native attributes. Caller-supplied supplier labels do not authenticate the download; retain the original supplier file/receipt. Imports are treated as purchased subassemblies by default. Use `component_metadata` for part number, description and BOM policy; `material_list` and `material_assign` use loaded library/material IDs.++## Generate a mechanical BOM++`bom` returns grouped purchasing parts plus a structured instance tree. It distinguishes component definitions from repeated occurrences, includes root-owned bodies, and keeps distinct same-named components separate. A purchased subassembly counts as one purchased item unless `explodePurchased:true`. `excludeFromBom` removes that purchasing subtree; physical totals still include its unsuppressed bodies. Typed BOM JSON and CSV publication responses declare `calculationAccuracy:"high"`, matching the high-accuracy physical-property workflow.++`bom_export` writes `mode:"flat"` or `mode:"structured"` CSV to an absolute `filename`, with explicit overwrite and staged publication. Rows retain supplier provenance. Quantities do not depend on component display names. Save an F3D archive to retain Fusion metadata; STEP metadata persistence is not promised. Traversal budgets fail explicitly rather than presenting a truncated BOM as complete.
docs/build-2026-10-02.mdadded+92@@ -0,0 +1,92 @@+# three-musketeers build — Fusion mechanical design — 2026-10-02++## What was built++The development build adds 39 typed mechanical operations to the existing Fusion bridge: guarded document/entity targeting, recoverable edits and verified exports; constrained sketches and 16 solid-feature families; internal assemblies, seven as-built joint motions, rigid groups, interference, material/physical properties, supplier CAD and mechanical BOM workflows. All three checkpoints passed independent live verification on Windows Fusion 2705.1.11. The final build is `1.12.0-dev.3` on development branch `mechanical-design-2026-10-02`. Root independently ran 71 mechanical Python tests; unchanged hygiene/routing suites add 30 passing tests, and the Rust workspace has 56 passing tests. Checkpoint 3 retains 815 exact native checks: 408 behavioral assertions and 407 availability/inspection checks, with no retained failure. These are assertions, not 815 distinct workflows. [Checkpoint reports](mechanical-verification/CP3-VERIFICATION.md) explain scope and evidence provenance.++McMaster support has two explicit paths: launch Fusion's native interactive supplier picker, or import an actual downloaded STEP/SAT file with checksum and native supplier attributes. BOM operations group definitions and count repeated/nested instances, support purchased-subassembly collapse/explode/exclusion, and export flat or structured CSV. Physical totals remain independent of purchasing exclusions.++The [comparison evidence](mechanical-comparison/README.md) records 695 source entries from sixteen repositories, 122 grouped action variants, 64 resource/prompt/protocol entries, the live official desktop MCP schema and published Data/Compute capabilities. Every inventoried entry has a gap flag. The [remaining scope](mechanical-comparison/REMAINING-GAPS.md) includes regular geometry-moving joints, advanced sketch operations, configurations, drawings, surface/form/mesh, sheet metal, CAM and simulation. Source registrations, working external implementations and our live-tested behavior are distinguished.++The [Compute assessment](mechanical-comparison/autodesk-compute.md) records access prerequisites, client support and optional cloud-job opportunities. We have not authenticated this account to the new service.++## Decisions for you++The implementation and verification are complete for the agreed first three milestones. The remaining release decision is to review and merge the development PR, then use the normal release process. This build does not merge the default branch or publish a production registry version. The original host bridge and update preference have been restored. Recommend a separate follow-on for regular joints and the advanced sketch/inspection gaps before expanding into drawings, manufacturing or cloud execution. The existing as-built joint and interactive supplier scope is explicit in the guide; Autodesk Compute entitlement and behavior were not authenticated with this account.++## Key decisions made during the build++- Group CAD operations under discoverable schemas instead of adding a top-level verb for every API method. Keep the existing Rust bridge and in-process Python add-in.+- Treat native entity tokens as references requiring document/context validation, not globally unique immutable IDs. Track unsaved duplicate documents within the current add-in session.+- Separate the HTTP request waiter from the operation ledger. A timed-out caller can retrieve the recorded outcome; a changed session rejects an old retry instead of silently repeating it.+- Keep newly created scratch documents unnamed. Requested names are metadata until a save workflow can avoid Fusion's named-unsaved-document prompts.+- Treat filesystem publication as its own commit point. After publication, cleanup errors are warnings; model recovery cannot undo a written file.+- Compare source implementations and live results separately. Several external drawing/sheet-metal commands are placeholders or call mismatched APIs; those are flagged individually.+- Read back positions and joint settings after Fusion recomputes. A successful API assignment can leave a pending position that recompute discards; capture it within the transaction and verify each affected assembly context before committing.+- Keep BOM purchasing rules separate from physical accounting. Excluding or collapsing purchased assemblies changes rows, while mass and volume still count the modeled physical instances at explicit high calculation accuracy.++---++## Process appendix++**Task:** Build audit milestones 1–3, include McMaster and BOM, record MCP coverage and assess Autodesk Compute. **Stage:** development. **Models:** independent Codex Builder, Adversary and Verifier; the skill's default Opus/Sonnet were unavailable in this session.++### Checkpoints++| Checkpoint | Version | State | Evidence |+|---|---|---|---|+| Foundation | 1.12.0-dev.1 | Published development branch, commit 910e4c8f4ca7 | 21 mechanical + 6 document-hygiene + 24 routing Python tests; 29 Rust tests; 59 live behavioral and 38 inspection checks |+| Parametric parts | 1.12.0-dev.2 | Published development branch, commit f6c3af18ecb4 | 39 mechanical Python tests; Rust workspace tests; Windows release build; all 16 solid-feature families exercised live; 200 behavioral + 298 inspection checks |+| Assemblies / McMaster / BOM | 1.12.0-dev.3 | Accepted development checkpoint | 71 mechanical + 6 hygiene + 24 routing Python tests; 56 Rust workspace tests; Windows release build. 408 native behavioral + 407 availability/inspection checks, including 12 mechanical fixture groups and the native picker. |++### Adversary findings resolved++| Finding | Location | Severity | Resolution |+|---|---|---|---|+| Fast main-thread callback precedes HTTP waiter registration | addin/AdomBridge/http_server.py | High | Register waiter before event scheduling; independent immediate-callback reproducer passes. |+| Export reports preserved destination after replacement followed by cleanup failure | commands/mechanical/exporting.py | Medium | Record publication separately; report cleanup warning. Independent temporary-directory and hardlink cleanup probes pass. |+| BOM CSV cleanup can hide completed publication | commands/assembly_bom.py | Medium | Same publication boundary; independent probe passes. |++### Independent baseline verification++On `adom_drew2`, Fusion 2705.1.11: native PTransaction abort restored both a parameter and dependent solid volume; commit preserved the change; F3D export/reopen preserved it. This baseline proved the host mechanisms and is separate from certification of the new typed operations. The original pristine document was preserved during the probe; task scratch documents were closed.++Original host installation was Fusion bridge 1.11.9, add-in 1.0.20, without a development pin. After final acceptance, the original cache files were restored from hash-checked backups, task-added runtime source files were removed, Fusion restarted, and the development pin was removed. Readiness confirms bridge 1.11.9 / add-in 1.0.20 with no stale add-in; bridge_list confirms one running instance and devPinned=false. Only one pristine, unmodified Untitled document remains. Tested development payloads, backups and evidence are retained; other bridge pins and user configuration were not changed.++### Checkpoint 1 live gate++Fusion 2705.1.11 passed 37 core behavioral assertions and 22 assembly assertions, plus 38 inspection/oracle checks. These cover parameter-driven geometry, failed-edit restoration, retry identity, document/revision rejection, non-destructive exports, native archive roundtrip, occurrence/body/face context and repeated/nested BOM quantities. A literal duplicate-name case could not be constructed because Fusion automatically renamed the second internal component; it is explicitly unverified live and covered by offline identity tests. One initial harness expectation was corrected from unsupported_format to the stricter invalid_input response; the refusal and unchanged sentinel both passed.++Live testing found and resolved two additional defects before publication: bridge-injected caller metadata was rejected by strict validation; and Occurrence exposes suppression through timelineObject, not a direct isSuppressed property. Both have regressions and independent review. The final tested runtime archive SHA-256 is 6309c21bf46decc4768f28fe27ec7b1938355ea3226ad26a373c8e52c7391400. Scratch documents were closed; the original pristine document was preserved.++### Checkpoint 2 pre-live review++The reviewed source has 19 typed mechanical operations and 16 solid-feature variants. Five defects were fixed before deployment: profile inspection returned a reference that could not be resolved again; semantic recovery omitted healthy feature names and standalone-point fixedness; symmetric extrusion ignored taper; and polygon/slot generation dropped nonzero Z. Independent focused reproducers now pass. Operation status and capability queries bypass a held main-thread lock without touching the Fusion API. Kernel behavior remains subject to the live gate.++### Checkpoint 2 live gate++All 16 advertised solid-feature families now have independent real-geometry evidence on Fusion 2705.1.11, including modeled M6 threads. The constrained plate workflow also passed dimension-driven edits, feature rename/radius changes/suppress/unsuppress/delete, projection, stale-reference refusal, failed atomic parameter-batch restoration and status retrieval during a busy main CAD thread. Native archives reopened with matching geometry, parameters and timeline.++Two live defects were fixed before publication: ConstructionPlane/ConstructionAxis use component for ownership; and rectangular patterns must explicitly disable Fusion's implicit second direction. One-axis count 3 now yields exactly 3 bodies / 72 mm³; explicit second direction yields 6 bodies / 144 mm³. Incomplete second-direction arguments refuse and restore unchanged state. The final runtime archive SHA-256 is f389e394253198cb2af69fcd155a62043c09b8934920cd1fe98d9f4d7591958e. Test-owned documents were exported/reopened and closed; the original pristine document remains.++### Checkpoint 3 source review++Three medium findings were fixed before the live gate: nested body/face/edge references needed exact occurrence-path resolution; material readback had to compare material IDs rather than display names; and interference traversal needed a shared body budget across all selected subassemblies. The independent final source pass rejected 22,000 physical instances before kernel invocation.++The documentation review also corrected regular-versus-as-built joint coverage, missing inertia/mesh-analysis capabilities, transaction-probe prerequisites and material readback wording. These are reflected in the per-feature gap flags rather than counted as complete parity.++### Checkpoint 3 live corrections++Native tests exposed assumptions that offline API stand-ins could not certify. A newly created nested occurrence must be converted to its root assembly contexts before requesting a token. Actual supplier STEP geometry includes degenerate edges and grouped imported features without a readable timeline index; these now retain explicit topology/availability information in inspection and recovery witnesses. Joint driving requires a captured position before recompute; the native probe proved this preserves configured rest values and allows transaction abort to restore the original witness.++The next native pass confirmed supplier import, repeated purchasing quantities and CSV/archive provenance, and all six moving-joint poses. It also exposed duplicate API-equal token results and suppression that becomes pending snapshot state. Strict joint/group edit readback now verifies names, suppression, numeric limits/rest values and enabled flags, including the implicit enabling of supplied limits. Typed BOM physical totals use explicit high calculation accuracy to match assembly properties; the initial default-accuracy mismatch remains in the verification evidence. Final acceptance is recorded in the checkpoint report.++### Checkpoint 3 final acceptance++The last live defect was an independent copy returning success at the source position instead of its requested position. A separate native probe proved that pending positions need capture and nested placement must use root-context proxies. The corrected create/insert/import path applies each requested parent-space pose in every current parent context, captures once, and checks all computed matrices before commit. The final native regression covers root copies, rotated/repeated subassemblies, later third/fourth parent reuse, source parameter edits, independent geometry and F3D reopen. A definition-local base transform is not substituted for an instance's computed position.++The final exact evidence set is 244 checks from focused run `cp3-123613-f8a50491`, 542 checks from nine complete unaffected groups in `cp3-121116-6159c012`, and 29 native McMaster picker checks from `cp3-114558-46db347b`. The earlier copy-position failure remains in the raw evidence and is linked to its passing regression; it was not relabeled or omitted silently. Root independently matched every retained case/status/detail against those raw runs and verified 11 artifact hashes. Native results include all seven joint motions, limits/rollback and suppression, rigid-group lifecycle, interference, material/physical totals, genuine McMaster STEP geometry, repeated purchased quantities, CSV output and native provenance persistence.++Final runtime archive SHA-256: `5662cea028729195f23395f58343a4a7a28ff224722a473ff5aa8806be11cc6f`. Native executable SHA-256: `72c94ce3d1f0ed1a7fc463a399c693570bc3c46316898ababd2d432a4b453be8`. All 51 runtime manifest files were verified; loaded module hashes also matched. The final adversary pass found no remaining actionable source defect and independently passed nine root-proxy placement fault checks. Earlier review findings and native failures are preserved in [the source review](mechanical-verification/CP3-SOURCE-REVIEW.md) and [live report](mechanical-verification/CP3-VERIFICATION.md).++Evidence roots in the shared workspace are `research/fusion-mechanical-build-2026-10-02/` and `research/fusion-mechanical-verification-2026-10-02/`. They contain exact source snapshots, deployment/restoration receipts, raw cases, native archives, CSVs and the final adjudication. The comparison record was independently checked for all 695 source rows, 122 selector rows, 64 protocol rows and 75 official rows; every row has an explicit gap flag. External servers were audited from pinned source; their native behavior was not certified, and no external implementation code was copied.
docs/mechanical-build-plan.mdadded+29@@ -0,0 +1,29 @@+# Mechanical bridge build — 2026-10-02++Scope: deliver the first three audit milestones in the existing Fusion bridge: trustworthy execution/readback, parametric parts, and assemblies including purchased McMaster components and BOM generation. Advanced drawing, sheet-metal, CAM and simulation authoring remain explicit comparison gaps. The baseline is 1.11.9 / a721e84613f6744bb837cfb7b828795abbc565f5. Audit: /home/adom/project/research/fusion-mech-audit-2026-09-30/AUDIT.md.++## Checkpoints++1. Foundation: document/revision targeting, explicit units and references, health/recompute, recoverable typed mutation, useful inspection, corrected physical properties/BOM identity and safe exports. Ship a usable create/inspect/parameter/export flow.+2. Parametric parts: constrained sketch primitives, dimensions/construction geometry, common solid features, feature/parameter edits and readback. Exercise real geometry and a failed edit with recovery.+3. Assemblies and purchased parts: component/occurrence placement, joints and limits, interference, material/mass, McMaster CAD ingestion/provenance, structured/flat CSV BOM with correct quantities. Exercise a small assembly with repeated purchased components.++Publish each verified checkpoint as a unique development version on the wiki branch mechanical-design-2026-10-02; do not update main or the production registry. Final handoff docs/build-2026-10-02.md records actual coverage and any restrictions. The installed development build is tested on adom_drew2; preserve existing user files and preferences.++## Responsibilities++Builder owns production code, version/contract changes and focused offline tests. Adversary reviews read-only. Verifier owns only private verification artifacts and exercises real Fusion workflows after coordinating exclusive host access. Orchestrator owns research, external feature mappings, publishing, environment/build setup and final handoff. Use three independent fresh-context Codex agents; the requested skill's default Opus/Sonnet are unavailable.++## Acceptance++No unresolved critical/high defects. Distinguish static/offline/live evidence. Explicitly report unsupported operations; script reachability is not dedicated feature support. Prove document mismatch rejection, failed mutation recovery, parameter-driven volume change, feature health, export preservation/roundtrip, assembly transforms and quantities, and purchased metadata retention. Keep existing electronics compatibility. Full external tool inventory must identify each comparator feature and our dedicated/script-only/missing status.++## Build notes++The implementation may group typed operations under a discoverable mechanical dispatcher rather than mint a verb per CAD API call. API availability must be checked against installed Fusion; preview or absent APIs must be reported without pretending support.++## Build notes — 2026-10-02++The implemented surface uses three top-level verbs and 39 typed operations. Separate schema variants cover the solid features and seven as-built joint motions. Regular joints that align/move components remain a documented follow-on; the delivered assembly workflow places occurrences explicitly before constraining them. Native McMaster launch is kept separate from verified local supplier-CAD ingestion and provenance, because launching a picker cannot certify a download or insertion. BOM purchasing policy and physical totals are separate so excluding a bought assembly from a purchasing list does not erase its modeled mass.++Live Fusion testing required API-specific corrections to construction-plane ownership, rectangular-pattern second-direction defaults and nested occurrence token context. Recovery is proved on the current runtime, rather than assumed from transaction API presence. The final handoff records the gate results and any remaining limitations.
docs/mechanical-comparison/ACTION-MATRIX.mdadded+128@@ -0,0 +1,128 @@+# Grouped MCP action comparison++Selector branches inside existing MCP tools, including aliases. They are counted separately from tool registrations. Parent tool caveats in FEATURE-MATRIX.md also apply.++| Repository / tool | Action | Coverage | Gap | Route / limitation |+|---|---|---|---|---|+| frankhommers / manage_annotations | [list](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L344) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| frankhommers / manage_annotations | [claim](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L344) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| frankhommers / manage_annotations | [complete](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L344) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| frankhommers / manage_annotations | [release](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L344) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / analyze_design | [get_assembly_tree](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L526) | dedicated | — | fusion_mechanical: inspect / inspect_entity. Definition and occurrence identity, nested paths, metadata and transforms. |+| joxoo / analyze_design | [get_feature_history](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L532) | dedicated | — | fusion_mechanical: inspect / health. Timeline entities, suppression, warnings/errors and optional recompute. |+| joxoo / analyze_design | [capture_view](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L552) | dedicated | — | fusion_take_screenshot / fusion_screenshot_fusion. Background window capture; official viewport screenshot also available through MCP. |+| joxoo / analyze_design | [capture_side](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L560) | dedicated | — | fusion_take_screenshot / fusion_screenshot_fusion. Background window capture; official viewport screenshot also available through MCP. |+| joxoo / analyze_design | [interference_check](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L572) | dedicated | — | fusion_mechanical: interference. Explicit root-context occurrences/body proxies; overlap volume and touching classification, no new interference bodies. |+| joxoo / analyze_design | [validate](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L590) | partial | GAP | fusion_mechanical: inspect / health. BRep solid status and feature/recompute health are covered; comparator mesh-body inventory/validation is not included. |+| joxoo / analyze_design | [scene_map](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L596) | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. |+| joxoo / analyze_design | [physical_data](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L600) | partial | GAP | fusion_mechanical: assembly_properties; fusion_physical_properties. Mass, volume, area, density and center of mass are covered; the comparator also returns XYZ moments/products of inertia, which our typed contract does not expose. |+| joxoo / analyze_design | [bounding_box](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L607) | dedicated | — | fusion_mechanical: inspect / inspect_entity; fusion_physical_properties. Explicit units; component-definition and occurrence scopes are separate. |+| joxoo / apply_3d_features | [extrude](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1137) | partial | GAP | fusion_mechanical: feature_create type=extrude. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [create_loft](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1158) | partial | GAP | fusion_mechanical: feature_create type=loft. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [create_sweep](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1177) | partial | GAP | fusion_mechanical: feature_create type=sweep. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [create_revolve](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1193) | partial | GAP | fusion_mechanical: feature_create type=revolve. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [create_hole](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1213) | partial | GAP | fusion_mechanical: feature_create type=hole. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [draft](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1257) | partial | GAP | fusion_mechanical: feature_create type=draft. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [circular_pattern](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1287) | partial | GAP | fusion_mechanical: feature_create type=circular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [rectangular_pattern](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1303) | partial | GAP | fusion_mechanical: feature_create type=rectangular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [path_pattern](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1331) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / apply_3d_features | [fillet](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1360) | partial | GAP | fusion_mechanical: feature_create type=fillet. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [chamfer](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1371) | partial | GAP | fusion_mechanical: feature_create type=chamfer. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [combine](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1382) | partial | GAP | fusion_mechanical: feature_create type=combine. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [create_box](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1395) | composable | — | fusion_mechanical: sketch_geometry rectangle + sketch_dimension + feature_create extrude. Parametric box workflow; new_design also has a simple driving-parameter box fixture. |+| joxoo / apply_3d_features | [Box](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1395) | composable | — | fusion_mechanical: sketch_geometry rectangle + sketch_dimension + feature_create extrude. Parametric box workflow; new_design also has a simple driving-parameter box fixture. |+| joxoo / apply_3d_features | [create_cylinder](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1413) | composable | — | fusion_mechanical: sketch_geometry circle + feature_create extrude. Dimension the circle and extrusion for parameter-driven geometry. |+| joxoo / apply_3d_features | [Cylinder](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1413) | composable | — | fusion_mechanical: sketch_geometry circle + feature_create extrude. Dimension the circle and extrusion for parameter-driven geometry. |+| joxoo / apply_3d_features | [create_sphere](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1429) | composable | — | fusion_mechanical: sketch_geometry arc/circle + feature_create revolve. Build a valid half-disc or offset circular profile and revolve; no one-call primitive wrapper. |+| joxoo / apply_3d_features | [Sphere](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1429) | composable | — | fusion_mechanical: sketch_geometry arc/circle + feature_create revolve. Build a valid half-disc or offset circular profile and revolve; no one-call primitive wrapper. |+| joxoo / apply_3d_features | [delete_body](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1454) | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. |+| joxoo / apply_3d_features | [rename_body](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1470) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / apply_3d_features | [move_body](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1482) | dedicated | — | fusion_mechanical: feature_create type=move. Explicit guarded bodies with rotation axis/origin and mm translation; avoids latest/index ambiguity. |+| joxoo / apply_3d_features | [move_body_absolute](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1513) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / apply_3d_features | [execute_python](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1548) | dedicated | — | fusion_run_modeling_script; fusion_mcp_call. Python API escape hatch; arbitrary scripts do not inherit typed-operation safety guarantees. |+| joxoo / apply_3d_features | [pattern_feature](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1567) | partial | GAP | fusion_mechanical: feature_create type=rectangular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [rectangular_pattern_feature](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1583) | partial | GAP | fusion_mechanical: feature_create type=rectangular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [mirror_feature](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1611) | partial | GAP | fusion_mechanical: feature_create type=mirror. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [create_construction_plane](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1632) | partial | GAP | fusion_mechanical: plane_create. Offset and angle planes only; three-point/midplane/tangent forms remain gaps. |+| joxoo / apply_3d_features | [create_construction_axis](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1649) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / apply_3d_features | [create_thread](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1672) | partial | GAP | fusion_mechanical: feature_create type=thread. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [create_coil](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1696) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / apply_3d_features | [select_by_property](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1711) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / apply_3d_features | [align_to_normal](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1728) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / apply_3d_features | [apply_taper_to_extrude](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1758) | partial | GAP | fusion_mechanical: feature_edit. Rename, suppression and expressions owned by that feature; arbitrary feature-definition replacement/reordering absent. |+| joxoo / apply_3d_features | [scale_body](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1769) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / apply_3d_features | [shell](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1782) | partial | GAP | fusion_mechanical: feature_create type=shell. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [split_body](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1799) | partial | GAP | fusion_mechanical: feature_create type=split. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. |+| joxoo / apply_3d_features | [delete_face](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1822) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / apply_3d_features | [offset_face](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1834) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / apply_3d_features | [move_face](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1854) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / apply_3d_features | [edit_feature](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1871) | partial | GAP | fusion_mechanical: feature_edit. Rename, suppression and expressions owned by that feature; arbitrary feature-definition replacement/reordering absent. |+| joxoo / apply_3d_features | [delete_feature](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry_scripts.py#L1900) | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. |+| joxoo / edit_assembly | [create_component](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/assembly_scripts.py#L127) | dedicated | — | fusion_mechanical: component_create. Native Hybrid internal definition plus first occurrence; native Part/Assembly intents are not silently converted. |+| joxoo / edit_assembly | [create_joint](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/assembly_scripts.py#L141) | partial | GAP | fusion_mechanical: joint_create. Seven as-built motion types. Geometry-moving regular joints, automatic mating/alignment and mate-type conversion are not implemented. |+| joxoo / edit_assembly | [rename_component](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/assembly_scripts.py#L157) | dedicated | — | fusion_mechanical: component_metadata. Definition rename affects all its occurrences. |+| joxoo / edit_assembly | [delete_component](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/assembly_scripts.py#L168) | partial | GAP | fusion_mechanical: occurrence_delete. Deletes exact selected instance; bulk deletion of every instance of a definition is not a one-call operation. |+| joxoo / edit_assembly | [move_component](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/assembly_scripts.py#L175) | dedicated | — | fusion_mechanical: occurrence_update. Absolute instance pose in assembly context, grounding checks and captured position. Relative motion requires composing the requested pose. |+| joxoo / edit_assembly | [create_as_built_joint](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/assembly_scripts.py#L195) | dedicated | — | fusion_mechanical: joint_create. As-built rigid/revolute/slider/cylindrical/pin-slot/planar/ball motion with explicit geometry and joint-coordinate axes. |+| joxoo / edit_assembly | [set_contact_sets](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/assembly_scripts.py#L209) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_forms | [extrude](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/forms_scripts.py#L358) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_forms | [revolve](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/forms_scripts.py#L358) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_forms | [sweep](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/forms_scripts.py#L358) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_forms | [loft](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/forms_scripts.py#L358) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_forms | [set_display_mode](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/forms_scripts.py#L371) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_forms | [clear_symmetry](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/forms_scripts.py#L377) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_forms | [convert](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/forms_scripts.py#L382) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_mesh | [remesh](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/mesh_scripts.py#L153) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_mesh | [smooth](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/mesh_scripts.py#L158) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_mesh | [repair](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/mesh_scripts.py#L163) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_mesh | [convert](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/mesh_scripts.py#L168) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_parameters | [set](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/parameters_scripts.py#L59) | dedicated | — | fusion_mechanical: parameter_set / parameter_batch. Target/revision guards and recompute health; expressions preserve parameter dependencies. |+| joxoo / edit_parameters | [delete](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/parameters_scripts.py#L73) | dedicated | — | fusion_mechanical: parameter_batch action=delete. Deletes user parameters only; failed downstream recompute aborts the batch. |+| joxoo / edit_sketch | [draw_line](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L829) | dedicated | — | fusion_mechanical: sketch_geometry type=line. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. |+| joxoo / edit_sketch | [draw_circle](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L834) | dedicated | — | fusion_mechanical: sketch_geometry type=circle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. |+| joxoo / edit_sketch | [draw_rectangle](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L839) | dedicated | — | fusion_mechanical: sketch_geometry type=rectangle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. |+| joxoo / edit_sketch | [draw_center_rectangle](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L844) | composable | — | fusion_mechanical: sketch_geometry type=rectangle. Convert center/width/height into two opposite corners. |+| joxoo / edit_sketch | [draw_three_point_rectangle](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L849) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [draw_polygon](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L855) | dedicated | — | fusion_mechanical: sketch_geometry type=polygon. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. |+| joxoo / edit_sketch | [draw_inscribed_polygon](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L861) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [draw_circumscribed_polygon](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L867) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [draw_edge_polygon](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L874) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [draw_arc](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L880) | dedicated | — | fusion_mechanical: sketch_geometry type=arc. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. |+| joxoo / edit_sketch | [draw_spline](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L886) | dedicated | — | fusion_mechanical: sketch_geometry type=spline. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. |+| joxoo / edit_sketch | [draw_slot](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L892) | dedicated | — | fusion_mechanical: sketch_geometry type=slot. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. |+| joxoo / edit_sketch | [draw_overall_slot](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L898) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [draw_center_point_slot](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L904) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [draw_ellipse](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L910) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [draw_text](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L916) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [import_svg](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L925) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [create_spun_profile](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L937) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [project_geometry](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L965) | partial | GAP | fusion_mechanical: sketch_project. Associative projection of supported native entities; projection-to-surface/wrap modes are not included. |+| joxoo / edit_sketch | [project_cut_edges](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L972) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [include_geometry](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L979) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [project_to_surface](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L987) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [redefine](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1009) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [find_connected_curves](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1032) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [offset](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1039) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_sketch | [circular_pattern](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1073) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_sketch | [rectangular_pattern](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1084) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_sketch | [delete_curve](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1116) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [move_entities](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1123) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [copy_entities](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1139) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [mirror_entities](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1155) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [set_construction](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1194) | partial | GAP | fusion_mechanical: sketch_edit. Point/end/center/radius and fixed/construction flags; offset/trim/extend are separate gaps. |+| joxoo / edit_sketch | [trim](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1201) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_sketch | [clear_sketch](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1209) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / edit_sketch | [add_constraint](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1253) | dedicated | — | fusion_mechanical: sketch_constraint. Twelve constraint kinds, including fix; explicit selection from current sketch references. |+| joxoo / edit_sketch | [remove_constraint](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1298) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_sketch | [set_dimension](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1308) | dedicated | — | fusion_mechanical: parameter_set / parameter_batch. Target/revision guards and recompute health; expressions preserve parameter dependencies. |+| joxoo / edit_sketch | [delete_dimension](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1315) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_sketch | [add_dimension](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch_scripts.py#L1325) | dedicated | — | fusion_mechanical: sketch_dimension. Distance/horizontal/vertical/radius/diameter/angle; expressions and named model parameters. |+| joxoo / edit_surfaces | [patch](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/surfaces_scripts.py#L249) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_surfaces | [offset](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/surfaces_scripts.py#L259) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_surfaces | [stitch](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/surfaces_scripts.py#L271) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / edit_surfaces | [thicken](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/surfaces_scripts.py#L285) | script-only | GAP | fusion_run_modeling_script. No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity. |+| joxoo / manage_design | [cleanup](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/design_scripts.py#L25) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / manage_design | [restart_mcp](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/design_scripts.py#L69) | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. |+| joxoo / manage_design | [create_new](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/design_scripts.py#L72) | dedicated | — | fusion_mechanical: new_design. Creates an unnamed unsaved parametric hybrid design to avoid save prompts. |+| joxoo / manage_design | [export_step](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/design_scripts.py#L75) | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. |+| joxoo / manage_design | [export_stl](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/design_scripts.py#L81) | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. |
docs/mechanical-comparison/FEATURE-MATRIX.mdadded+803@@ -0,0 +1,803 @@+# Fusion mechanical feature comparison++Source/schema comparison through checkpoint 3; consult build handoff for final live acceptance. Generic script access is counted as a dedicated-feature gap. Parent tools with multiple actions retain per-action flags.++All registered tools/dispatch commands and explicitly identified helpers in the pinned surveyed repositories; not an exhaustive list of every repository or every API reachable through script execution.++Each row is a source registration, not a claim that the external implementation works. `GAP` means our dedicated surface lacks some or all of that capability. `composable` means typed operations can form the workflow; it is not a separate one-call helper. `delegated` requires the external/local server. Source availability and live verification are separate.++See [external caveats](external-source-caveats.md), [official features](official-features.json), [Autodesk Compute](autodesk-compute.md) and [McMaster/BOM](mcmaster-and-bom.md).++| Repository | Entries | Surface | Licence | Pinned commit |+|---|---:|---|---|---|+| [faust](https://github.com/faust-machines/fusion360-mcp-server) | 93 | MCP tools | MIT | `ba8560f32165` |+| [f360mcp](https://github.com/dterracino/f360mcp) | 45 | MCP tools | MIT | `3ad4bf202787` |+| [FusionMCP](https://github.com/fozzfut/FusionMCP) | 170 | HTTP dispatch commands; no MCP adapter | README says MIT; no licence file | `12bb2bce20a4` |+| [mcp-fusion360](https://github.com/ignaciomolini/mcp-fusion360) | 11 | MCP tools | MIT | `3419de8ae314` |+| [Justus](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server) | 40 | MCP tools | MIT | `dd2f156fe2e7` |+| [ncmlabs](https://github.com/ncmlabs/fusion360_mcp) | 89 | MCP tools | MIT | `91bdfae83698` |+| [FusionMCPSample](https://github.com/AutodeskFusion360/FusionMCPSample) | 4 | MCP tools | MIT | `1d49ee8f7744` |+| [AuraFriday](https://github.com/AuraFriday/Fusion-360-MCP-Server) | 12 | one proprietary MCP tool; operation rows | proprietary, public source | `515e9010c2c4` |+| [fusion-cam-mcp](https://github.com/BJam/fusion-cam-mcp) | 21 | CLI command rows; no MCP adapter | MIT | `144233f45cf9` |+| [artapo](https://github.com/artapo/fusion360-mcp) | 5 | MCP tools plus four script helpers | Apache-2.0 | `13acbbc7fec9` |+| [ulfandpete](https://github.com/ulfandpete/fusion360-mcp-server) | 29 | MCP tools | AGPL-3.0; separate commercial licence | `390d60d36ecf` |+| [zkbkb](https://github.com/zkbkb/fusion-mcp) | 45 | MCP tools | CC-BY-NC-4.0; public source, not open source | `ea90968b3592` |+| [frankhommers](https://github.com/frankhommers/autodesk-fusion-mcp) | 14 | registered MCP tools (static source) | MIT | `cbd01e540af4` |+| [joxoo](https://github.com/joxoo/Fusion360MCP) | 31 | registered MCP tools (static source) | UNSPECIFIED (no license file at pinned HEAD) | `06cc8fc0417f` |+| [prim](https://github.com/prim-design/fusion-mcp) | 50 | registered MCP tools (static source) | MIT | `13fd2ef6290a` |+| [Poyraxx](https://github.com/Poyraxx/fusion-advanced-mcp-server) | 36 | registered MCP tools (static source) | GPL-3.0 | `2dfb68993caa` |++## faust++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [get_scene_info](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L12) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [get_object_info](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L21) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [get_bounding_box](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L33) | Measurement and engineering checks | dedicated | — | fusion_mechanical: inspect / inspect_entity; fusion_physical_properties. Explicit units; component-definition and occurrence scopes are separate. | |+| [create_sketch](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L54) | Sketches | dedicated | — | fusion_mechanical: sketch_create. Origin/construction planes and planar faces; native component-definition references. | |+| [draw_rectangle](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L73) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=rectangle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_circle](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L89) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=circle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_line](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L104) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=line. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [extrude](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L122) | Solid features | partial | GAP | fusion_mechanical: feature_create type=extrude. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [revolve](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L145) | Solid features | partial | GAP | fusion_mechanical: feature_create type=revolve. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [fillet](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L169) | Solid features | partial | GAP | fusion_mechanical: feature_create type=fillet. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [chamfer](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L188) | Solid features | partial | GAP | fusion_mechanical: feature_create type=chamfer. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [shell](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L207) | Solid features | partial | GAP | fusion_mechanical: feature_create type=shell. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [mirror](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L226) | Solid features | partial | GAP | fusion_mechanical: feature_create type=mirror. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [rename_body](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L244) | Body operations | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [move_body](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L263) | Body operations | dedicated | — | fusion_mechanical: feature_create type=move. Explicit guarded bodies with rotation axis/origin and mm translation; avoids latest/index ambiguity. | |+| [export_stl](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L278) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | |+| [boolean_operation](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L294) | Solid features | partial | GAP | fusion_mechanical: feature_create type=combine. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [delete_all](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L312) | Documents | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [undo](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L321) | Execution and recovery | delegated | — | fusion_mcp_call: fusion_mcp_update. Existing official desktop MCP proxy; requires that local MCP server enabled. | |+| [execute_code](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L331) | Execution and recovery | dedicated | — | fusion_run_modeling_script; fusion_mcp_call. Python API escape hatch; arbitrary scripts do not inherit typed-operation safety guarantees. | |+| [sweep](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L348) | Solid features | partial | GAP | fusion_mechanical: feature_create type=sweep. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [loft](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L370) | Solid features | partial | GAP | fusion_mechanical: feature_create type=loft. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [create_polygon](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L395) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=polygon. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_arc](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L415) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=arc. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [create_hole](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L440) | Solid features | partial | GAP | fusion_mechanical: feature_create type=hole. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [rectangular_pattern](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L475) | Solid features | partial | GAP | fusion_mechanical: feature_create type=rectangular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [circular_pattern](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L499) | Solid features | partial | GAP | fusion_mechanical: feature_create type=circular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [create_component](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L525) | Assemblies | dedicated | — | fusion_mechanical: component_create. Native Hybrid internal definition plus first occurrence; native Part/Assembly intents are not silently converted. | |+| [add_joint](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L541) | Joints and motion | partial | GAP | fusion_mechanical: joint_create. Seven as-built motion types. Geometry-moving regular joints, automatic mating/alignment and mate-type conversion are not implemented. | |+| [list_components](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L567) | Assemblies | dedicated | — | fusion_mechanical: inspect / inspect_entity. Definition and occurrence identity, nested paths, metadata and transforms. | |+| [export_step](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L577) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | |+| [export_f3d](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L593) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | |+| [export_view_sheet](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L609) | Drawings and view sheets | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Image view sheet, not native dimensioned drawing (1667). |+| [export](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L674) | Export | partial | GAP | fusion_mechanical: export. STEP/STL/3MF/F3D/IGES/SAT/SMT/USDZ/FBX/SKP with runtime preflight; no generic OBJ or sketch DXF export. | |+| [import_mesh](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L707) | Mesh | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get_parameters](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L737) | Parameters and variants | dedicated | — | fusion_mechanical: inspect; fusion_get_parameters. User and model parameters with expressions and units. | |+| [create_parameter](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L746) | Parameters and variants | dedicated | — | fusion_mechanical: parameter_create / parameter_batch. Typed length/angle/mass/unitless user parameters; other unit kinds remain outside this schema. | |+| [set_parameter](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L770) | Parameters and variants | dedicated | — | fusion_mechanical: parameter_set / parameter_batch. Target/revision guards and recompute health; expressions preserve parameter dependencies. | |+| [delete_parameter](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L789) | Parameters and variants | dedicated | — | fusion_mechanical: parameter_batch action=delete. Deletes user parameters only; failed downstream recompute aborts the batch. | |+| [add_constraint](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L802) | Sketches | dedicated | — | fusion_mechanical: sketch_constraint. Twelve constraint kinds, including fix; explicit selection from current sketch references. | |+| [auto_constrain](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L858) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [add_dimension](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L887) | Sketches | dedicated | — | fusion_mechanical: sketch_dimension. Distance/horizontal/vertical/radius/diameter/angle; expressions and named model parameters. | |+| [create_construction_plane](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L934) | Construction geometry | partial | GAP | fusion_mechanical: plane_create. Offset and angle planes only; three-point/midplane/tangent forms remain gaps. | |+| [create_construction_axis](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1003) | Construction geometry | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_ucs](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1054) | Construction geometry | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [draw_spline](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1088) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=spline. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [offset_curve](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1125) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [trim_curve](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1163) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [extend_curve](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1191) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_thread](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1220) | Solid features | partial | GAP | fusion_mechanical: feature_create type=thread. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [draft_faces](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1276) | Solid features | partial | GAP | fusion_mechanical: feature_create type=draft. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [split_body](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1314) | Solid features | partial | GAP | fusion_mechanical: feature_create type=split. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [split_face](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1344) | Solid features | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [offset_faces](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1370) | Solid features | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [scale_body](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1397) | Solid features | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_box](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1445) | Solid features | composable | — | fusion_mechanical: sketch_geometry rectangle + sketch_dimension + feature_create extrude. Parametric box workflow; new_design also has a simple driving-parameter box fixture. | |+| [create_box_parametric](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1464) | Solid features | composable | — | fusion_mechanical: sketch_geometry rectangle + sketch_dimension + feature_create extrude. Parametric box workflow; new_design also has a simple driving-parameter box fixture. | |+| [create_cylinder](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1523) | Solid features | composable | — | fusion_mechanical: sketch_geometry circle + feature_create extrude. Dimension the circle and extrusion for parameter-driven geometry. | |+| [create_sphere](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1547) | Solid features | composable | — | fusion_mechanical: sketch_geometry arc/circle + feature_create revolve. Build a valid half-disc or offset circular profile and revolve; no one-call primitive wrapper. | |+| [create_torus](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1564) | Solid features | composable | — | fusion_mechanical: sketch_geometry arc/circle + feature_create revolve. Build a valid half-disc or offset circular profile and revolve; no one-call primitive wrapper. | |+| [create_as_built_joint](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1596) | Joints and motion | dedicated | — | fusion_mechanical: joint_create. As-built rigid/revolute/slider/cylindrical/pin-slot/planar/ball motion with explicit geometry and joint-coordinate axes. | |+| [create_rigid_group](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1629) | Joints and motion | dedicated | — | fusion_mechanical: rigid_group_create. Exact occurrences and includeChildren policy. | |+| [measure_distance](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1652) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [measure_angle](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1673) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get_physical_properties](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1692) | Measurement and engineering checks | dedicated | — | fusion_mechanical: assembly_properties; fusion_physical_properties. High-accuracy aggregate/root/component/occurrence/body mass, volume, area and center of mass with explicit units/scope. | |+| [create_section_analysis](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1711) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [check_interference](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1731) | Measurement and engineering checks | dedicated | — | fusion_mechanical: interference. Explicit root-context occurrences/body proxies; overlap volume and touching classification, no new interference bodies. | |+| [compare_meshes](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1753) | Mesh | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [set_appearance](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1777) | Appearance and rendering | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [set_color](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1813) | Appearance and rendering | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [project_geometry](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1840) | Sketches | partial | GAP | fusion_mechanical: sketch_project. Associative projection of supported native entities; projection-to-surface/wrap modes are not included. | |+| [suppress_feature](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1865) | Feature history and health | partial | GAP | fusion_mechanical: feature_edit. Rename, suppression and expressions owned by that feature; arbitrary feature-definition replacement/reordering absent. | |+| [unsuppress_feature](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1877) | Feature history and health | partial | GAP | fusion_mechanical: feature_edit. Rename, suppression and expressions owned by that feature; arbitrary feature-definition replacement/reordering absent. | |+| [patch_surface](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1890) | Surfaces | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [stitch_surfaces](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1915) | Surfaces | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [thicken_surface](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1936) | Surfaces | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [ruled_surface](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1958) | Surfaces | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [trim_surface](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L1984) | Surfaces | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_flange](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2004) | Sheet metal | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Unverified creation: assumes flangeFeatures.createInput (3005). |+| [create_bend](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2034) | Sheet metal | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Uses undocumented Features.bendFeatures (3028). |+| [flat_pattern](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2059) | Sheet metal | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Uses Features.flatPatternFeatures vs Component.createFlatPattern (3043). |+| [unfold](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2071) | Sheet metal | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Preview createInput takes one stationaryFace, not bends + stationary (3074). |+| [cam_create_setup](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2089) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [cam_create_operation](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2141) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Refuses tool_diameter; tool_number parameter does not assign library Tool (3312). |+| [cam_generate_toolpath](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2226) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Wrong future completion members: isCompleted/wait vs isGenerationCompleted (3353). |+| [cam_post_process](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2251) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [cam_list_setups](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2289) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [cam_list_operations](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2298) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [cam_get_operation_info](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2312) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [ping](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2329) | Connection and version | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | |+| [get_design_type](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2341) | Documents | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [set_design_type](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2353) | Documents | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [render_view](https://github.com/faust-machines/fusion360-mcp-server/blob/ba8560f321656aa493cdc775bc2fa7b2e7d8f005/src/fusion360_mcp/tools.py#L2374) | Appearance and rendering | partial | GAP | fusion_view; fusion_mcp_call screenshot. Standard views/orbit/zoom and capture; arbitrary camera/render parameters require scripting. | |++## f360mcp++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [batch](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L125) | Execution and recovery | partial | GAP | fusion_mechanical: parameter_batch / transaction_probe. Atomic parameter batch exists; arbitrary mixed-operation pipeline with file/cloud rollback is absent. | |+| [create_sketch](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L147) | Sketches | dedicated | — | fusion_mechanical: sketch_create. Origin/construction planes and planar faces; native component-definition references. | |+| [finish_sketch](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L162) | Sketches | composable | — | fusion_mechanical: sketch_geometry. Typed operations solve at completion; an interactive sketch-edit mode need not be entered. | |+| [draw_rectangle](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L171) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=rectangle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_circle](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L176) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=circle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_slot](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L181) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=slot. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_line](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L197) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=line. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_arc](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L202) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=arc. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_polygon](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L211) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=polygon. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [extrude](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L223) | Solid features | partial | GAP | fusion_mechanical: feature_create type=extrude. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [revolve](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L239) | Solid features | partial | GAP | fusion_mechanical: feature_create type=revolve. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [sweep](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L244) | Solid features | partial | GAP | fusion_mechanical: feature_create type=sweep. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [loft](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L263) | Solid features | partial | GAP | fusion_mechanical: feature_create type=loft. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [fillet](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L284) | Solid features | partial | GAP | fusion_mechanical: feature_create type=fillet. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [chamfer](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L303) | Solid features | partial | GAP | fusion_mechanical: feature_create type=chamfer. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [shell](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L326) | Solid features | partial | GAP | fusion_mechanical: feature_create type=shell. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [draft](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L349) | Solid features | partial | GAP | fusion_mechanical: feature_create type=draft. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [pattern_rectangular](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L368) | Solid features | partial | GAP | fusion_mechanical: feature_create type=rectangular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [pattern_circular](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L391) | Solid features | partial | GAP | fusion_mechanical: feature_create type=circular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [mirror](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L411) | Solid features | partial | GAP | fusion_mechanical: feature_create type=mirror. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [fit_view](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L429) | Viewport | dedicated | — | fusion_view. Named standard views and fit; view action schema governs exact options. | |+| [get_design_info](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L434) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [get_body_info](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L443) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [measure](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L459) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_component](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L489) | Assemblies | dedicated | — | fusion_mechanical: component_create. Native Hybrid internal definition plus first occurrence; native Part/Assembly intents are not silently converted. | |+| [list_components](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L497) | Assemblies | dedicated | — | fusion_mechanical: inspect / inspect_entity. Definition and occurrence identity, nested paths, metadata and transforms. | |+| [delete_component](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L502) | Assemblies | partial | GAP | fusion_mechanical: occurrence_delete. Deletes exact selected instance; bulk deletion of every instance of a definition is not a one-call operation. | |+| [check_interference](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L512) | Measurement and engineering checks | dedicated | — | fusion_mechanical: interference. Explicit root-context occurrences/body proxies; overlap volume and touching classification, no new interference bodies. | |+| [move_component](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L521) | Assemblies | dedicated | — | fusion_mechanical: occurrence_update. Absolute instance pose in assembly context, grounding checks and captured position. Relative motion requires composing the requested pose. | |+| [rotate_component](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L547) | Assemblies | dedicated | — | fusion_mechanical: occurrence_update. Absolute instance pose in assembly context, grounding checks and captured position. Relative motion requires composing the requested pose. | |+| [create_revolute_joint](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L575) | Joints and motion | partial | GAP | fusion_mechanical: joint_create. As-built revolute/slider joints are implemented. Comparator regular joints that align and move occurrences are not covered. | Source attempts a regular geometry-moving joint (rootComp.joints.createInput), not an as-built joint. Its two-argument JointGeometry.createByPoint call appears mismatched to the documented API; source presence is not working-kernel certification. |+| [create_slider_joint](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L596) | Joints and motion | partial | GAP | fusion_mechanical: joint_create. As-built revolute/slider joints are implemented. Comparator regular joints that align and move occurrences are not covered. | Source attempts a regular geometry-moving joint (rootComp.joints.createInput), not an as-built joint. Its two-argument JointGeometry.createByPoint call appears mismatched to the documented API; source presence is not working-kernel certification. |+| [set_joint_angle](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L616) | Joints and motion | partial | GAP | fusion_mechanical: joint_edit. Joint limits/rest/suppression and supported motion values with bounds checks; no animation or motion-study sequence authoring. | |+| [set_joint_distance](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L624) | Joints and motion | partial | GAP | fusion_mechanical: joint_edit. Joint limits/rest/suppression and supported motion values with bounds checks; no animation or motion-study sequence authoring. | |+| [combine](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L636) | Solid features | partial | GAP | fusion_mechanical: feature_create type=combine. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [undo](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L663) | Execution and recovery | delegated | — | fusion_mcp_call: fusion_mcp_update. Existing official desktop MCP proxy; requires that local MCP server enabled. | |+| [delete_body](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L676) | Body operations | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. | |+| [delete_sketch](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L691) | Sketches | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. | |+| [export_stl](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L709) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | |+| [export_step](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L714) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | |+| [export_3mf](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L719) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | |+| [import_mesh](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L728) | Mesh | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [execute_api](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L737) | Execution and recovery | dedicated | — | fusion_run_modeling_script; fusion_mcp_call. Python API escape hatch; arbitrary scripts do not inherit typed-operation safety guarantees. | |+| [execute_python](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L788) | Execution and recovery | dedicated | — | fusion_run_modeling_script; fusion_mcp_call. Python API escape hatch; arbitrary scripts do not inherit typed-operation safety guarantees. | |+| [transaction](https://github.com/dterracino/f360mcp/blob/3ad4bf2027878da652c93b959dc238fd578174b9/mcp-server/f360mcp_server.py#L828) | Execution and recovery | partial | GAP | fusion_mechanical: parameter_batch / transaction_probe. Atomic parameter batch exists; arbitrary mixed-operation pipeline with file/cloud rollback is absent. | |++## FusionMCP++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [get_info](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3843) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [get_bodies_info](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3844) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [get_face_info](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3845) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [get_edge_info](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3846) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [get_sketch_info](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3847) | Sketches | dedicated | — | fusion_mechanical: inspect / inspect_entity. Curves, points, dimensions, constraint types, profiles and fully-constrained state. | |+| [get_timeline_info](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3848) | Feature history and health | dedicated | — | fusion_mechanical: inspect / health. Timeline entities, suppression, warnings/errors and optional recompute. | |+| [measure_body](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3849) | Measurement and engineering checks | dedicated | — | fusion_mechanical: inspect / inspect_entity; fusion_physical_properties. Explicit units; component-definition and occurrence scopes are separate. | |+| [measure_between](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3850) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [execute_script](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3851) | Execution and recovery | dedicated | — | fusion_run_modeling_script; fusion_mcp_call. Python API escape hatch; arbitrary scripts do not inherit typed-operation safety guarantees. | |+| [create_new_document](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3852) | Documents | dedicated | — | fusion_mechanical: new_design. Creates an unnamed unsaved parametric hybrid design to avoid save prompts. | |+| [clear_design](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3853) | Documents | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_sketch](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3854) | Sketches | dedicated | — | fusion_mechanical: sketch_create. Origin/construction planes and planar faces; native component-definition references. | |+| [create_sketch_on_face](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3855) | Sketches | dedicated | — | fusion_mechanical: sketch_create. Origin/construction planes and planar faces; native component-definition references. | |+| [finish_sketch](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3856) | Sketches | composable | — | fusion_mechanical: sketch_geometry. Typed operations solve at completion; an interactive sketch-edit mode need not be entered. | |+| [delete_sketch](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3857) | Sketches | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. | |+| [draw_rectangle](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3858) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=rectangle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_center_rectangle](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3859) | Sketches | composable | — | fusion_mechanical: sketch_geometry type=rectangle. Convert center/width/height into two opposite corners. | |+| [draw_circle](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3860) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=circle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_line](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3861) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=line. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_arc](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3862) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=arc. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_polygon](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3863) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=polygon. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_ellipse](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3864) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [draw_spline](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3865) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=spline. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_slot](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3866) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=slot. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_text](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3867) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [add_sketch_fillet](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3868) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [offset_sketch](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3869) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [mirror_sketch](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3870) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [rectangular_pattern_sketch](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3871) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [add_constraint](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3872) | Sketches | dedicated | — | fusion_mechanical: sketch_constraint. Twelve constraint kinds, including fix; explicit selection from current sketch references. | |+| [add_sketch_dimension](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3873) | Sketches | dedicated | — | fusion_mechanical: sketch_dimension. Distance/horizontal/vertical/radius/diameter/angle; expressions and named model parameters. | |+| [extrude](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3874) | Solid features | partial | GAP | fusion_mechanical: feature_create type=extrude. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [revolve](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3875) | Solid features | partial | GAP | fusion_mechanical: feature_create type=revolve. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [loft](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3876) | Solid features | partial | GAP | fusion_mechanical: feature_create type=loft. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [sweep](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3877) | Solid features | partial | GAP | fusion_mechanical: feature_create type=sweep. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [helix](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3878) | Solid features | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_pipe](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3879) | Solid features | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_hole](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3880) | Solid features | partial | GAP | fusion_mechanical: feature_create type=hole. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [shell](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3881) | Solid features | partial | GAP | fusion_mechanical: feature_create type=shell. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [fillet](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3882) | Solid features | partial | GAP | fusion_mechanical: feature_create type=fillet. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [chamfer](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3883) | Solid features | partial | GAP | fusion_mechanical: feature_create type=chamfer. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [mirror_body](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3884) | Solid features | partial | GAP | fusion_mechanical: feature_create type=mirror. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [rectangular_pattern_body](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3885) | Solid features | partial | GAP | fusion_mechanical: feature_create type=rectangular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [circular_pattern_body](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3886) | Solid features | partial | GAP | fusion_mechanical: feature_create type=circular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [combine_bodies](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3887) | Solid features | partial | GAP | fusion_mechanical: feature_create type=combine. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [scale_body](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3888) | Solid features | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [move_body](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3889) | Body operations | dedicated | — | fusion_mechanical: feature_create type=move. Explicit guarded bodies with rotation axis/origin and mm translation; avoids latest/index ambiguity. | |+| [rotate_body](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3890) | Body operations | dedicated | — | fusion_mechanical: feature_create type=move. Explicit guarded bodies with rotation axis/origin and mm translation; avoids latest/index ambiguity. | |+| [press_pull](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3891) | Solid features | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [thicken](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3892) | Surfaces | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [draft_face](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3893) | Solid features | partial | GAP | fusion_mechanical: feature_create type=draft. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [add_thread](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3894) | Solid features | partial | GAP | fusion_mechanical: feature_create type=thread. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [create_component](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3895) | Assemblies | dedicated | — | fusion_mechanical: component_create. Native Hybrid internal definition plus first occurrence; native Part/Assembly intents are not silently converted. | |+| [move_body_to_component](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3896) | Assemblies | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_joint](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3897) | Joints and motion | partial | GAP | fusion_mechanical: joint_create. Seven as-built motion types. Geometry-moving regular joints, automatic mating/alignment and mate-type conversion are not implemented. | |+| [create_as_built_joint](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3898) | Joints and motion | dedicated | — | fusion_mechanical: joint_create. As-built rigid/revolute/slider/cylindrical/pin-slot/planar/ball motion with explicit geometry and joint-coordinate axes. | |+| [rename_component](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3899) | Assemblies | dedicated | — | fusion_mechanical: component_metadata. Definition rename affects all its occurrences. | |+| [delete_occurrence](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3900) | Assemblies | partial | GAP | fusion_mechanical: occurrence_delete. Deletes exact selected instance; bulk deletion of every instance of a definition is not a one-call operation. | |+| [toggle_component_visibility](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3901) | Assemblies | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [list_occurrences_tree](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3902) | Assemblies | dedicated | — | fusion_mechanical: inspect / inspect_entity. Definition and occurrence identity, nested paths, metadata and transforms. | |+| [activate_component](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3903) | Assemblies | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get_component_info](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3904) | Assemblies | dedicated | — | fusion_mechanical: inspect / inspect_entity. Definition and occurrence identity, nested paths, metadata and transforms. | |+| [list_documents](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3905) | Documents | dedicated | — | fusion_get_app_state. Open document discovery. | |+| [switch_document](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3906) | Documents | dedicated | — | fusion_activate_document. Explicit name selection; obtain fresh mechanical target after switching. | |+| [delete_body](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3907) | Body operations | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. | |+| [rename_body](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3908) | Body operations | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [copy_body](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3909) | Body operations | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [toggle_body_visibility](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3910) | Body operations | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [add_construction_plane](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3911) | Construction geometry | partial | GAP | fusion_mechanical: plane_create. Offset and angle planes only; three-point/midplane/tangent forms remain gaps. | |+| [add_construction_axis](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3912) | Construction geometry | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [add_parameter](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3913) | Parameters and variants | dedicated | — | fusion_mechanical: parameter_create / parameter_batch. Typed length/angle/mass/unitless user parameters; other unit kinds remain outside this schema. | |+| [update_parameter](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3914) | Parameters and variants | dedicated | — | fusion_mechanical: parameter_set / parameter_batch. Target/revision guards and recompute health; expressions preserve parameter dependencies. | |+| [list_parameters](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3915) | Parameters and variants | dedicated | — | fusion_mechanical: inspect; fusion_get_parameters. User and model parameters with expressions and units. | |+| [list_appearances](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3916) | Appearance and rendering | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [apply_appearance](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3917) | Appearance and rendering | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [set_body_color](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3918) | Appearance and rendering | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [export_stl](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3919) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | |+| [export_step](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3920) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | |+| [export_3mf](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3921) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | |+| [export_f3d](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3922) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | |+| [capture_screenshot](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3923) | Viewport | dedicated | — | fusion_take_screenshot / fusion_screenshot_fusion. Background window capture; official viewport screenshot also available through MCP. | |+| [undo](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3924) | Execution and recovery | delegated | — | fusion_mcp_call: fusion_mcp_update. Existing official desktop MCP proxy; requires that local MCP server enabled. | |+| [redo](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3925) | Execution and recovery | delegated | — | fusion_mcp_call: fusion_mcp_update. Existing official desktop MCP proxy; requires that local MCP server enabled. | |+| [save](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3926) | Documents | partial | GAP | fusion_save_to_cloud; fusion_mechanical: export. Explicit cloud destination or native archive path; local save semantics differ from cloud-version save. | |+| [save_as](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3927) | Documents | partial | GAP | fusion_save_to_cloud; fusion_mechanical: export. Explicit cloud destination or native archive path; local save semantics differ from cloud-version save. | |+| [fusion_status](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3928) | Connection and version | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | |+| [export_obj](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3929) | Export | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Always rejected by dispatcher (3929). |+| [check_interference](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3930) | Measurement and engineering checks | dedicated | — | fusion_mechanical: interference. Explicit root-context occurrences/body proxies; overlap volume and touching classification, no new interference bodies. | |+| [assign_material](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3931) | Physical materials | dedicated | — | fusion_mechanical: material_assign. Loaded library/document material IDs; native component/body assignment and measured readback. | |+| [get_section_properties](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3932) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get_curvature_info](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3933) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [check_wall_thickness](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3934) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [check_draft_angles](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3935) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get_mesh_body_info](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3936) | Mesh | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [check_printability](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3937) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [cam_get_setups](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3938) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [cam_create_setup](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3939) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Wrong enum: SetupTypes vs documented OperationTypes (1961). |+| [cam_create_operation](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3940) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [cam_generate_toolpath](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3941) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [cam_list_tools](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3942) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Uses cam.toolLibraries vs documented CAMManager library access (2053). |+| [cam_post_process](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3943) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Wrong enum MillimeterOutput vs MillimetersOutput; ignores postProcess result (2109). |+| [cam_simulate](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3944) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Uses undocumented CAM.simulate (2122). |+| [cam_get_operation_info](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3945) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [edit_feature](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3946) | Feature history and health | partial | GAP | fusion_mechanical: feature_edit. Rename, suppression and expressions owned by that feature; arbitrary feature-definition replacement/reordering absent. | |+| [suppress_feature](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3947) | Feature history and health | partial | GAP | fusion_mechanical: feature_edit. Rename, suppression and expressions owned by that feature; arbitrary feature-definition replacement/reordering absent. | |+| [delete_feature](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3948) | Feature history and health | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. | |+| [reorder_feature](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3949) | Feature history and health | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [auto_constrain](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3950) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get_sketch_health](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3951) | Sketches | dedicated | — | fusion_mechanical: inspect / inspect_entity. Curves, points, dimensions, constraint types, profiles and fully-constrained state. | |+| [remove_constraint](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3952) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [save_variant](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3953) | Parameters and variants | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [load_variant](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3954) | Parameters and variants | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [list_variants](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3955) | Parameters and variants | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [delete_variant](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3956) | Parameters and variants | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [add_parameter_expression](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3957) | Parameters and variants | dedicated | — | fusion_mechanical: parameter_create / parameter_batch. Typed length/angle/mass/unitless user parameters; other unit kinds remain outside this schema. | |+| [batch_update_parameters](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3958) | Parameters and variants | dedicated | — | fusion_mechanical: parameter_batch. One probed model transaction; failure reports measured restoration. | |+| [generate_bom](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3959) | BOM | dedicated | — | fusion_mechanical: bom / bom_export. Definition grouping, nested/repeated instances, root bodies, purchased subtree collapse/explode/exclusion and flat/structured CSV with source metadata. | |+| [export_bom](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3960) | BOM | dedicated | — | fusion_mechanical: bom / bom_export. Definition grouping, nested/repeated instances, root bodies, purchased subtree collapse/explode/exclusion and flat/structured CSV with source metadata. | |+| [generate_drawing](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3961) | Drawings and view sheets | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Viewport PNG + bounding-box dimensions, not native engineering drawing (2490). |+| [create_3d_sketch](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3962) | Sketches | partial | GAP | fusion_mechanical: sketch_geometry. Coordinates accept Z; no dedicated is3D mode/3D constraint contract is claimed. | |+| [draw_3d_line](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3963) | Sketches | partial | GAP | fusion_mechanical: sketch_geometry. Coordinates accept Z; no dedicated is3D mode/3D constraint contract is claimed. | |+| [draw_3d_spline](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3964) | Sketches | partial | GAP | fusion_mechanical: sketch_geometry. Coordinates accept Z; no dedicated is3D mode/3D constraint contract is claimed. | |+| [project_to_surface](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3965) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_hole_pattern_linear](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3966) | Solid features | partial | GAP | fusion_mechanical: sketch_geometry points + feature_create hole. Hole positions can be supplied together; no dedicated hole-pattern feature wrapper. | |+| [create_hole_pattern_circular](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3967) | Solid features | partial | GAP | fusion_mechanical: sketch_geometry points + feature_create hole. Hole positions can be supplied together; no dedicated hole-pattern feature wrapper. | |+| [get_hole_info](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3968) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_sheet_metal_rule](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3969) | Sheet metal | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Placeholder: returns created without a creation call (2636). |+| [sheet_metal_flange](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3970) | Sheet metal | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Unverified creation: assumes flangeFeatures.createInput (2664). |+| [sheet_metal_bend](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3971) | Sheet metal | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Uses undocumented Features.bendFeatures (2678). |+| [sheet_metal_unfold](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3972) | Sheet metal | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Preview API signature mismatch: passes two arguments; createInput requires stationaryFace only (2705). |+| [sheet_metal_flat_pattern](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3973) | Sheet metal | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [import_mesh](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3974) | Mesh | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [repair_mesh](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3975) | Mesh | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Checks MeshBody.repair then returns UI note; repair not established (2770). |+| [convert_mesh_to_brep](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3976) | Mesh | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Uses absent Features.meshToBrep vs current preview meshConvertFeatures (2789). |+| [create_joint_from_geometry](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3978) | Joints and motion | partial | GAP | fusion_mechanical: joint_create. Seven as-built motion types. Geometry-moving regular joints, automatic mating/alignment and mate-type conversion are not implemented. | |+| [create_rigid_group](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3979) | Joints and motion | dedicated | — | fusion_mechanical: rigid_group_create. Exact occurrences and includeChildren policy. | |+| [set_joint_limits](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3980) | Joints and motion | partial | GAP | fusion_mechanical: joint_edit. Joint limits/rest/suppression and supported motion values with bounds checks; no animation or motion-study sequence authoring. | |+| [drive_joint](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3981) | Joints and motion | partial | GAP | fusion_mechanical: joint_edit. Joint limits/rest/suppression and supported motion values with bounds checks; no animation or motion-study sequence authoring. | |+| [edit_joint](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3982) | Joints and motion | partial | GAP | fusion_mechanical: joint_edit. Joint limits/rest/suppression and supported motion values with bounds checks; no animation or motion-study sequence authoring. | |+| [get_joint_info](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3983) | Joints and motion | dedicated | — | fusion_mechanical: inspect / inspect_entity. Typed motion readback and occurrence identity; exact output shape differs. | |+| [list_joints](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3984) | Joints and motion | dedicated | — | fusion_mechanical: inspect / inspect_entity. Typed motion readback and occurrence identity; exact output shape differs. | |+| [list_data_hubs](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3986) | Cloud data | partial | GAP | fusion_list_cloud_projects / fusion_list_cloud_files. Signed-in session project/folder discovery; API and pagination semantics differ. | |+| [list_data_projects](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3987) | Cloud data | partial | GAP | fusion_list_cloud_projects / fusion_list_cloud_files. Signed-in session project/folder discovery; API and pagination semantics differ. | |+| [list_data_folders](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3988) | Cloud data | partial | GAP | fusion_list_cloud_projects / fusion_list_cloud_files. Signed-in session project/folder discovery; API and pagination semantics differ. | |+| [open_data_file](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3989) | Cloud data | dedicated | — | fusion_open_cloud_file / fusion_aps_open. Existing cloud document open workflow. | |+| [save_to_folder](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3990) | Cloud data | partial | GAP | fusion_save_to_cloud; fusion_mechanical: export. Explicit cloud destination or native archive path; local save semantics differ from cloud-version save. | |+| [list_data_versions](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3991) | Cloud data | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [open_data_version](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3992) | Cloud data | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [subscribe_design_events](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3994) | Events | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [poll_design_events](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3995) | Events | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [unsubscribe_design_events](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3996) | Events | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get_subscription_status](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3997) | Events | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [set_render_environment](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L3999) | Appearance and rendering | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [set_appearance_detailed](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4000) | Appearance and rendering | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_render_camera](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4001) | Appearance and rendering | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [apply_render_camera](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4002) | Appearance and rendering | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_drawing_document](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4004) | Drawings and view sheets | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Placeholder: imports module, returns note only (3541). |+| [add_base_view](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4005) | Drawings and view sheets | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Placeholder: echoes inputs only (3558). |+| [add_projected_view](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4006) | Drawings and view sheets | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Placeholder: note only (3567). |+| [add_section_view](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4007) | Drawings and view sheets | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Placeholder: note only (3570). |+| [add_drawing_dimension](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4008) | Drawings and view sheets | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Placeholder: note only (3573). |+| [add_annotation](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4009) | Drawings and view sheets | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Placeholder: echoes text only (3576). |+| [export_drawing](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4010) | Drawings and view sheets | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Only PDF attempts export; other formats falsely report exported. Active Design dispatcher gate also obstructs drawing context (3598,3835). |+| [compare_variants](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4012) | Parameters and variants | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_design_table](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4013) | Parameters and variants | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Custom JSON presets in attributes, not native configurations (3640). |+| [apply_design_table_row](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4014) | Parameters and variants | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [generate_variant_batch](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4015) | Parameters and variants | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Swallows parameter errors; can export stale state and count failures as generated (3706). |+| [validate_parameters](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4016) | Parameters and variants | partial | GAP | fusion_mechanical: health / parameter_batch. Expression validation and downstream health; no separate arbitrary expression dependency-analysis report. | |+| [get_parameter_dependents](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4017) | Parameters and variants | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [pipeline_execute](https://github.com/fozzfut/FusionMCP/blob/12bb2bce20a416c8167dd879c87b4e4c833ab152/FusionMCP.py#L4018) | Execution and recovery | partial | GAP | fusion_mechanical: parameter_batch / transaction_probe. Atomic parameter batch exists; arbitrary mixed-operation pipeline with file/cloud rollback is absent. | Rollback only deletes appended timeline entries; existing parameter/file/document effects survive (3785). |++## mcp-fusion360++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [get_active_design_parameters](https://github.com/ignaciomolini/mcp-fusion360/blob/3419de8ae314f9a2c4a85770cf4b6c02163e0d7a/mcp-server/src/index.ts#L40) | Parameters and variants | dedicated | — | fusion_mechanical: inspect; fusion_get_parameters. User and model parameters with expressions and units. | |+| [measure_clearance](https://github.com/ignaciomolini/mcp-fusion360/blob/3419de8ae314f9a2c4a85770cf4b6c02163e0d7a/mcp-server/src/index.ts#L46) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [update_user_parameter](https://github.com/ignaciomolini/mcp-fusion360/blob/3419de8ae314f9a2c4a85770cf4b6c02163e0d7a/mcp-server/src/index.ts#L53) | Parameters and variants | dedicated | — | fusion_mechanical: parameter_set / parameter_batch. Target/revision guards and recompute health; expressions preserve parameter dependencies. | |+| [create_circular_cutout](https://github.com/ignaciomolini/mcp-fusion360/blob/3419de8ae314f9a2c4a85770cf4b6c02163e0d7a/mcp-server/src/index.ts#L60) | Solid features | composable | — | fusion_mechanical: sketch_geometry + feature_create extrude operation=cut. Create the profile on the selected plane and explicitly select participant bodies. | |+| [create_rectangular_cutout](https://github.com/ignaciomolini/mcp-fusion360/blob/3419de8ae314f9a2c4a85770cf4b6c02163e0d7a/mcp-server/src/index.ts#L67) | Solid features | composable | — | fusion_mechanical: sketch_geometry + feature_create extrude operation=cut. Create the profile on the selected plane and explicitly select participant bodies. | |+| [create_slot_cutout](https://github.com/ignaciomolini/mcp-fusion360/blob/3419de8ae314f9a2c4a85770cf4b6c02163e0d7a/mcp-server/src/index.ts#L74) | Solid features | composable | — | fusion_mechanical: sketch_geometry + feature_create extrude operation=cut. Create the profile on the selected plane and explicitly select participant bodies. | |+| [list_bodies](https://github.com/ignaciomolini/mcp-fusion360/blob/3419de8ae314f9a2c4a85770cf4b6c02163e0d7a/mcp-server/src/index.ts#L81) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [get_document_info](https://github.com/ignaciomolini/mcp-fusion360/blob/3419de8ae314f9a2c4a85770cf4b6c02163e0d7a/mcp-server/src/index.ts#L87) | Documents | dedicated | — | fusion_document_info / fusion_mechanical: inspect. Live document identity and save metadata. | |+| [get_body_info](https://github.com/ignaciomolini/mcp-fusion360/blob/3419de8ae314f9a2c4a85770cf4b6c02163e0d7a/mcp-server/src/index.ts#L93) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [list_features](https://github.com/ignaciomolini/mcp-fusion360/blob/3419de8ae314f9a2c4a85770cf4b6c02163e0d7a/mcp-server/src/index.ts#L100) | Feature history and health | dedicated | — | fusion_mechanical: inspect / health. Timeline entities, suppression, warnings/errors and optional recompute. | |+| [list_sketches](https://github.com/ignaciomolini/mcp-fusion360/blob/3419de8ae314f9a2c4a85770cf4b6c02163e0d7a/mcp-server/src/index.ts#L106) | Sketches | dedicated | — | fusion_mechanical: inspect / inspect_entity. Curves, points, dimensions, constraint types, profiles and fully-constrained state. | |++## Justus++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [move_latest_body](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L121) | Body operations | dedicated | — | fusion_mechanical: feature_create type=move. Explicit guarded bodies with rotation axis/origin and mm translation; avoids latest/index ambiguity. | |+| [rotate_latest_body](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L136) | Body operations | dedicated | — | fusion_mechanical: feature_create type=move. Explicit guarded bodies with rotation axis/origin and mm translation; avoids latest/index ambiguity. | |+| [delete_last_body](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L161) | Body operations | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. | |+| [rotate_body_by_index](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L176) | Body operations | dedicated | — | fusion_mechanical: feature_create type=move. Explicit guarded bodies with rotation axis/origin and mm translation; avoids latest/index ambiguity. | |+| [delete_body_by_index](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L200) | Body operations | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. | |+| [move_body_by_index](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L220) | Body operations | dedicated | — | fusion_mechanical: feature_create type=move. Explicit guarded bodies with rotation axis/origin and mm translation; avoids latest/index ambiguity. | |+| [list_bodies](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L244) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [create_thread](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L261) | Solid features | partial | GAP | fusion_mechanical: feature_create type=thread. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [test_connection](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L287) | Connection and version | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | |+| [delete_all](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L297) | Documents | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [draw_holes](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L308) | Solid features | partial | GAP | fusion_mechanical: feature_create type=hole. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [draw_witzenmannlogo](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L345) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [spline](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L369) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=spline. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [sweep](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L392) | Solid features | partial | GAP | fusion_mechanical: feature_create type=sweep. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [undo](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L405) | Execution and recovery | delegated | — | fusion_mcp_call: fusion_mcp_update. Existing official desktop MCP proxy; requires that local MCP server enabled. | |+| [count](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L415) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [list_parameters](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L425) | Parameters and variants | dedicated | — | fusion_mechanical: inspect; fusion_get_parameters. User and model parameters with expressions and units. | |+| [export_step](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L435) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | |+| [export_stl](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L448) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | |+| [fillet_edges](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L461) | Solid features | partial | GAP | fusion_mechanical: feature_create type=fillet. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [change_parameter](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L475) | Parameters and variants | dedicated | — | fusion_mechanical: parameter_set / parameter_batch. Target/revision guards and recompute health; expressions preserve parameter dependencies. | |+| [draw_cylinder](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L490) | Solid features | composable | — | fusion_mechanical: sketch_geometry circle + feature_create extrude. Dimension the circle and extrusion for parameter-driven geometry. | |+| [draw_box](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L512) | Solid features | composable | — | fusion_mechanical: sketch_geometry rectangle + sketch_dimension + feature_create extrude. Parametric box workflow; new_design also has a simple driving-parameter box fixture. | |+| [shell_body](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L559) | Solid features | partial | GAP | fusion_mechanical: feature_create type=shell. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [draw_sphere](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L586) | Solid features | composable | — | fusion_mechanical: sketch_geometry arc/circle + feature_create revolve. Build a valid half-disc or offset circular profile and revolve; no one-call primitive wrapper. | |+| [draw_2d_rectangle](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L617) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=rectangle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [boolean_operation](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L640) | Solid features | partial | GAP | fusion_mechanical: feature_create type=combine. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [draw_lines](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L661) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=line. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [extrude](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L683) | Solid features | partial | GAP | fusion_mechanical: feature_create type=extrude. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [draw_text](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L703) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [extrude_thin](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L729) | Solid features | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [cut_extrude](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L748) | Solid features | partial | GAP | fusion_mechanical: feature_create type=extrude. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [revolve](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L767) | Solid features | partial | GAP | fusion_mechanical: feature_create type=revolve. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [draw_arc](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L786) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=arc. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_one_line](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L811) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=line. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [rectangular_pattern](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L838) | Solid features | partial | GAP | fusion_mechanical: feature_create type=rectangular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [circular_pattern](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L867) | Solid features | partial | GAP | fusion_mechanical: feature_create type=circular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [ellipsie](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L898) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [draw2Dcircle](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L923) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=circle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [loft](https://github.com/JustusBraitinger/Autodesk-Fusion-360-MCP-Server/blob/dd2f156fe2e79d1ee2282a26eaa8b7e58661a28a/Server/MCP_Server.py#L962) | Solid features | partial | GAP | fusion_mechanical: feature_create type=loft. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |++## ncmlabs++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [get_design_state](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/query_tools.py#L24) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [get_bodies](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/query_tools.py#L56) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [get_body_by_id](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/query_tools.py#L109) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [get_sketches](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/query_tools.py#L174) | Sketches | dedicated | — | fusion_mechanical: inspect / inspect_entity. Curves, points, dimensions, constraint types, profiles and fully-constrained state. | |+| [get_sketch_by_id](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/query_tools.py#L222) | Sketches | dedicated | — | fusion_mechanical: inspect / inspect_entity. Curves, points, dimensions, constraint types, profiles and fully-constrained state. | |+| [get_parameters](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/query_tools.py#L289) | Parameters and variants | dedicated | — | fusion_mechanical: inspect; fusion_get_parameters. User and model parameters with expressions and units. | |+| [get_timeline](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/query_tools.py#L347) | Feature history and health | dedicated | — | fusion_mechanical: inspect / health. Timeline entities, suppression, warnings/errors and optional recompute. | |+| [create_box](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L26) | Solid features | composable | — | fusion_mechanical: sketch_geometry rectangle + sketch_dimension + feature_create extrude. Parametric box workflow; new_design also has a simple driving-parameter box fixture. | |+| [create_cylinder](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L96) | Solid features | composable | — | fusion_mechanical: sketch_geometry circle + feature_create extrude. Dimension the circle and extrusion for parameter-driven geometry. | |+| [create_sketch](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L159) | Sketches | dedicated | — | fusion_mechanical: sketch_create. Origin/construction planes and planar faces; native component-definition references. | |+| [draw_line](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L199) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=line. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_circle](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L250) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=circle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_rectangle](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L299) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=rectangle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_arc](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L353) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=arc. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_polygon](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L413) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=polygon. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_ellipse](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L485) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [draw_slot](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L553) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=slot. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_spline](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L630) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=spline. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_point](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L695) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=point. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [extrude](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L754) | Solid features | partial | GAP | fusion_mechanical: feature_create type=extrude. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [revolve](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L824) | Solid features | partial | GAP | fusion_mechanical: feature_create type=revolve. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [fillet](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L885) | Solid features | partial | GAP | fusion_mechanical: feature_create type=fillet. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [chamfer](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L933) | Solid features | partial | GAP | fusion_mechanical: feature_create type=chamfer. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [create_hole](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L991) | Solid features | partial | GAP | fusion_mechanical: feature_create type=hole. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [sketch_mirror](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1071) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [sketch_circular_pattern](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1129) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [sketch_rectangular_pattern](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1206) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [project_geometry](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1280) | Sketches | partial | GAP | fusion_mechanical: sketch_project. Associative projection of supported native entities; projection-to-surface/wrap modes are not included. | |+| [add_sketch_text](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1343) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [wrap_sketch_to_surface](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1429) | Sketches | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [add_constraint_horizontal](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1510) | Sketches | dedicated | — | fusion_mechanical: sketch_constraint. Twelve constraint kinds, including fix; explicit selection from current sketch references. | |+| [add_constraint_vertical](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1561) | Sketches | dedicated | — | fusion_mechanical: sketch_constraint. Twelve constraint kinds, including fix; explicit selection from current sketch references. | |+| [add_constraint_coincident](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1610) | Sketches | dedicated | — | fusion_mechanical: sketch_constraint. Twelve constraint kinds, including fix; explicit selection from current sketch references. | |+| [add_constraint_perpendicular](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1660) | Sketches | dedicated | — | fusion_mechanical: sketch_constraint. Twelve constraint kinds, including fix; explicit selection from current sketch references. | |+| [add_constraint_parallel](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1713) | Sketches | dedicated | — | fusion_mechanical: sketch_constraint. Twelve constraint kinds, including fix; explicit selection from current sketch references. | |+| [add_constraint_tangent](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1766) | Sketches | dedicated | — | fusion_mechanical: sketch_constraint. Twelve constraint kinds, including fix; explicit selection from current sketch references. | |+| [add_constraint_equal](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1819) | Sketches | dedicated | — | fusion_mechanical: sketch_constraint. Twelve constraint kinds, including fix; explicit selection from current sketch references. | |+| [add_constraint_concentric](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1873) | Sketches | dedicated | — | fusion_mechanical: sketch_constraint. Twelve constraint kinds, including fix; explicit selection from current sketch references. | |+| [add_constraint_fix](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1927) | Sketches | dedicated | — | fusion_mechanical: sketch_constraint. Twelve constraint kinds, including fix; explicit selection from current sketch references. | |+| [add_dimension](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L1975) | Sketches | dedicated | — | fusion_mechanical: sketch_dimension. Distance/horizontal/vertical/radius/diameter/angle; expressions and named model parameters. | |+| [sweep](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L2083) | Solid features | partial | GAP | fusion_mechanical: feature_create type=sweep. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [loft](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L2165) | Solid features | partial | GAP | fusion_mechanical: feature_create type=loft. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [create_sphere](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L2257) | Solid features | composable | — | fusion_mechanical: sketch_geometry arc/circle + feature_create revolve. Build a valid half-disc or offset circular profile and revolve; no one-call primitive wrapper. | |+| [create_torus](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L2313) | Solid features | composable | — | fusion_mechanical: sketch_geometry arc/circle + feature_create revolve. Build a valid half-disc or offset circular profile and revolve; no one-call primitive wrapper. | |+| [create_coil](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L2387) | Solid features | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_pipe](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L2455) | Solid features | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [rectangular_pattern](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L2545) | Solid features | partial | GAP | fusion_mechanical: feature_create type=rectangular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [circular_pattern](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L2644) | Solid features | partial | GAP | fusion_mechanical: feature_create type=circular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [mirror_feature](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L2736) | Solid features | partial | GAP | fusion_mechanical: feature_create type=mirror. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [create_thread](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L2809) | Solid features | partial | GAP | fusion_mechanical: feature_create type=thread. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [thicken](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L2917) | Surfaces | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [emboss](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L3007) | Solid features | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_offset_plane](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L3090) | Construction geometry | partial | GAP | fusion_mechanical: plane_create. Offset and angle planes only; three-point/midplane/tangent forms remain gaps. | |+| [create_angle_plane](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L3148) | Construction geometry | partial | GAP | fusion_mechanical: plane_create. Offset and angle planes only; three-point/midplane/tangent forms remain gaps. | |+| [create_three_point_plane](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L3209) | Construction geometry | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [create_midplane](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/creation_tools.py#L3272) | Construction geometry | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [move_body](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/modification_tools.py#L31) | Body operations | dedicated | — | fusion_mechanical: feature_create type=move. Explicit guarded bodies with rotation axis/origin and mm translation; avoids latest/index ambiguity. | |+| [rotate_body](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/modification_tools.py#L86) | Body operations | dedicated | — | fusion_mechanical: feature_create type=move. Explicit guarded bodies with rotation axis/origin and mm translation; avoids latest/index ambiguity. | |+| [modify_feature](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/modification_tools.py#L157) | Feature history and health | partial | GAP | fusion_mechanical: feature_edit. Rename, suppression and expressions owned by that feature; arbitrary feature-definition replacement/reordering absent. | |+| [update_parameter](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/modification_tools.py#L214) | Parameters and variants | dedicated | — | fusion_mechanical: parameter_set / parameter_batch. Target/revision guards and recompute health; expressions preserve parameter dependencies. | |+| [delete_body](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/modification_tools.py#L265) | Body operations | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. | |+| [delete_feature](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/modification_tools.py#L303) | Feature history and health | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. | |+| [edit_sketch](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/modification_tools.py#L344) | Sketches | partial | GAP | fusion_mechanical: sketch_edit. Point/end/center/radius and fixed/construction flags; offset/trim/extend are separate gaps. | |+| [combine](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/modification_tools.py#L412) | Solid features | partial | GAP | fusion_mechanical: feature_create type=combine. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [split_body](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/modification_tools.py#L483) | Solid features | partial | GAP | fusion_mechanical: feature_create type=split. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [shell](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/modification_tools.py#L544) | Solid features | partial | GAP | fusion_mechanical: feature_create type=shell. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [measure_distance](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/validation_tools.py#L24) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [measure_angle](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/validation_tools.py#L67) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [check_interference](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/validation_tools.py#L106) | Measurement and engineering checks | dedicated | — | fusion_mechanical: interference. Explicit root-context occurrences/body proxies; overlap volume and touching classification, no new interference bodies. | |+| [get_body_properties](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/validation_tools.py#L162) | Measurement and engineering checks | dedicated | — | fusion_mechanical: assembly_properties; fusion_physical_properties. High-accuracy aggregate/root/component/occurrence/body mass, volume, area and center of mass with explicit units/scope. | |+| [get_sketch_status](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/validation_tools.py#L216) | Sketches | dedicated | — | fusion_mechanical: inspect / inspect_entity. Curves, points, dimensions, constraint types, profiles and fully-constrained state. | |+| [check_health](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/system_tools.py#L27) | Feature history and health | dedicated | — | fusion_mechanical: inspect / health. Timeline entities, suppression, warnings/errors and optional recompute. | |+| [get_version](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/system_tools.py#L73) | Connection and version | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | |+| [take_screenshot](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/viewport_tools.py#L24) | Viewport | dedicated | — | fusion_take_screenshot / fusion_screenshot_fusion. Background window capture; official viewport screenshot also available through MCP. | |+| [set_camera](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/viewport_tools.py#L81) | Viewport | partial | GAP | fusion_view; fusion_mcp_call screenshot. Standard views/orbit/zoom and capture; arbitrary camera/render parameters require scripting. | |+| [get_camera](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/viewport_tools.py#L149) | Viewport | partial | GAP | fusion_view; fusion_mcp_call screenshot. Standard views/orbit/zoom and capture; arbitrary camera/render parameters require scripting. | |+| [set_view](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/viewport_tools.py#L180) | Viewport | dedicated | — | fusion_view. Named standard views and fit; view action schema governs exact options. | |+| [fit_view](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/viewport_tools.py#L223) | Viewport | dedicated | — | fusion_view. Named standard views and fit; view action schema governs exact options. | |+| [create_component](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/assembly_tools.py#L26) | Assemblies | dedicated | — | fusion_mechanical: component_create. Native Hybrid internal definition plus first occurrence; native Part/Assembly intents are not silently converted. | |+| [get_components](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/assembly_tools.py#L65) | Assemblies | dedicated | — | fusion_mechanical: inspect / inspect_entity. Definition and occurrence identity, nested paths, metadata and transforms. | |+| [get_component_by_id](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/assembly_tools.py#L96) | Assemblies | dedicated | — | fusion_mechanical: inspect / inspect_entity. Definition and occurrence identity, nested paths, metadata and transforms. | |+| [activate_component](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/assembly_tools.py#L126) | Assemblies | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get_component_bodies](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/assembly_tools.py#L157) | Assemblies | dedicated | — | fusion_mechanical: inspect / inspect_entity. Definition and occurrence identity, nested paths, metadata and transforms. | |+| [get_occurrences](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/assembly_tools.py#L186) | Assemblies | dedicated | — | fusion_mechanical: inspect / inspect_entity. Definition and occurrence identity, nested paths, metadata and transforms. | |+| [move_occurrence](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/assembly_tools.py#L221) | Assemblies | dedicated | — | fusion_mechanical: occurrence_update. Absolute instance pose in assembly context, grounding checks and captured position. Relative motion requires composing the requested pose. | |+| [create_joint](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/assembly_tools.py#L273) | Joints and motion | partial | GAP | fusion_mechanical: joint_create. Seven as-built motion types. Geometry-moving regular joints, automatic mating/alignment and mate-type conversion are not implemented. | |+| [create_joint_between_occurrences](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/assembly_tools.py#L334) | Joints and motion | partial | GAP | fusion_mechanical: joint_create. Seven as-built motion types. Geometry-moving regular joints, automatic mating/alignment and mate-type conversion are not implemented. | |+| [get_joints](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/assembly_tools.py#L387) | Joints and motion | dedicated | — | fusion_mechanical: inspect / inspect_entity. Typed motion readback and occurrence identity; exact output shape differs. | |+| [get_joint_by_id](https://github.com/ncmlabs/fusion360_mcp/blob/91bdfae836989a6c86d1cc3af8280e16eaacaa3f/Server/src/fusion360_mcp_server/tools/assembly_tools.py#L415) | Joints and motion | dedicated | — | fusion_mechanical: inspect / inspect_entity. Typed motion readback and occurrence identity; exact output shape differs. | |++## FusionMCPSample++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [execute_api_script](https://github.com/AutodeskFusion360/FusionMCPSample/blob/1d49ee8f7744b2e7aaec91f9c660c65963fccd71/Fusion MCP Addin/tools/execute_api_script.py#L1) | Execution and recovery | dedicated | — | fusion_run_modeling_script; fusion_mcp_call. Python API escape hatch; arbitrary scripts do not inherit typed-operation safety guarantees. | |+| [get_api_documentation](https://github.com/AutodeskFusion360/FusionMCPSample/blob/1d49ee8f7744b2e7aaec91f9c660c65963fccd71/Fusion MCP Addin/tools/get_api_documentation.py#L1) | API documentation | delegated | — | fusion_mcp_call: fusion_mcp_read queryType=apiDocumentation. Runtime Autodesk documentation selector; no separate mirrored documentation database. | |+| [get_screenshot](https://github.com/AutodeskFusion360/FusionMCPSample/blob/1d49ee8f7744b2e7aaec91f9c660c65963fccd71/Fusion MCP Addin/tools/get_screenshot.py#L1) | Viewport | dedicated | — | fusion_take_screenshot / fusion_screenshot_fusion. Background window capture; official viewport screenshot also available through MCP. | |+| [get_best_practices](https://github.com/AutodeskFusion360/FusionMCPSample/blob/1d49ee8f7744b2e7aaec91f9c660c65963fccd71/Fusion MCP Addin/tools/get_best_practices.py#L1) | API documentation | partial | GAP | Fusion bridge skill and typed schema descriptions. Workflow guidance is documented; no dedicated best-practices MCP resource parity. | |++## AuraFriday++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [execute_python](https://github.com/AuraFriday/Fusion-360-MCP-Server/blob/515e9010c2c41b2caf6faafd4ec6721270436691/mcp_integration.py#L403) | Execution and recovery | dedicated | — | fusion_run_modeling_script; fusion_mcp_call. Python API escape hatch; arbitrary scripts do not inherit typed-operation safety guarantees. | |+| [call_tool](https://github.com/AuraFriday/Fusion-360-MCP-Server/blob/515e9010c2c41b2caf6faafd4ec6721270436691/mcp_integration.py#L405) | Script storage and external tools | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [save_script](https://github.com/AuraFriday/Fusion-360-MCP-Server/blob/515e9010c2c41b2caf6faafd4ec6721270436691/mcp_integration.py#L419) | Script storage and external tools | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [load_script](https://github.com/AuraFriday/Fusion-360-MCP-Server/blob/515e9010c2c41b2caf6faafd4ec6721270436691/mcp_integration.py#L421) | Script storage and external tools | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [list_scripts](https://github.com/AuraFriday/Fusion-360-MCP-Server/blob/515e9010c2c41b2caf6faafd4ec6721270436691/mcp_integration.py#L423) | Script storage and external tools | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [delete_script](https://github.com/AuraFriday/Fusion-360-MCP-Server/blob/515e9010c2c41b2caf6faafd4ec6721270436691/mcp_integration.py#L425) | Script storage and external tools | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get_api_documentation](https://github.com/AuraFriday/Fusion-360-MCP-Server/blob/515e9010c2c41b2caf6faafd4ec6721270436691/mcp_integration.py#L427) | API documentation | delegated | — | fusion_mcp_call: fusion_mcp_read queryType=apiDocumentation. Runtime Autodesk documentation selector; no separate mirrored documentation database. | |+| [get_online_documentation](https://github.com/AuraFriday/Fusion-360-MCP-Server/blob/515e9010c2c41b2caf6faafd4ec6721270436691/mcp_integration.py#L429) | API documentation | delegated | — | fusion_mcp_call: fusion_mcp_read queryType=apiDocumentation. Runtime Autodesk documentation selector; no separate mirrored documentation database. | |+| [get_best_practices](https://github.com/AuraFriday/Fusion-360-MCP-Server/blob/515e9010c2c41b2caf6faafd4ec6721270436691/mcp_integration.py#L431) | API documentation | partial | GAP | Fusion bridge skill and typed schema descriptions. Workflow guidance is documented; no dedicated best-practices MCP resource parity. | |+| [generic_api_call](https://github.com/AuraFriday/Fusion-360-MCP-Server/blob/515e9010c2c41b2caf6faafd4ec6721270436691/mcp_integration.py#L442) | Execution and recovery | dedicated | — | fusion_run_modeling_script; fusion_mcp_call. Python API escape hatch; arbitrary scripts do not inherit typed-operation safety guarantees. | |+| [get_pid](https://github.com/AuraFriday/Fusion-360-MCP-Server/blob/515e9010c2c41b2caf6faafd4ec6721270436691/mcp_integration.py#L451) | Connection and version | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | |+| [clear_context](https://github.com/AuraFriday/Fusion-360-MCP-Server/blob/515e9010c2c41b2caf6faafd4ec6721270436691/mcp_integration.py#L463) | Script storage and external tools | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |++## fusion-cam-mcp++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [ping](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L334) | Connection and version | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | |+| [list-documents](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L342) | Documents | dedicated | — | fusion_get_app_state. Open document discovery. | |+| [get-document-info](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L350) | Documents | dedicated | — | fusion_document_info / fusion_mechanical: inspect. Live document identity and save metadata. | |+| [get-setups](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L359) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get-operations](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L368) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get-operation-details](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L378) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get-tools](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L393) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get-library-tools](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L402) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get-machining-time](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L424) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get-toolpath-status](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L434) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [get-nc-programs](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L444) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [generate-toolpaths](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L453) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [post-process](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L473) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [update-operation-parameters](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L501) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [list-material-libraries](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L523) | Physical materials | dedicated | — | fusion_mechanical: material_list. Loaded library IDs and material search; bounded result sets explicitly report completeness. | |+| [get-material-properties](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L533) | Physical materials | partial | GAP | fusion_mechanical: material_list / assembly_properties. Material identity and resulting modeled mass/density; no generic material-property catalog or custom-material editor. | |+| [create-custom-material](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L548) | Physical materials | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [assign-body-material](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L580) | Physical materials | dedicated | — | fusion_mechanical: material_assign. Loaded library/document material IDs; native component/body assignment and measured readback. | |+| [update-setup-machine-params](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L597) | CAM | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [debug](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L618) | Execution and recovery | dedicated | — | fusion_run_modeling_script; fusion_mcp_call. Python API escape hatch; arbitrary scripts do not inherit typed-operation safety guarantees. | |+| [version](https://github.com/BJam/fusion-cam-mcp/blob/144233f45cf9f338fcc11a96ee60df02b24ea9c5/src/fusion_cam/cli.py#L658) | Connection and version | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | |++## artapo++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [fusion_eval](https://github.com/artapo/fusion360-mcp/blob/13acbbc7fec9f078753fedb1a68952ab369ca24b/src/fusion360_mcp/server.py#L27) | Execution and recovery | dedicated | — | fusion_run_modeling_script; fusion_mcp_call. Python API escape hatch; arbitrary scripts do not inherit typed-operation safety guarantees. | |+| [snapshot()](https://github.com/artapo/fusion360-mcp/blob/13acbbc7fec9f078753fedb1a68952ab369ca24b/src/fusion360_mcp/addin/Claude%20MCP.py#L98) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [screenshot()](https://github.com/artapo/fusion360-mcp/blob/13acbbc7fec9f078753fedb1a68952ab369ca24b/src/fusion360_mcp/addin/Claude%20MCP.py#L157) | Viewport | dedicated | — | fusion_take_screenshot / fusion_screenshot_fusion. Background window capture; official viewport screenshot also available through MCP. | |+| [api()](https://github.com/artapo/fusion360-mcp/blob/13acbbc7fec9f078753fedb1a68952ab369ca24b/src/fusion360_mcp/addin/Claude%20MCP.py#L188) | API documentation | partial | GAP | fusion_mcp_call API documentation; fusion_run_modeling_script. Documentation lookup exists; no dedicated installed-object signature introspection helper contract. | |+| [undo()](https://github.com/artapo/fusion360-mcp/blob/13acbbc7fec9f078753fedb1a68952ab369ca24b/src/fusion360_mcp/addin/Claude%20MCP.py#L315) | Execution and recovery | delegated | — | fusion_mcp_call: fusion_mcp_update. Existing official desktop MCP proxy; requires that local MCP server enabled. | Timeline-entry deletion does not restore edits to existing parameters/features or external files. Checkpoint is a timeline count, not a document-bound transaction; see _run_code and _undo. |++## ulfandpete++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [hello](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L142) | Connection and version | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [debug_test](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L161) | Connection and version | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [get_server_info](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L191) | Connection and version | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [check_fusion360_connection](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L217) | Connection and version | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [get_fusion360_status](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L288) | Connection and version | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [create_fusion360_cube](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L371) | Solid features | composable | — | fusion_mechanical: sketch_geometry rectangle + sketch_dimension + feature_create extrude. Parametric box workflow; new_design also has a simple driving-parameter box fixture. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [create_fusion360_sketch](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L490) | Sketches | dedicated | — | fusion_mechanical: sketch_create. Origin/construction planes and planar faces; native component-definition references. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [get_fusion360_design_info](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L544) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [list_fusion360_sketches](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L590) | Sketches | dedicated | — | fusion_mechanical: inspect / inspect_entity. Curves, points, dimensions, constraint types, profiles and fully-constrained state. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [list_fusion360_features](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L637) | Feature history and health | dedicated | — | fusion_mechanical: inspect / health. Timeline entities, suppression, warnings/errors and optional recompute. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [create_sketch](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L684) | Sketches | dedicated | — | fusion_mechanical: sketch_create. Origin/construction planes and planar faces; native component-definition references. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [sketch_rectangle](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L808) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=rectangle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [sketch_circle](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L969) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=circle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [finish_sketch](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L1154) | Sketches | composable | — | fusion_mechanical: sketch_geometry. Typed operations solve at completion; an interactive sketch-edit mode need not be entered. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [list_sketches](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L1292) | Sketches | dedicated | — | fusion_mechanical: inspect / inspect_entity. Curves, points, dimensions, constraint types, profiles and fully-constrained state. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [extrude_sketch](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L1442) | Solid features | partial | GAP | fusion_mechanical: feature_create type=extrude. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [revolve_sketch](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L1642) | Solid features | partial | GAP | fusion_mechanical: feature_create type=revolve. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [get_extrusion_recommendations](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L1859) | Engineering guidance | partial | GAP | docs/MECHANICAL.md and live operation schemas. Bridge guidance describes supported operations and selection/recovery contracts; no dedicated manufacturing heuristic recommendation service. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [boolean_union](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L2154) | Solid features | partial | GAP | fusion_mechanical: feature_create type=combine. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [boolean_subtract](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L2413) | Solid features | partial | GAP | fusion_mechanical: feature_create type=combine. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [boolean_intersect](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L2673) | Solid features | partial | GAP | fusion_mechanical: feature_create type=combine. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [get_boolean_recommendations](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L2920) | Engineering guidance | partial | GAP | docs/MECHANICAL.md and live operation schemas. Bridge guidance describes supported operations and selection/recovery contracts; no dedicated manufacturing heuristic recommendation service. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [list_bodies](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L3286) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [get_body_info](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L3500) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [combine_bodies](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L3762) | Solid features | partial | GAP | fusion_mechanical: feature_create type=combine. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [create_fillet](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L4122) | Solid features | partial | GAP | fusion_mechanical: feature_create type=fillet. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [create_chamfer](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L4421) | Solid features | partial | GAP | fusion_mechanical: feature_create type=chamfer. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [get_edge_recommendations](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L4748) | Engineering guidance | partial | GAP | docs/MECHANICAL.md and live operation schemas. Bridge guidance describes supported operations and selection/recovery contracts; no dedicated manufacturing heuristic recommendation service. | Repository README describes the project as not working yet; no live behavior verified in this audit. |+| [list_edges](https://github.com/ulfandpete/fusion360-mcp-server/blob/390d60d36ecf86dee21ade287ec0ab060de6cd58/fusion360_mcp_server.py#L5098) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | Repository README describes the project as not working yet; no live behavior verified in this audit. |++## zkbkb++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [connect_fusion360](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L124) | Connection and version | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | |+| [create_sketch](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L155) | Sketches | dedicated | — | fusion_mechanical: sketch_create. Origin/construction planes and planar faces; native component-definition references. | |+| [draw_line](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L179) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=line. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_rectangle](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L213) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=rectangle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_circle](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L247) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=circle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_arc](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L278) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=arc. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [draw_polygon](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L314) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=polygon. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | |+| [get_sketch_info](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L348) | Sketches | dedicated | — | fusion_mechanical: inspect / inspect_entity. Curves, points, dimensions, constraint types, profiles and fully-constrained state. | |+| [add_geometric_constraint](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L368) | Sketches | dedicated | — | fusion_mechanical: sketch_constraint. Twelve constraint kinds, including fix; explicit selection from current sketch references. | Registered tool sends add_geometric_constraint but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [add_dimensional_constraint](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L398) | Sketches | dedicated | — | fusion_mechanical: sketch_dimension. Distance/horizontal/vertical/radius/diameter/angle; expressions and named model parameters. | Registered tool sends add_dimensional_constraint but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_extrude](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L435) | Solid features | partial | GAP | fusion_mechanical: feature_create type=extrude. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [extrude_feature](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L484) | Solid features | partial | GAP | fusion_mechanical: feature_create type=extrude. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | |+| [create_revolve](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L501) | Solid features | partial | GAP | fusion_mechanical: feature_create type=revolve. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Registered tool sends create_revolve but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_sweep](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L537) | Solid features | partial | GAP | fusion_mechanical: feature_create type=sweep. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Registered tool sends create_sweep but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_loft](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L570) | Solid features | partial | GAP | fusion_mechanical: feature_create type=loft. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Registered tool sends create_loft but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_fillet](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L600) | Solid features | partial | GAP | fusion_mechanical: feature_create type=fillet. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Registered tool sends create_fillet but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_chamfer](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L630) | Solid features | partial | GAP | fusion_mechanical: feature_create type=chamfer. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Registered tool sends create_chamfer but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_shell](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L660) | Solid features | partial | GAP | fusion_mechanical: feature_create type=shell. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Registered tool sends create_shell but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [boolean_operation](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L690) | Solid features | partial | GAP | fusion_mechanical: feature_create type=combine. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Registered tool sends boolean_operation but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [split_body](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L720) | Solid features | partial | GAP | fusion_mechanical: feature_create type=split. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Registered tool sends split_body but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_pattern_rectangular](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L750) | Solid features | partial | GAP | fusion_mechanical: feature_create type=rectangular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Registered tool sends create_pattern_rectangular but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_pattern_circular](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L792) | Solid features | partial | GAP | fusion_mechanical: feature_create type=circular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Registered tool sends create_pattern_circular but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_mirror](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L828) | Solid features | partial | GAP | fusion_mechanical: feature_create type=mirror. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Registered tool sends create_mirror but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_component](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L862) | Assemblies | dedicated | — | fusion_mechanical: component_create. Native Hybrid internal definition plus first occurrence; native Part/Assembly intents are not silently converted. | Registered tool sends create_component but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [insert_component_from_file](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L892) | Assemblies | partial | GAP | fusion_mechanical: cad_import / occurrence_insert. Local STEP/SAT wrapper import with provenance; existing definition re-instancing or independent copy. Arbitrary external linked/native document insertion is not included. | Registered tool sends insert_component_from_file but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [get_assembly_info](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L922) | Assemblies | dedicated | — | fusion_mechanical: inspect / inspect_entity. Definition and occurrence identity, nested paths, metadata and transforms. | Registered tool sends get_assembly_info but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_mate_constraint](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L939) | Joints and motion | partial | GAP | fusion_mechanical: joint_create. Seven as-built motion types. Geometry-moving regular joints, automatic mating/alignment and mate-type conversion are not implemented. | Registered tool sends create_mate_constraint but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_joint](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L975) | Joints and motion | partial | GAP | fusion_mechanical: joint_create. Seven as-built motion types. Geometry-moving regular joints, automatic mating/alignment and mate-type conversion are not implemented. | Registered tool sends create_joint but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_motion_study](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1020) | Joints and motion | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Registered tool sends create_motion_study but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [check_interference](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1053) | Measurement and engineering checks | dedicated | — | fusion_mechanical: interference. Explicit root-context occurrences/body proxies; overlap volume and touching classification, no new interference bodies. | Registered tool sends check_interference but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_exploded_view](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1080) | Joints and motion | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Registered tool sends create_exploded_view but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [animate_assembly](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1113) | Joints and motion | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Registered tool sends animate_assembly but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [measure_distance](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1150) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [measure_angle](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1207) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | |+| [measure_area](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1269) | Measurement and engineering checks | dedicated | — | fusion_mechanical: inspect / inspect_entity; fusion_physical_properties. Explicit units; component-definition and occurrence scopes are separate. | Registered tool sends measure_area but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [measure_volume](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1296) | Measurement and engineering checks | dedicated | — | fusion_mechanical: inspect / inspect_entity; fusion_physical_properties. Explicit units; component-definition and occurrence scopes are separate. | Registered tool sends measure_volume but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [calculate_mass_properties](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1320) | Measurement and engineering checks | dedicated | — | fusion_mechanical: assembly_properties; fusion_physical_properties. High-accuracy aggregate/root/component/occurrence/body mass, volume, area and center of mass with explicit units/scope. | Registered tool sends calculate_mass_properties but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [create_section_analysis](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1350) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Registered tool sends create_section_analysis but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). Unreachable helper creates only a construction plane, not a section-analysis result. |+| [perform_stress_analysis](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1380) | Simulation | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Registered tool sends perform_stress_analysis but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). Unreachable helper only returns a configuration summary, not solved analysis results (lines1899-1990). |+| [perform_modal_analysis](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1416) | Simulation | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Registered tool sends perform_modal_analysis but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). Unreachable helper only returns a configuration summary, not solved analysis results (lines1899-1990). |+| [perform_thermal_analysis](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1449) | Simulation | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Registered tool sends perform_thermal_analysis but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). Unreachable helper only returns a configuration summary, not solved analysis results (lines1899-1990). |+| [generate_analysis_report](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1482) | Simulation | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | MCP handler simulates report generation: returns filenames, hard-coded elapsed time/size/page estimates without writing those files; conclusions may state all analyses succeeded based only on nonempty findings (mcp_server.py:1557-1586). |+| [create_parameter](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1602) | Parameters and variants | dedicated | — | fusion_mechanical: parameter_create / parameter_batch. Typed length/angle/mass/unitless user parameters; other unit kinds remain outside this schema. | Registered tool sends create_parameter but shipped add-in dispatcher returns Unknown command for it (src/fusion360/addin.py:168-191). |+| [get_design_info](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1634) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | |+| [get_features_info](https://github.com/zkbkb/fusion-mcp/blob/ea90968b3592a1a2b1d1091e50720373eacd435d/src/mcp_server.py#L1643) | Feature history and health | dedicated | — | fusion_mechanical: inspect / health. Timeline entities, suppression, warnings/errors and optional recompute. | |++## frankhommers++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [call_autodesk_api](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L50) | Execution and recovery | partial | GAP | fusion_run_modeling_script; fusion_mcp_call. General Python/API execution exists; no matching persistent-session/object-store contract. | Runtime/API success not established by this inventory. Full Fusion API/script reachability is intentionally generic, not a dedicated sketch/feature/assembly/CAM authoring catalog. |+| [capture_viewport](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L137) | View and selection | dedicated | — | fusion_take_screenshot / fusion_screenshot_fusion. Background window capture; official viewport screenshot also available through MCP. | Runtime/API success not established by this inventory. |+| [delete_script](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L316) | Script storage and external tools | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Runtime/API success not established by this inventory. |+| [execute_python](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L101) | Execution and recovery | partial | GAP | fusion_run_modeling_script; fusion_mcp_call. General Python/API execution exists; no matching persistent-session/object-store contract. | Runtime/API success not established by this inventory. Full Fusion API/script reachability is intentionally generic, not a dedicated sketch/feature/assembly/CAM authoring catalog. |+| [fetch_api_documentation](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L206) | Developer and automation | delegated | — | fusion_mcp_call: fusion_mcp_read queryType=apiDocumentation. Runtime Autodesk documentation selector; no separate mirrored documentation database. | Runtime/API success not established by this inventory. |+| [fetch_design_guide](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L258) | Developer and automation | partial | GAP | Fusion bridge skill and typed schema descriptions. Workflow guidance is documented; no dedicated best-practices MCP resource parity. | Runtime/API success not established by this inventory. |+| [fetch_online_documentation](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L237) | Developer and automation | delegated | — | fusion_mcp_call: fusion_mcp_read queryType=apiDocumentation. Runtime Autodesk documentation selector; no separate mirrored documentation database. | Runtime/API success not established by this inventory. |+| [get_active_selection](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L330) | View and selection | partial | GAP | fusion_mechanical inspect / inspect_entity. Typed explicit references exist; no dedicated current user-selection enumeration contract. | Runtime/API success not established by this inventory. |+| [get_viewport](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L171) | View and selection | partial | GAP | fusion_view; fusion_mcp_call screenshot. Standard views/orbit/zoom and capture; arbitrary camera/render parameters require scripting. | Runtime/API success not established by this inventory. |+| [list_scripts](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L305) | Script storage and external tools | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Runtime/API success not established by this inventory. |+| [load_script](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L291) | Script storage and external tools | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Runtime/API success not established by this inventory. |+| [manage_annotations](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L344) | Geometry annotations and collaboration | partial | GAP | See individual action rows in ACTION-MATRIX.md. Grouped operation; coverage differs per selector. Every enumerated action has its own gap flag. | Runtime/API success not established by this inventory. |+| [save_script](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L269) | Script storage and external tools | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Runtime/API success not established by this inventory. |+| [set_viewport](https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L180) | View and selection | partial | GAP | fusion_view; fusion_mcp_call screenshot. Standard views/orbit/zoom and capture; arbitrary camera/render parameters require scripting. | Runtime/API success not established by this inventory. |++## joxoo++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [analyze_design](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis.py#L64) | Measurement and engineering checks | partial | GAP | See individual action rows in ACTION-MATRIX.md. Grouped operation; coverage differs per selector. Every enumerated action has its own gap flag. | Runtime/API success not established by this inventory. |+| [apply_3d_features](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry.py#L177) | Solid features | partial | GAP | See individual action rows in ACTION-MATRIX.md. Grouped operation; coverage differs per selector. Every enumerated action has its own gap flag. | Runtime/API success not established by this inventory. Grouped actions are sequential script batches, not evidenced atomic transactions. Successful earlier actions can remain when a later action errors. |+| [apply_appearance](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/advanced_geometry.py#L130) | Appearance and rendering | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Runtime/API success not established by this inventory. |+| [apply_custom_thread](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/threads.py#L34) | Solid features | partial | GAP | fusion_mechanical: sketch_geometry + feature_create thread. Native standards-based threads and typed part construction; custom thread-profile/bolt convenience generators are absent. | Runtime/API success not established by this inventory. |+| [capture_side](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis.py#L66) | View and selection | dedicated | — | fusion_take_screenshot / fusion_screenshot_fusion. Background window capture; official viewport screenshot also available through MCP. | Runtime/API success not established by this inventory. |+| [capture_view](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis.py#L65) | View and selection | dedicated | — | fusion_take_screenshot / fusion_screenshot_fusion. Background window capture; official viewport screenshot also available through MCP. | Runtime/API success not established by this inventory. |+| [create_bolt](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/mechanical.py#L58) | Solid features | partial | GAP | fusion_mechanical: sketch_geometry + feature_create thread. Native standards-based threads and typed part construction; custom thread-profile/bolt convenience generators are absent. | Runtime/API success not established by this inventory. |+| [create_gear](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/mechanical.py#L59) | Solid features | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Runtime/API success not established by this inventory. |+| [create_loft](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/advanced_geometry.py#L125) | Solid features | partial | GAP | fusion_mechanical: feature_create type=loft. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [create_revolve](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/advanced_geometry.py#L127) | Solid features | partial | GAP | fusion_mechanical: feature_create type=revolve. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [create_sketch](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch.py#L300) | Sketches | dedicated | — | fusion_mechanical: sketch_create. Origin/construction planes and planar faces; native component-definition references. | Runtime/API success not established by this inventory. |+| [create_sweep](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/advanced_geometry.py#L126) | Solid features | partial | GAP | fusion_mechanical: feature_create type=sweep. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [delete_feature](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry.py#L179) | Feature history and health | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. | Runtime/API success not established by this inventory. |+| [describe_tool_actions](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/design.py#L108) | Developer and automation | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | Runtime/API success not established by this inventory. |+| [direct_api_access](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/design.py#L106) | Execution and recovery | dedicated | — | fusion_run_modeling_script; fusion_mcp_call. Python API escape hatch; arbitrary scripts do not inherit typed-operation safety guarantees. | Runtime/API success not established by this inventory. |+| [edit_assembly](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/assembly.py#L57) | Assemblies | partial | GAP | See individual action rows in ACTION-MATRIX.md. Grouped operation; coverage differs per selector. Every enumerated action has its own gap flag. | Runtime/API success not established by this inventory. Grouped actions are sequential script batches, not evidenced atomic transactions. Successful earlier actions can remain when a later action errors. |+| [edit_feature](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry.py#L178) | Feature history and health | partial | GAP | fusion_mechanical: feature_edit. Rename, suppression and expressions owned by that feature; arbitrary feature-definition replacement/reordering absent. | Runtime/API success not established by this inventory. |+| [edit_forms](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/forms.py#L23) | Surface and mesh | partial | GAP | See individual action rows in ACTION-MATRIX.md. Grouped operation; coverage differs per selector. Every enumerated action has its own gap flag. | Runtime/API success not established by this inventory. The dispatch accepts revolve/sweep/loft but only extrude has a body; the other three append no result and finish as OK (line391). These accepted actions are placeholders/no-ops, despite existing unregistered helper builders elsewhere. Form extrusion calls formFeatures.addExtrude, which is absent from the documented FormFeatures API; its exception becomes action:ERR:..., while modules/forms.py:17 only tests ERR_, allowing false success. Grouped actions are sequential script batches, not evidenced atomic transactions. Successful earlier actions can remain when a later action errors. |+| [edit_mesh](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/mesh.py#L44) | Surface and mesh | partial | GAP | See individual action rows in ACTION-MATRIX.md. Grouped operation; coverage differs per selector. Every enumerated action has its own gap flag. | Runtime/API success not established by this inventory. Batch entries such as remesh:ERR_NOT_A_MESH and action:ERR:... do not match core/error_handler.py:map_result_error exact-key or startswith ERR_ checks; edit_mesh can report success for rejected/failed entries. Grouped actions are sequential script batches, not evidenced atomic transactions. Successful earlier actions can remain when a later action errors. |+| [edit_parameters](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/parameters.py#L37) | Parameters | partial | — | See individual action rows in ACTION-MATRIX.md. Grouped operation; coverage differs per selector. Every enumerated action has its own gap flag. | Runtime/API success not established by this inventory. Grouped actions are sequential script batches, not evidenced atomic transactions. Successful earlier actions can remain when a later action errors. |+| [edit_sketch](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/sketch.py#L301) | Sketches | partial | GAP | See individual action rows in ACTION-MATRIX.md. Grouped operation; coverage differs per selector. Every enumerated action has its own gap flag. | Runtime/API success not established by this inventory. Grouped actions are sequential script batches, not evidenced atomic transactions. Successful earlier actions can remain when a later action errors. |+| [edit_surfaces](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/surfaces.py#L23) | Surface and mesh | partial | GAP | See individual action rows in ACTION-MATRIX.md. Grouped operation; coverage differs per selector. Every enumerated action has its own gap flag. | Runtime/API success not established by this inventory. Per-operation exceptions are action:ERR:..., but modules/surfaces.py:17 only checks ERR_; a failed surface operation can return the localized success message. Grouped actions are sequential script batches, not evidenced atomic transactions. Successful earlier actions can remain when a later action errors. |+| [execute_python_script](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/geometry.py#L180) | Execution and recovery | dedicated | — | fusion_run_modeling_script; fusion_mcp_call. Python API escape hatch; arbitrary scripts do not inherit typed-operation safety guarantees. | Runtime/API success not established by this inventory. |+| [export_model](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/export.py#L27) | Import and export | partial | GAP | fusion_mechanical: export. STEP/STL/3MF/F3D/IGES/SAT/SMT/USDZ/FBX/SKP with runtime preflight; no generic OBJ or sketch DXF export. | Runtime/API success not established by this inventory. Exporter scripts ignore exportManager.execute boolean, write directly to final paths, and can report Exported after Fusion returns false. manage_design export_step/export_stl branches share this pattern (design_scripts.py:75-89). |+| [get_center_of_mass](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/advanced_geometry.py#L129) | Measurement and engineering checks | dedicated | — | fusion_mechanical: assembly_properties; fusion_physical_properties. High-accuracy aggregate/root/component/occurrence/body mass, volume, area and center of mass with explicit units/scope. | Runtime/API success not established by this inventory. |+| [get_feature_history](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis.py#L67) | Inspection | dedicated | — | fusion_mechanical: inspect / health. Timeline entities, suppression, warnings/errors and optional recompute. | Runtime/API success not established by this inventory. |+| [import_mesh](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/mesh.py#L43) | Mesh | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Runtime/API success not established by this inventory. Calls ImportManager.createMeshImportOptions and MeshImportUnits; createMeshImportOptions is absent from the current documented ImportManager API. Documented mesh import uses MeshBodies.add. |+| [list_mcp_tools](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/design.py#L107) | Developer and automation | dedicated | — | fusion_readiness / fusion_get_app_state. Application identity and bridge/add-in version discovery; output schemas differ. | Runtime/API success not established by this inventory. |+| [list_parameters](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/parameters.py#L36) | Parameters and variants | dedicated | — | fusion_mechanical: inspect; fusion_get_parameters. User and model parameters with expressions and units. | Runtime/API success not established by this inventory. |+| [manage_design](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/design.py#L105) | Document and execution | partial | GAP | See individual action rows in ACTION-MATRIX.md. Grouped operation; coverage differs per selector. Every enumerated action has its own gap flag. | Runtime/API success not established by this inventory. Exporter scripts ignore exportManager.execute boolean, write directly to final paths, and can report Exported after Fusion returns false. manage_design export_step/export_stl branches share this pattern (design_scripts.py:75-89). Cleanup catches deletion failures individually and still returns OK at line68; a partially cleaned design is reported as success. |+| [measure_distance](https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/advanced_geometry.py#L128) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Runtime/API success not established by this inventory. |++## prim++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [batch](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L763) | Execution and recovery | partial | GAP | fusion_mechanical: parameter_batch / transaction_probe. Atomic parameter batch exists; arbitrary mixed-operation pipeline with file/cloud rollback is absent. | Runtime/API success not established by this inventory. Batch executes sequentially and returns on first exception without undoing earlier commands. Successful partial work remains after failure; not atomic. |+| [chamfer](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L272) | Solid features | partial | GAP | fusion_mechanical: feature_create type=chamfer. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [check_interference](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L666) | Measurement and engineering checks | dedicated | — | fusion_mechanical: interference. Explicit root-context occurrences/body proxies; overlap volume and touching classification, no new interference bodies. | Runtime/API success not established by this inventory. |+| [combine](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L384) | Solid features | partial | GAP | fusion_mechanical: feature_create type=combine. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [create_component](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L421) | Assemblies | dedicated | — | fusion_mechanical: component_create. Native Hybrid internal definition plus first occurrence; native Part/Assembly intents are not silently converted. | Runtime/API success not established by this inventory. |+| [create_joint](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L512) | Joints and motion | partial | GAP | fusion_mechanical: joint_create. Seven as-built motion types. Geometry-moving regular joints, automatic mating/alignment and mate-type conversion are not implemented. | Runtime/API success not established by this inventory. |+| [create_rigid_group](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L601) | Joints and motion | dedicated | — | fusion_mechanical: rigid_group_create. Exact occurrences and includeChildren policy. | Runtime/API success not established by this inventory. |+| [create_sketch](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L87) | Sketches | dedicated | — | fusion_mechanical: sketch_create. Origin/construction planes and planar faces; native component-definition references. | Runtime/API success not established by this inventory. |+| [delete_body](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L751) | Body operations | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. | Runtime/API success not established by this inventory. |+| [delete_component](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L439) | Assemblies | partial | GAP | fusion_mechanical: occurrence_delete. Deletes exact selected instance; bulk deletion of every instance of a definition is not a one-call operation. | Runtime/API success not established by this inventory. |+| [delete_rigid_group](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L619) | Assemblies | dedicated | — | fusion_mechanical: rigid_group_delete. Exact guarded group with transaction recovery. | Runtime/API success not established by this inventory. |+| [delete_sketch](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L757) | Sketches | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. | Runtime/API success not established by this inventory. |+| [draft](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L301) | Solid features | partial | GAP | fusion_mechanical: feature_create type=draft. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [draw_arc](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L131) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=arc. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Runtime/API success not established by this inventory. |+| [draw_circle](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L125) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=circle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Runtime/API success not established by this inventory. |+| [draw_line](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L113) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=line. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Runtime/API success not established by this inventory. |+| [draw_polygon](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L145) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=polygon. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Runtime/API success not established by this inventory. |+| [draw_rectangle](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L119) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=rectangle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Runtime/API success not established by this inventory. |+| [draw_slot](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L165) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=slot. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Runtime/API success not established by this inventory. |+| [draw_spline](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L154) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=spline. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Runtime/API success not established by this inventory. |+| [drive_joint](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L577) | Joints and motion | partial | GAP | fusion_mechanical: joint_edit. Joint limits/rest/suppression and supported motion values with bounds checks; no animation or motion-study sequence authoring. | Runtime/API success not established by this inventory. |+| [execute_python](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L787) | Execution and recovery | dedicated | — | fusion_run_modeling_script; fusion_mcp_call. Python API escape hatch; arbitrary scripts do not inherit typed-operation safety guarantees. | Runtime/API success not established by this inventory. Python exception is returned as a normal result dictionary with error/traceback; outer dispatch wraps it in success:true and the MCP send_command helper does not raise for this nested error. |+| [export_3mf](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L728) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | Runtime/API success not established by this inventory. Ignores ExportManager.execute boolean and returns exported filepath unconditionally; no staging/nonempty validation/destination preservation. |+| [export_step](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L722) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | Runtime/API success not established by this inventory. Ignores ExportManager.execute boolean and returns exported filepath unconditionally; no staging/nonempty validation/destination preservation. |+| [export_stl](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L716) | Export | partial | GAP | fusion_mechanical: export. Verified staged whole-design export with explicit overwrite. Comparator body-selection options are not all exposed. | Runtime/API success not established by this inventory. Ignores ExportManager.execute boolean and returns exported filepath unconditionally; no staging/nonempty validation/destination preservation. |+| [extrude](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L184) | Solid features | partial | GAP | fusion_mechanical: feature_create type=extrude. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [fillet](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L259) | Solid features | partial | GAP | fusion_mechanical: feature_create type=fillet. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [finish_sketch](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L102) | Sketches | composable | — | fusion_mechanical: sketch_geometry. Typed operations solve at completion; an interactive sketch-edit mode need not be entered. | Runtime/API success not established by this inventory. |+| [fit_view](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L705) | Viewport | dedicated | — | fusion_view. Named standard views and fit; view action schema governs exact options. | Runtime/API success not established by this inventory. |+| [get_body_info](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L636) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | Runtime/API success not established by this inventory. |+| [get_design_info](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L630) | Inspection | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | Runtime/API success not established by this inventory. |+| [import_mesh](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L734) | Mesh | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Runtime/API success not established by this inventory. Uses ImportManager.createMeshImportOptions, absent from the current documented ImportManager API; this is not established working mesh import. |+| [list_components](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L433) | Assemblies | dedicated | — | fusion_mechanical: inspect / inspect_entity. Definition and occurrence identity, nested paths, metadata and transforms. | Runtime/API success not established by this inventory. |+| [list_joints](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L590) | Joints and motion | dedicated | — | fusion_mechanical: inspect / inspect_entity. Typed motion readback and occurrence identity; exact output shape differs. | Runtime/API success not established by this inventory. |+| [list_rigid_groups](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L613) | Assemblies | dedicated | — | fusion_mechanical: inspect. Rigid-group readback included in assembly state. | Runtime/API success not established by this inventory. |+| [loft](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L242) | Solid features | partial | GAP | fusion_mechanical: feature_create type=loft. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [measure](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L649) | Measurement and engineering checks | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Runtime/API success not established by this inventory. |+| [mirror](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L367) | Solid features | partial | GAP | fusion_mechanical: feature_create type=mirror. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [move_component](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L462) | Assemblies | dedicated | — | fusion_mechanical: occurrence_update. Absolute instance pose in assembly context, grounding checks and captured position. Relative motion requires composing the requested pose. | Runtime/API success not established by this inventory. |+| [pattern_circular](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L351) | Solid features | partial | GAP | fusion_mechanical: feature_create type=circular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [pattern_rectangular](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L328) | Solid features | partial | GAP | fusion_mechanical: feature_create type=rectangular_pattern. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [rename](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L445) | Solid features | partial | GAP | fusion_mechanical: component_metadata / feature_edit. Component and feature names covered; arbitrary body/mesh/sketch rename parity is not claimed. | Runtime/API success not established by this inventory. |+| [revolve](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L209) | Solid features | partial | GAP | fusion_mechanical: feature_create type=revolve. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [rotate_component](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L483) | Assemblies | dedicated | — | fusion_mechanical: occurrence_update. Absolute instance pose in assembly context, grounding checks and captured position. Relative motion requires composing the requested pose. | Runtime/API success not established by this inventory. |+| [screenshot](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L672) | View and selection | dedicated | — | fusion_take_screenshot / fusion_screenshot_fusion. Background window capture; official viewport screenshot also available through MCP. | Runtime/API success not established by this inventory. |+| [set_joint_limits](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L553) | Joints and motion | partial | GAP | fusion_mechanical: joint_edit. Joint limits/rest/suppression and supported motion values with bounds checks; no animation or motion-study sequence authoring. | Runtime/API success not established by this inventory. |+| [shell](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L285) | Solid features | partial | GAP | fusion_mechanical: feature_create type=shell. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [split_body](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L401) | Solid features | partial | GAP | fusion_mechanical: feature_create type=split. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [sweep](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L226) | Solid features | partial | GAP | fusion_mechanical: feature_create type=sweep. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [undo](https://github.com/prim-design/fusion-mcp/blob/13fd2ef6290ade0f076ff3227ddb64d58322f349/server/fusion360_mcp_server.py#L745) | Execution and recovery | delegated | — | fusion_mcp_call: fusion_mcp_update. Existing official desktop MCP proxy; requires that local MCP server enabled. | Runtime/API success not established by this inventory. |++## Poyraxx++| Feature | Category | Bridge coverage | Gap | Route and limitations | External caveat |+|---|---|---|---|---|---|+| [activate_electronics_document](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4336) | Electronics | dedicated | — | fusion_activate_document. Existing explicit document activation. | Runtime/API success not established by this inventory. |+| [add_sketch_constraint](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4261) | Sketches | dedicated | — | fusion_mechanical: sketch_constraint. Twelve constraint kinds, including fix; explicit selection from current sketch references. | Runtime/API success not established by this inventory. |+| [add_sketch_dimension](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4266) | Sketches | dedicated | — | fusion_mechanical: sketch_dimension. Distance/horizontal/vertical/radius/diameter/angle; expressions and named model parameters. | Runtime/API success not established by this inventory. |+| [begin_electronics_change](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4306) | Electronics | partial | GAP | Existing electronics verbs and fusion_mcp_call. Electronics workflows exist, but this server-specific transaction/document/file schema is not claimed as equivalent. | Runtime/API success not established by this inventory. |+| [cancel_electronics_change](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4316) | Electronics | partial | GAP | Existing electronics verbs and fusion_mcp_call. Electronics workflows exist, but this server-specific transaction/document/file schema is not claimed as equivalent. | Runtime/API success not established by this inventory. |+| [create_component](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4201) | Assemblies | dedicated | — | fusion_mechanical: component_create. Native Hybrid internal definition plus first occurrence; native Part/Assembly intents are not silently converted. | Runtime/API success not established by this inventory. |+| [create_electronics_sheet](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4301) | Electronics | partial | GAP | Existing electronics verbs and fusion_mcp_call. Electronics workflows exist, but this server-specific transaction/document/file schema is not claimed as equivalent. | Runtime/API success not established by this inventory. |+| [create_extrude](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4271) | Solid features | partial | GAP | fusion_mechanical: feature_create type=extrude. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [create_new_sketch](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4191) | Sketches | dedicated | — | fusion_mechanical: sketch_create. Origin/construction planes and planar faces; native component-definition references. | Runtime/API success not established by this inventory. |+| [create_offset_plane](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4206) | Construction geometry | partial | GAP | fusion_mechanical: plane_create. Offset and angle planes only; three-point/midplane/tangent forms remain gaps. | Runtime/API success not established by this inventory. |+| [create_parameter](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4196) | Parameters and variants | dedicated | — | fusion_mechanical: parameter_create / parameter_batch. Typed length/angle/mass/unitless user parameters; other unit kinds remain outside this schema. | Runtime/API success not established by this inventory. |+| [create_revolve](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4276) | Solid features | partial | GAP | fusion_mechanical: feature_create type=revolve. Common solid operation is implemented; the full comparator option set is not promised. See native input schema for exact selections/extents. | Runtime/API success not established by this inventory. |+| [create_sketch_arc](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4251) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=arc. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Runtime/API success not established by this inventory. |+| [create_sketch_center_rectangle](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4246) | Sketches | composable | — | fusion_mechanical: sketch_geometry type=rectangle. Convert center/width/height into two opposite corners. | Runtime/API success not established by this inventory. |+| [create_sketch_circle](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4236) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=circle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Runtime/API success not established by this inventory. |+| [create_sketch_line](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4226) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=line. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Runtime/API success not established by this inventory. |+| [create_sketch_lines](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4231) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=line. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Runtime/API success not established by this inventory. |+| [create_sketch_point](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4221) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=point. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Runtime/API success not established by this inventory. |+| [create_sketch_rectangle](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4241) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=rectangle. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Runtime/API success not established by this inventory. |+| [create_sketch_spline](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4256) | Sketches | dedicated | — | fusion_mechanical: sketch_geometry type=spline. Native sketch-space mm; numeric angles deg. Exact comparator convenience arguments may require conversion. | Runtime/API success not established by this inventory. |+| [delete_body](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4281) | Body operations | partial | GAP | fusion_mechanical: entity_delete. Guarded native entities with supported deletion APIs; destructive bulk/latest-by-index selection is intentionally absent. | Runtime/API success not established by this inventory. |+| [end_electronics_change](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4311) | Electronics | partial | GAP | Existing electronics verbs and fusion_mcp_call. Electronics workflows exist, but this server-specific transaction/document/file schema is not claimed as equivalent. | Runtime/API success not established by this inventory. |+| [execute_electronics_api](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4361) | Electronics | delegated | — | fusion_mcp_call: fusion_mcp_execute featureType=script. Official local MCP script execution; electronics product context and permissions still apply. | Runtime/API success not established by this inventory. |+| [execute_fusion_api](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4356) | Execution and recovery | dedicated | — | fusion_run_modeling_script; fusion_mcp_call. Python API escape hatch; arbitrary scripts do not inherit typed-operation safety guarantees. | Runtime/API success not established by this inventory. |+| [execute_text_command](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4346) | Electronics | dedicated | — | fusion_execute_text_command. Existing raw text-command entry point. | Runtime/API success not established by this inventory. |+| [export_active_drawing_pdf](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4296) | Import and export | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Runtime/API success not established by this inventory. This is an actual dedicated PDF-export API path, not a screenshot placeholder. DrawingDocument.drawing and DrawingExportManager.createPDFExportOptions are documented; this source audit does not prove live export. |+| [export_design_file](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4291) | Import and export | partial | GAP | fusion_mechanical: export. STEP/STL/3MF/F3D/IGES/SAT/SMT/USDZ/FBX/SKP with runtime preflight; no generic OBJ or sketch DXF export. | Runtime/API success not established by this inventory. Export checks execute boolean, but writes directly to destination; preservation/atomic publication is not established. No sheet-metal/CAM authoring tools are registered; generic execution reachability is separate. |+| [export_electronics_file](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4341) | Electronics | partial | GAP | Existing electronics verbs and fusion_mcp_call. Electronics workflows exist, but this server-specific transaction/document/file schema is not claimed as equivalent. | Runtime/API success not established by this inventory. |+| [export_sketch_dxf](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4286) | Import and export | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Runtime/API success not established by this inventory. |+| [inspect_fusion_object](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4351) | Developer and automation | partial | GAP | fusion_mechanical: inspect / inspect_entity. Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ. | Runtime/API success not established by this inventory. |+| [list_electronics_documents](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4321) | Electronics | dedicated | — | fusion_get_app_state. Existing document listing. | Runtime/API success not established by this inventory. |+| [list_sketch_entities](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4211) | Sketches | dedicated | — | fusion_mechanical: inspect / inspect_entity. Curves, points, dimensions, constraint types, profiles and fully-constrained state. | Runtime/API success not established by this inventory. |+| [list_sketch_profiles](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4216) | Sketches | dedicated | — | fusion_mechanical: inspect / inspect_entity. Curves, points, dimensions, constraint types, profiles and fully-constrained state. | Runtime/API success not established by this inventory. |+| [message_box](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4186) | Document and execution | script-only | GAP | fusion_run_modeling_script. No dedicated bridge operation. General API execution exists; this feature is not thereby implemented or verified. | Runtime/API success not established by this inventory. |+| [open_electronics_document](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4331) | Electronics | partial | GAP | Existing electronics verbs and fusion_mcp_call. Electronics workflows exist, but this server-specific transaction/document/file schema is not claimed as equivalent. | Runtime/API success not established by this inventory. |+| [upload_electronics_project](https://github.com/Poyraxx/fusion-advanced-mcp-server/blob/2dfb68993caad514a1346a9641ca9f9d149c88c7/MCPserve/commands/MCPServerCommand.py#L4326) | Electronics | partial | GAP | Existing electronics verbs and fusion_mcp_call. Electronics workflows exist, but this server-specific transaction/document/file schema is not claimed as equivalent. | Runtime/API success not established by this inventory. |
docs/mechanical-comparison/PROTOCOL-MATRIX.mdadded+70@@ -0,0 +1,70 @@+# Protocol and resource comparison++Separate from tool/action counts. Equivalent CAD data may be exposed through bridge verbs while the exact external protocol resource or prompt is absent.++| Repository | Kind | Feature | Gap | Bridge comparison |+|---|---|---|---|---|+| faust | resource/template | fusion360://status | GAP | fusion_readiness. Equivalent data is available through verbs; the same MCP resource URI is not registered by our bridge. |+| faust | resource/template | fusion360://design | GAP | fusion_mechanical inspect. Equivalent data is available through verbs; the same MCP resource URI is not registered by our bridge. |+| faust | resource/template | fusion360://parameters | GAP | fusion_mechanical inspect. Equivalent data is available through verbs; the same MCP resource URI is not registered by our bridge. |+| faust | resource/template | fusion360://body/{name} | GAP | fusion_mechanical inspect_entity. Equivalent data is available through verbs; the same MCP resource URI is not registered by our bridge. |+| faust | resource/template | fusion360://component/{name} | GAP | fusion_mechanical inspect_entity. Equivalent data is available through verbs; the same MCP resource URI is not registered by our bridge. |+| faust | prompt | create-box | GAP | docs/MECHANICAL.md. No matching MCP prompt registration. Sheet-metal authoring also remains outside checkpoints1–3. |+| faust | prompt | model-threaded-bolt | GAP | docs/MECHANICAL.md. No matching MCP prompt registration. Sheet-metal authoring also remains outside checkpoints1–3. |+| faust | prompt | sheet-metal-enclosure | GAP | docs/MECHANICAL.md. No matching MCP prompt registration. Sheet-metal authoring also remains outside checkpoints1–3. |+| faust | protocol | Tool readOnly/destructive/idempotent annotations | GAP | Bridge verb schemas and permissions. Different discovery/permission surface; no per-feature Faust annotations contract. |+| faust | execution | Structured errors and timeout cancellation | GAP | Typed mechanical errors, operation IDs and status polling. Stable mechanical errorCode and replay semantics are implemented; exact cancellation/error-kind contracts differ. |+| faust | testing | Explicit mock mode | GAP | Offline test API fakes. No public plausible-geometry mock server mode. |+| Justus | prompt | weingals | GAP | docs/MECHANICAL.md. Documented workflows, no matching MCP prompt registration. |+| Justus | prompt | magnet | GAP | docs/MECHANICAL.md. Documented workflows, no matching MCP prompt registration. |+| Justus | prompt | dna | GAP | docs/MECHANICAL.md. Documented workflows, no matching MCP prompt registration. |+| Justus | prompt | flansch | GAP | docs/MECHANICAL.md. Documented workflows, no matching MCP prompt registration. |+| Justus | prompt | vase | GAP | docs/MECHANICAL.md. Documented workflows, no matching MCP prompt registration. |+| Justus | prompt | teil | GAP | docs/MECHANICAL.md. Documented workflows, no matching MCP prompt registration. |+| Justus | prompt | kompensator | GAP | docs/MECHANICAL.md. Documented workflows, no matching MCP prompt registration. |+| artapo | execution | Bearer-token protected local main-thread Python executor; inline image results and API signature suggestions | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| zkbkb | resource | fusion360://design/info | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| zkbkb | resource | fusion360://context/summary | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| frankhommers | protocol/operation | Generic API path calls and constructor/reference store | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| frankhommers | protocol/operation | Python session_id persistent variables | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| frankhommers | protocol/operation | Session-only selection annotation claim/release/complete workflow with document/revision guards | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| frankhommers | protocol/operation | Viewport camera snapshot/restore, temporary camera capture, crop/background/anti-alias controls | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| frankhommers | protocol/operation | MCP protocol negotiation, cancellation distinguishes queued vs already-running work | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| frankhommers | protocol/operation | Subscriptions endpoint acknowledges empty notification filters; static tools/resources do not emit change events | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| frankhommers | protocol/operation | Saved Python script CRUD | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| frankhommers | protocol/operation | Runtime API introspection and online documentation lookup | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| frankhommers | resource | fusion://design-guide | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| joxoo | protocol/operation | Compact15/full31 API registration profiles; full is opt-in | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| joxoo | protocol/operation | stdio/SSE/streamable-http transport choices | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| joxoo | protocol/operation | English schema descriptions and hidden lang runtime parameter; argument aliases | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| joxoo | protocol/operation | File/script execution bridge with structured bridge error mapping | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| joxoo | protocol/operation | Operation batches execute sequentially; no proven atomic rollback | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| joxoo | protocol/operation | Action discovery through describe_tool_actions and JSON guide | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| prim | protocol/operation | FastMCP stdio server over local newline-delimited TCP JSON bridge | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| prim | protocol/operation | Fusion CustomEvent marshals queued commands to main thread | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| prim | protocol/operation | execute_python persists non-callable variables by session_id | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| prim | protocol/operation | batch stops at first exception; previous commands remain applied | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| prim | protocol/operation | Root/component body and sketch ordinal selection defaults to latest item | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| Poyraxx | protocol/operation | FastMCP HTTP SSE and file-based fallback | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| Poyraxx | protocol/operation | Fusion CustomEvent main-thread marshaling | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| Poyraxx | protocol/operation | Explicit electronics begin/end/cancel design-change transactions | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| Poyraxx | protocol/operation | Generic live API inspection/execution for design, drawing, CAM and electronics | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| Poyraxx | protocol/operation | Structured error payload includes traceback; not necessarily MCP isError | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| Poyraxx | protocol/operation | Runtime package auto-install path exists; source was not run in this audit | GAP | See corresponding typed operation or documentation where applicable. No matching protocol contract claimed; generic scripting does not establish parity. |+| Poyraxx | resource | fusion://active-document-info | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | resource | fusion://design-structure | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | resource | fusion://parameters | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | resource | fusion://components | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | resource | fusion://sketches | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | resource | fusion://bodies | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | resource | fusion://electronics-context | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | resource | fusion://electronics-schematic | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | resource | fusion://electronics-board | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | resource | fusion://electronics-library | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | resource | fusion://electronics-libraries | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | resource | fusion://electronics-documents | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | resource | fusion://electronics-errors | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | resource | fusion://mcp-capabilities | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | prompt | create_sketch_prompt | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | prompt | parameter_setup_prompt | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |+| Poyraxx | prompt | feature_strategy_prompt | GAP | Bridge verbs or documentation provide some equivalent data; no same URI/prompt registration. Protocol registration gap; inspect corresponding feature route for mechanical capability. |
docs/mechanical-comparison/README.mdadded+20@@ -0,0 +1,20 @@+# Fusion mechanical comparison evidence++Checked October 2, 2026. This record covers the pinned registered surfaces in **16 repositories**, our **SolidWorks bridge 0.9.11**, the live Autodesk desktop MCP, and Autodesk's published Data/Compute capabilities. It does not claim to enumerate every public repository or every API reachable through scripting.++| Record | Scope |+|---|---|+| [Feature matrix](FEATURE-MATRIX.md), [JSON](external-features.json), [CSV](external-features.csv) | 695 tool, dispatch-command and explicitly identified helper rows; each has a bridge route and gap flag. Repository metadata distinguishes actual MCP tools from HTTP commands, CLI commands and script helpers. |+| [Action matrix](ACTION-MATRIX.md), [JSON](action-features.json), [CSV](action-features.csv) | 122 named selector branches inside grouped tools, including aliases. These are not additional MCP registrations. |+| [Protocol matrix](PROTOCOL-MATRIX.md), [JSON](protocol-features.json) | 64 resources, templates, prompts and selected operational/protocol features. |+| [Official feature inventory](official-features.json) | 64 live desktop selector values plus 11 published Data/Compute capability groups. Authenticated cloud tool catalogs were not enumerated. |+| [Desktop tool schemas](autodesk-desktop-tools.json) | Actual four-tool catalog from the user's installed Fusion 2705.1.11. |+| [SolidWorks comparison](solidworks-parity.md), [catalog](solidworks-catalog.json) | Current 67-verb / 11-DSL-operation baseline, including its successful McMaster assembly workflow. |+| [Remaining mechanical scope](REMAINING-GAPS.md) | Grouped follow-on work after milestones 1–3, with suggested priorities. |+| [Source caveats](external-source-caveats.md), [additional review](additional-source-review.md) | Concrete placeholders, unreachable handlers, API mismatches and false-success paths found in surveyed source. |+| [Autodesk Compute assessment](autodesk-compute.md) | September 15 public beta, prerequisites, limits, Codex availability and practical cloud-job opportunities. |+| [McMaster/BOM assessment](mcmaster-and-bom.md) | Native picker versus downloaded CAD ingestion, provenance and purchasing/physical quantity policies. |++`dedicated` means a named bridge operation covers the stated behavior. `composable` means a workflow can be formed from typed operations. `partial` flags narrower semantics or missing options. `script-only` means there is no dedicated operation; arbitrary code access does not establish a working implementation. `delegated` depends on the separate server being enabled and accessible. Per-feature source coverage is not a claim that every option was exercised live; the [build handoff](../build-2026-10-02.md) and verification reports identify the tested subset.++Do not rank servers by these raw counts. A single generic script tool reaches many APIs; a grouped MCP tool may expose dozens of selectors; some advertised operations do no work. The inventory preserves those distinctions. Source pins and line links make each comparison reviewable. No surveyed implementation code was copied into the bridge.
docs/mechanical-comparison/REMAINING-GAPS.mdadded+18@@ -0,0 +1,18 @@+# Remaining mechanical scope after milestones 1–3++The feature matrices record every surveyed registration and grouped selector, including source defects. This table groups the remaining dedicated-operation gaps into useful follow-on work. Generic script access does not close these gaps. Some external servers only claim or attempt these operations; consult each row's source caveat before adopting an implementation.++| Area | Remaining work | Suggested order |+|---|---|---|+| Assemblies | Regular geometry-moving joints, automatic mating/alignment, motion studies, contact sets, external linked-document insertion | Next mechanical increment: build on the verified occurrence and as-built joint contracts. |+| Sketch and reference geometry | Offset/trim/extend, text/SVG, sketch patterns, deleting dimensions/constraints, construction axes/UCS and additional plane forms | Prioritize the sketch operations needed for actual part workflows. |+| Engineering inspection | Moments/products of inertia; dedicated distance/angle/thickness/draft/printability analysis and selection annotations | Add explicit coordinate/unit contracts and manufactured-part examples. |+| Configuration management | Native configuration tables and robust variant generation; arbitrary mixed-operation batches | Keep model transactions separate from filesystem/cloud publication. |+| Drawings | Engineering drawing creation/editing, drawing PDF/DXF/DWG, dedicated sketch DXF | Separate native drawing output from viewport images. Poyraxx includes a real documented PDF export call; some other surveyed drawing commands are placeholders. |+| Geometry families | Surface operations, T-spline/form authoring, mesh import/edit/repair and tessellation controls | Add separately negotiated capabilities; some surveyed form/mesh handlers are no-ops or API mismatches. |+| Manufacturing and analysis | Sheet-metal rules/flanges/unfold/refold; CAM setups/toolpaths/posting; simulation workflows | Treat licence/extension/API availability and verified generated results as acceptance conditions. |+| Exchange and packaging | Additional format parity with SolidWorks, linked-reference Pack and Go equivalent | Preserve destination safety and archive roundtrip checks. |+| Agent services | Persistent Python object/session store, script CRUD, MCP resources/prompts and model-change subscriptions | Useful integration features, distinct from CAD geometry coverage. |+| Cloud execution | Optional Fusion Compute TypeScript adapter and saved job manifests | Public beta assessment is in autodesk-compute.md; authenticated account access has not been tested. |++Known bounds in the delivered surface: material assignment selects existing loaded material IDs rather than creating custom material definitions; supplier CAD ingestion accepts local STEP/SAT; native McMaster browsing is interactive; the operation ledger is scoped to the add-in session; typed exports are whole-design operations. See the runtime schemas for exact options and the build handoff for the independently exercised subset.
docs/mechanical-comparison/action-features.csvadded+12@@ -0,0 +1,123 @@+repository,parentTool,name,coverage,gap,bridgeRoute,gapDetail,sourceUrl +frankhommers,manage_annotations,list,script-only,True,fusion_run_modeling_script,No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity.,https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L344 +frankhommers,manage_annotations,claim,script-only,True,fusion_run_modeling_script,No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity.,https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L344 +frankhommers,manage_annotations,complete,script-only,True,fusion_run_modeling_script,No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity.,https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L344 +frankhommers,manage_annotations,release,script-only,True,fusion_run_modeling_script,No dedicated operation for this action in this geometry/workflow context; general scripting is not implemented parity.,https://github.com/frankhommers/autodesk-fusion-mcp/blob/cbd01e540af425a81913d4e6c0d49e09e723aeb6/fusion_bridge/tool_surface.py#L344 +joxoo,analyze_design,get_assembly_tree,dedicated,False,fusion_mechanical: inspect / inspect_entity,"Definition and occurrence identity, nested paths, metadata and transforms.",https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L526 +joxoo,analyze_design,get_feature_history,dedicated,False,fusion_mechanical: inspect / health,"Timeline entities, suppression, warnings/errors and optional recompute.",https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L532 +joxoo,analyze_design,capture_view,dedicated,False,fusion_take_screenshot / fusion_screenshot_fusion,Background window capture; official viewport screenshot also available through MCP.,https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L552 +joxoo,analyze_design,capture_side,dedicated,False,fusion_take_screenshot / fusion_screenshot_fusion,Background window capture; official viewport screenshot also available through MCP.,https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L560 +joxoo,analyze_design,interference_check,dedicated,False,fusion_mechanical: interference,"Explicit root-context occurrences/body proxies; overlap volume and touching classification, no new interference bodies.",https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L572 +joxoo,analyze_design,validate,partial,True,fusion_mechanical: inspect / health,BRep solid status and feature/recompute health are covered; comparator mesh-body inventory/validation is not included.,https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L590 +joxoo,analyze_design,scene_map,partial,True,fusion_mechanical: inspect / inspect_entity,"Bodies, components, topology and guarded references are covered; comparator-specific aggregate fields and camera/appearance details differ.",https://github.com/joxoo/Fusion360MCP/blob/06cc8fc0417f740122c5103ec17a69623c227d92/modules/analysis_scripts.py#L596
Comments
Log in to comment.