← Commit history
BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.8.3\ No newline at end of file+1.8.4\ No newline at end of file
SKILL.md+2
@@ -277,6 +277,8 @@ also install the pkg itself; then the skills **auto-update** via the pkg mechani  - **Building component libraries (symbol + footprint + RENDERING 3D):** **`fusion-libraries`** (one part) and **`fusion-multipart-libraries`** (many parts in one `.lbr`, each with real 3D) — the latter's SOLVED recipe is `fusion_make_3d_package` (STEP → orient → f3d → upload → `wip_urn`, hand-written into the library, **no GUI dialogs**). Full tutorial: the **`fusion-multipart-libraries`** skill's `CREATING_BASIC_PARTS_LIBRARIES.md`. Operate Fusion safely with **`fusion-driving`** + **`fusion-cloud-save`**. - **`fusion-aps-search`** + **`fusion-aps-signin`** — APS fast-search reasoning + the AI-driven one-time setup (bundled in this repo's `skills/`).+- **`fusion-mcp-and-preferences`** — Autodesk's local Fusion MCP server (`127.0.0.1:27182`, proxied by the `fusion_mcp_*` verbs) + changing any Fusion preference. On macOS the enable toggle is a one-time manual step (the skill covers it); the client verbs are cross-platform.+- **`fusion-web-export`** — STEP/STL/OBJ out of a Fusion CLOUD design with no desktop app (APS Model Derivative or a pup-driven Fusion Team export) — the path on Linux/containers. - `adom-desktop-kicad` — sibling bridge for KiCad. - `adom-desktop-direct-api` — the direct API contract that callers route through. - **Canonical repo:** the wiki page `https://wiki.adom.inc/adom/adom-desktop-fusion-bridge` (+ GitHub backup `adom-inc/adom-desktop-fusion-bridge`). The old `adom-inc/adom-desktop/plugins/fusion360/` is a stale seed.
adom-bridge-fusion-manifest.json+5−5
@@ -1,10 +1,10 @@ {   "manifest_version": 1,   "name": "fusion360",-  "version": "1.8.3",-  "url": "https://wiki.adom.inc/download/adom/adom-desktop-fusion-bridge-macos/1.8.3/adom-bridge-fusion-macos-v1.8.3.zip",-  "sha256": "7db1f23a39857cfb0eff29395d2c856ab3b47fbe8fc484c1bbd3059bb13c145c",-  "size": 314351,+  "version": "1.8.4",+  "url": "https://wiki.adom.inc/download/adom/adom-desktop-fusion-bridge-macos/1.8.4/adom-bridge-fusion-macos-v1.8.4.zip",+  "sha256": "a4f097ffe756c4565d6b20390b9148ec87192bf3defb43438519d77ad021692e",+  "size": 440887,   "verbPrefixes": [     "fusion_"   ],@@ -14,5 +14,5 @@     "windows": "https://wiki.adom.inc/api/v1/pages/adom-desktop-fusion-bridge/files/adom-bridge-fusion-manifest.json",     "macos": "https://wiki.adom.inc/api/v1/pages/adom-desktop-fusion-bridge-macos/files/adom-bridge-fusion-manifest.json"   },-  "released_at": "2026-07-24T12:00:00Z"+  "released_at": "2026-07-24T18:00:00Z" }\ No newline at end of file
bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "fusion360",   "displayName": "Autodesk Fusion 360",-  "version": "1.8.3",+  "version": "1.8.4",   "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/adom-desktop-fusion-bridge-macos",   "author": "Adom Inc.",
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-desktop-fusion-bridge-macos",-  "version": "1.8.3",+  "version": "1.8.4",   "type": "app",   "description": "macOS build of the Adom Desktop Fusion 360 bridge. Same fusion_* verbs and skills as the canonical (Windows) bridge, with the window-automation layer natively ported to macOS (CGWindowList + screencapture + CGEvent + System Events). Installs the SKILLS into your container; Adom Desktop loads the runtime from the release zip.",   "dependencies": {
page.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-desktop-fusion-bridge-macos",-  "version": "1.8.3",+  "version": "1.8.4",   "type": "app",   "description": "macOS build of the Adom Desktop Fusion 360 bridge. Same fusion_* verbs and skills as the canonical (Windows) bridge, with the window-automation layer natively ported to macOS (CGWindowList + screencapture + CGEvent + System Events). Installs the SKILLS into your container; Adom Desktop loads the runtime from the release zip.",   "dependencies": {
skills/fusion-mcp-and-preferences/._SKILL.mdadded
⋯ 1 unchanged line ⋯
skills/fusion-mcp-and-preferences/SKILL.mdadded+128
@@ -0,0 +1,128 @@+---+name: fusion-mcp-and-preferences+description: >-+  Use Autodesk's Fusion MCP server (the Autodesk + Anthropic text-to-CAD connector) from an Adom+  cloud AI, and change ANY Fusion preference including ones the Python API does not expose. The MCP+  server binds loopback on the user's machine so a cloud container cannot reach it; the fusion+  bridge proxies it. Covers turning it on for the user (no API exists for the toggle, so the bridge+  drives the Preferences dialog), the MCP session handshake, the four Autodesk tools, and when to+  prefer a native fusion_* verb instead. Trigger words - fusion mcp, fusion mcp server, autodesk+  mcp, claude connector for fusion, text to cad, 127.0.0.1:27182, enable fusion mcp, fusion+  preferences, change a fusion setting, fusion prefs dialog, api preferences, developer tools+  fusion, fusion setting not in the api.+---++# Fusion MCP server + preferences++Two capabilities that turned out to be the same trick: Fusion exposes far less to its Python API+than to its UI, and the UI is drivable.++## The MCP server++Autodesk + Anthropic ship a **local** MCP server at `http://127.0.0.1:27182/mcp` exposing Fusion's+own text-to-CAD surface.++**It binds loopback on the user's machine.** An Adom AI runs in a cloud container and cannot reach+it. The fusion bridge runs on that machine, so it proxies:++```bash+adom-desktop fusion_mcp_status '{}'          # up? serverInfo + live tool list+adom-desktop fusion_mcp_enable '{}'          # turn it ON for the user+adom-desktop fusion_mcp_tools  '{}'          # tools WITH input schemas+adom-desktop fusion_mcp_call   '{"tool":"fusion_mcp_electronics_read",+                                 "arguments":{"entity_type":"electronics.Element"}}'+adom-desktop fusion_mcp_resources '{}'       # electronics entity schemas+```++### Do not ask the user to enable it++It is OFF by default and there is **no API for the toggle**. `fusion_mcp_enable` does it for them:+opens Preferences, expands General, selects API, ticks the box, Apply, OK, then verifies the port+is listening. Tell them it is handled. Only fall back to instructions if the verb reports failure.++### macOS (this build): the toggle is manual, everything after it is not++On macOS `fusion_mcp_enable` (and `fusion_prefs_open`/`fusion_prefs_close`) return an honest+manual hint instead of driving the dialog — Fusion's mac Preferences is a different, flat layout+(opened with **Cmd+,** or the avatar menu) and the Windows section coordinates don't apply. Walk+the user through it once: **Preferences → General → tick "Fusion MCP Server" → Apply → OK.**+Verify with `fusion_mcp_status`. Once the port is listening, every `fusion_mcp_*` client verb+(`_status`/`_tools`/`_call`/`_resources`) works unchanged — the proxy layer is pure loopback HTTP+and fully cross-platform. The Apply trap below applies on mac too.++### The trap that costs a debugging cycle++**The setting is discarded unless Apply is clicked.** Restart or kill Fusion with the dialog open+and it reverts, while the checkbox looked correct. If the port is closed but the user says they+enabled it, this is almost certainly why. Re-run `fusion_mcp_enable`.++### The handshake is handled++Streamable-HTTP: a bare POST returns `400 Missing MCP-Session-Id`. You must `initialize`, capture+the `MCP-Session-Id` **response header**, send `notifications/initialized`, then pass that header.+The bridge does this and re-establishes dropped sessions, so `fusion_mcp_call` just works.++### Autodesk's four tools++| tool | for |+|---|---|+| `fusion_mcp_read` | geometric properties / data from the active model |+| `fusion_mcp_update` | update the active model |+| `fusion_mcp_execute` | execute operations |+| `fusion_mcp_electronics_read` | Electronics design data by `entity_type` |++`entity_type` covers the EAGLE object model: `electronics.Board`, `.Element`, `.Contact`,+`.ContactRef`, `.Device`, `.DeviceSet`, `.Gate`, `.Bus`, `.Error` (ERC/DRC), `.Frame`, `.Grid`,+`.Attribute`. `fusion_mcp_resources` returns the schemas.++MCP acts on the **active document**. Open one first (`fusion_aps_open`).++### MCP vs native verbs++**Prefer a native `fusion_*` verb when one exists.** They are tested, they return hints that teach+the next step, they handle the awkward parts (kit-aware BOM counting, the 2-minute sign-in clock,+GLB optimization), and they work without a Fusion subscription or MCP enabled.++**Reach for MCP** for Autodesk's text-to-CAD surface and the structured Electronics object model,+which is richer for querying a board than anything hand-rolled.++Requirements: Fusion subscription, Fusion running, loopback only.++## Any preference, via the UI++The API exposes a thin slice (`generalPreferences`: theme/orbit/units; `apiPreferences`:+`debuggingPort`, `isDeveloperToolsEnabled`). Everything else is UI-only.++```bash+adom-desktop fusion_prefs_open  '{"section":"api"}'   # opens + navigates + screenshots+# look at the screenshot, then click what you see:+adom-desktop desktop_click '{"space":"image","shotId":"<from response>","x":690,"y":476,"hwnd":<hwnd>}'+adom-desktop fusion_prefs_close '{"save":true}'       # Apply + OK+```++Sections: `general`, `api`, `design`, `manufacture`, `electronics`, `render`, `drawing`,+`material`, `graphics`, `network`, `preview features`.++### Why it returns an image instead of control names++`Commands.Start PreferencesCommand` opens the dialog, and the **top-level** section tree IS in the+UIA tree. But the children under General (API, Design, Manufacture, Electronics, Render, Drawing,+Simulation) are rendered **lazily by Qt** and never appear there, even after `desktop_ui_expand`+reports success. So child navigation is an image-space click, which takes the foreground and is+announced with a caption.++### Rules++1. **Always** finish with `fusion_prefs_close {save:true}`. Nothing persists otherwise.+2. **Verify the effect**, do not trust the click. For MCP, probe the port. For a render setting,+   observe the change.+3. Prefer `fusion_set_preference` for anything in the API-exposed slice; it is background and does+   not touch the user's screen.+4. Never leave the dialog open. A modal Preferences window blocks other Fusion verbs.++## Full write-ups++On the canonical (Windows) page — the guides apply to the client verbs verbatim:++- https://wiki.adom.inc/adom/adom-desktop-fusion-bridge/fusion-mcp-server.md+- https://wiki.adom.inc/adom/adom-desktop-fusion-bridge/fusion-preferences.md (with screenshots of all three steps)
skills/fusion-web-export/._SKILL.mdadded
⋯ 1 unchanged line ⋯
skills/fusion-web-export/SKILL.mdadded+73
@@ -0,0 +1,73 @@+---+name: fusion-web-export+description: >-+  Get a STEP/STL/OBJ/IGES (and then GLB) out of a Fusion cloud design WITHOUT the Fusion desktop app or add-in - the way to do it on Linux/Ubuntu, where desktop Fusion has no build. Two paths, same Autodesk cloud translation underneath: the clean API path (APS Model Derivative via the bridge's existing aps_* OAuth, headless, no browser) and the works-today browser path (drive Fusion Team in pup, grab the emailed link). Use when the user says "export a fusion step on linux/ubuntu", "get a step from fusion without opening fusion", "fusion team web export", "export fusion cloud design headless", "fusion step to glb no desktop".+---++# Fusion Web Export (no desktop app)++Get CAD out of a Fusion **cloud** design without opening (or installing) desktop Fusion. This matters most on **Linux/Ubuntu**, where desktop Fusion has no build, so the `fusion_export_*` verbs (which drive the desktop `exportManager`) cannot run.++There are **two paths, and they hit the SAME Autodesk cloud translation underneath** - the Fusion Team "Export" button and the API both queue an **APS Model Derivative** job that writes the file to OSS and hands back a signed download link.++- **API path (preferred, headless)** - call APS Model Derivative directly with the OAuth this bridge already holds. No browser, no desktop, runs in the container. **Needs one small verb that does not exist yet (see below).**+- **Browser path (works TODAY)** - drive Fusion Team in `pup` and retrieve the emailed link. Fully working now; use it until the API verb lands.++## Path A - APS Model Derivative (the clean way; verb to build)++**Status: the plumbing is here, the trigger is not.** `aps.py` in this bridge already does the hard part: 3-legged **PKCE OAuth** with scopes `data:read data:write data:create` (Model Derivative needs `data:read data:write` - already covered), plus Data Management to resolve a design's **URN** (`aps_search` / `aps_projects` / `aps_hubs`). What is missing is a verb (call it `aps_export`) that fires the translation job and downloads the result. The recipe:++1. Resolve the design **URN** (base64 of the `dm.lineage`/version id) via `aps_search` / the Data Management item, then base64url-encode it.+2. `POST https://developer.api.autodesk.com/modelderivative/v2/designdata/job` with the bearer token and body `{"input":{"urn":"<b64urn>"},"output":{"formats":[{"type":"step"}]}}` (STEP is an officially supported Model Derivative output - there is a `JobPayloadFormatSTEP`; also stl/obj/iges/fbx/dwg).+3. Poll `GET .../designdata/<b64urn>/manifest` until the `step` derivative is `success`.+4. `GET .../designdata/<b64urn>/manifest/<derivativeUrn>` (or the returned signed OSS url) to download the `.step`.+5. Hand off to `step2glb convert` for a GLB (below).++This reuses `aps.py`'s `_valid_access_token()` + `_http()` helpers; it is roughly a `_aps_post` + a poll loop. When this verb exists it SUPERSEDES the browser path (faster, headless, no login-in-a-profile, no email round-trip). Until then, use Path B. See [[fusion-aps-search]] and [[fusion-aps-signin]] for the auth/data layer this builds on.++**Caveat to test:** confirm Model Derivative actually emits STEP for the specific design type. It is reliable for 3D mechanical designs; electronics/schematic designs have no 3D body to translate (same limitation as Path B - see the routing note).++## Path B - Browser via pup (works today)++### The routing decision that wastes time if you get it wrong+- **3D mechanical designs** (a solid/assembly) export the full list incl. **STEP, IGES, SAT, SMT, STL, OBJ, DWG, DXF, FBX, SketchUp, Inventor, Fusion Archive**.+- **Electronics/PCB designs are SCHEMATICS on the web - they export SCH/BRD only, NO STEP.** The 12-format dropdowns are present in the DOM but hidden templates; do not be fooled. STEP comes from the board's **3D** design (often a separate "3D Assets" design, or the board pushed to 3D).++### Prereqs+`adom-desktop ping` connected + the pup (`browser_*`) bridge, a persistent pup profile logged into Autodesk (one-time), email access to the account that gets the export link (use **`adom-google`** - portable in any container; the claude.ai Gmail MCP connector also works if attached but is not guaranteed), and `step2glb` for the GLB.++### Steps+1. **Open Fusion Team** in a logged-in pup session at `https://<hub>.autodesk360.com` (NOT `drive.autodesk.com` - it errors; NOT `fusion.online.autodesk.com` - that is the AppStream streamed editor, pure canvas, un-automatable).+   `adom-desktop browser_open_window '{"sessionId":"fusion-web","profile":"autodesk","url":"https://<hub>.autodesk360.com"}'`+   Folder rows respond to a plain JS `.click()` via `browser_eval`; opening a design's detail page needs a TRUSTED click (`browser_input_dispatch`).+2. **Screenshot loop that works** (pup `browser_screenshot` errors os-13 on some hosts): `desktop_screenshot_window {hwnd}` (hwnd from `desktop_list_windows`, title "Google Chrome for Testing") -> read `safePathHost` from the JSON -> `pull_file {filePaths:[safePathHost], saveTo}` -> Read the PNG. Screenshot after every click.+3. **Open the 3D design**, then click the top-right download-arrow toggle by **VIEWPORT coords** from `getBoundingClientRect` (NOT screen coords; a `.trigger` selector click fails "not clickable"):+   `browser_eval` to get the visible `.download-btn.js-export-dropdown .trigger` center -> `browser_input_dispatch {type:click, x, y}`. Screenshot to confirm the menu opened (if it only shows "SCH" you are on a schematic).+4. **Click STEP**: get the visible `.export-format` STEP item's viewport center and trusted-click it. An EXPORT dialog appears ("...will send you an email with a link"). Click **OK**.++### Retrieve the emailed link (portable: adom-google)+Autodesk emails `[email protected]`, subject **"Download file"**, to the signed-in user, with a signed direct link.+```bash+adom-google gmail search "from:autodesk.com newer_than:1h subject:(Download file)"+adom-google gmail get <MESSAGE_ID>+```+The body has a signed OSS link `https://cdn.us.oss.api.autodesk.com/oss/v2/signedresources/<uuid>?...filename*=...stp` (no auth, ~7-day expiry). `curl -sSL "<url>" -o /tmp/<Design>.stp` (sanity: starts with `ISO-10303-21;`).++## STEP -> GLB (both paths)+```bash+step2glb convert /tmp/<Design>.stp -o /tmp/<Design>.glb+```++## Gotchas+| Symptom | Fix |+|---|---|+| `drive.autodesk.com` "Something went wrong [1asss]" | Use the `*.autodesk360.com` Fusion Team hub. |+| Menu only shows SCH | Schematic/electronics design - STEP comes from a 3D design. |+| `browser_screenshot` -> `Permission denied (os error 13)` | Use `desktop_screenshot_window {hwnd}` + `pull_file`. |+| Coordinate click "ok" but nothing opens | Used SCREEN coords - use VIEWPORT coords from `getBoundingClientRect`. |+| No download in the browser | Correct - delivery is by EMAIL; retrieve via adom-google. |++## Related+- [[fusion-aps-search]] / [[fusion-aps-signin]] - the APS OAuth + Data Management layer Path A builds on (`aps.py`).+- `adom-desktop-fusion-bridge` `fusion_export_step` - the DESKTOP path (needs Fusion open); use when Fusion is installed and running.+- `step2glb` - STEP -> GLB.