Skip to main content
Glama
fusion-reconstruct-mcp

fusion-reconstruct-mcp

by ab7646

fusion-reconstruct-mcp

An MCP server that lets an LLM turn an STL/3MF mesh (or a reference photo) into a parametric Fusion 360 model - rebuilt feature by feature (sketches, extrudes, fillets, patterns...), not imported as a dumb mesh body.

Why

Slicers (Bambu Studio, PrusaSlicer, ...) only understand STL/3MF: baked triangle meshes. Fusion 360 only understands parametric feature trees. Importing an STL into Fusion gives you a solid you can look at but can't meaningfully edit - no parametric dimensions, no editable sketches, nothing you can push a slider on. This project bridges that gap by letting an LLM look at the mesh, figure out what it's made of (plates, holes, bosses, ribs...), and rebuild it as real Fusion features - so you get a model you can actually resize, add holes to, or otherwise modify the way you would something you built by hand.

Related MCP server: Fusion 360 MCP

Scope (read this first)

This targets mechanical/functional parts - brackets, enclosures, mounts, plates with bolt holes, bosses - reconstructed from primitives (extrude, revolve, fillet, chamfer, pattern, mirror, boolean ops). It does not attempt free-form/organic surface reconstruction; that's a much harder, less reliable problem this project doesn't try to solve. See docs/RECONSTRUCTION_STRATEGY.md for the intended workflow.

How it works

flowchart LR
    LLM["LLM client"] -- MCP --> Server["MCP server<br/>(mesh analysis + Fusion bridge client)"]
    Server -- HTTP, localhost --> Addin["Fusion 360 add-in<br/>(runs inside Fusion)"]
    Addin --> Fusion[("Your live Fusion design")]

The MCP server exposes two families of tools:

  • mesh_summary, find_circular_holes, find_circular_faces, list_planar_facets, get_cross_section, render_orthographic_views, compare_meshes - pure mesh analysis (trimesh), no Fusion required. Used to understand the input file and to check the reconstruction's accuracy against it afterwards.

  • fusion_* (create sketch, add line/circle/rectangle/arc, extrude, revolve, fillet, chamfer, pattern, mirror, combine, set/list parameters, export, screenshot, ...) - talk to a companion Fusion 360 add-in over http://127.0.0.1:6172, which executes them against the real adsk.fusion API inside a running Fusion session.

See docs/ARCHITECTURE.md for why it's split this way (short version: Fusion's API only runs inside Fusion's own process, on its main thread, with no pip access - so the add-in has to be a small stdlib-only HTTP bridge).

Setup

See docs/SETUP.md for full instructions. Short version:

git clone https://github.com/<your-username>/fusion-reconstruct-mcp.git
cd fusion-reconstruct-mcp
python -m venv .venv && source .venv/bin/activate  # .venv\Scripts\activate on Windows
pip install -r requirements.txt

Then copy fusion_addin/FusionReconstructBridge/ into Fusion's AddIns folder and start it from Utilities > Add-Ins > Scripts and Add-Ins, and point your MCP client (claude mcp add ... or your mcp.json) at python -m server.mcp_server in this repo.

Usage

With Fusion running and the add-in started, ask your LLM client something like:

Reconstruct ~/Downloads/bracket.stl as a parametric Fusion 360 model, then export it and check how close it is to the original.

It will inspect the mesh, look at rendered views, locate holes/bosses, rebuild the part feature by feature in Fusion, and validate the result by exporting and diffing against the source mesh. For a photo instead of a mesh, it builds a first pass from your description/the image and refines it interactively with you - there's no ground-truth dimension data in a single photo, so treat that path as "assisted modeling," not "scan-to-CAD."

Status / limitations

  • Circle/hole detection is a mesh-tessellation heuristic (facet outline circle-fitting)

    • it works well on typical printable parts but isn't a general feature-recognition engine.

    • Photo-based reconstruction estimates proportions; it does not measure real-world dimensions from a single image.

  • render_orthographic_views uses a plain matplotlib wireframe/solid renderer (no GPU dependency) - good enough to see overall shape, not photorealistic, and can show minor z-ordering artifacts on complex parts.

  • One Fusion document/bridge connection at a time.

  • fusion_create_sketch's named-base-plane path (plane="XY"/"XZ"/"YZ", optionally offset_mm) is thoroughly live-verified. Its arbitrary-plane path (origin+normal) had a real bug fixed (setByThreePoints needs point entities, not raw Point3D - see git history) but was never confirmed working afterward: a second, different error ("Environment is not supported" from ConstructionPoints.add) appeared on the next attempt and went away after restarting the add-in, which looks like transient Fusion state rather than a code bug, but that path was worked around rather than re-tested. Treat it as unverified until someone confirms it live.

  • Built and smoke-tested against mcp>=2.0.0's MCPServer API. The Fusion-side actions have all been exercised against a real, running Fusion 360 session (not just written against the docs) - see tests/smoke_test_fusion_live.py (sketch → extrude → cut/join → export, verified against the original mesh to within 0.01mm) and tests/smoke_test_fusion_live_features.py (fillet, chamfer, mirror, circular pattern, revolve, explicit combine). sketch_add_line, sketch_add_arc_three_point and pattern_rectangular share code paths with tested siblings but don't have their own dedicated live test yet. None of this runs in CI (there's no headless Fusion) - issues/PRs against fusion_addin/ very welcome regardless.

License

MIT - see LICENSE.

Available Tools

34 tools
check_solidA

For each (x, y, z) point (mm), report whether it's inside the solid or outside it (mesh.contains, ray-casting based).

get_cross_section only ever traces the outer boundary at a given slice

  • it will not notice a fully-enclosed internal cavity that doesn't touch that boundary, and can misreport a shape as constant-cross-section when it actually has a void or a step hidden inside. Before assuming a region is solid (e.g. before extruding a wedge/loft to fill it), spot-check a few points inside that assumed volume with this function. Cross-checking with a second point just off any axis-aligned coordinate is a good idea: a ray fired exactly through a mesh edge/vertex can mis-count and give a wrong answer for that exact point.

Inputs: points (required), file_path (required). Returns: result

compare_meshesA

Compare a reconstructed model (exported from Fusion as STL) against the original mesh: volume/bounding-box deltas plus an approximate two-sided surface distance (mean and max, in mm) computed by sampling points on one surface and measuring distance to the nearest point on the other.

Inputs: original_path (required), candidate_path (required), sample_count.

find_circular_facesA

Detect facets whose entire boundary is itself a circle - typically the flat top of a cylindrical boss/pad, or the flat bottom of a blind hole.

See find_circular_holes' docstring for why min_loop_points and min_area matter (false positives from cyclic quads; timeouts from tracing every facet's boundary on a mesh with tens of thousands of them).

Inputs: file_path (required), min_area, min_radius, min_loop_points, +1 more. Returns: result

find_circular_holesA

Detect circular through-holes / blind-hole rims sitting inside a flat facet (e.g. a bolt hole in a plate). Each result is one inner boundary loop of a facet that fits a circle well.

min_loop_points guards against a false positive that is easy to fall into: any rectangle's 4 corners lie exactly on a circle (a rectangle is a cyclic quadrilateral), so a plain 4-sided quad facet can look like a perfect circle fit. Real circular boundaries coming from a tessellated mesh have one segment per tessellation facet (a few dozen, typically), so requiring at least min_loop_points boundary vertices filters out straight-edged quads/triangles while keeping genuine circles.

min_area skips facets too small to contain a min_radius-sized hole before tracing their boundary (the expensive step) - default is 4pimin_radius**2, i.e. a facet at least ~4x the hole's own area. Without this, a mesh with tens of thousands of small tessellation facets (common on any curved/filleted surface) makes this call slow enough to time out an MCP client, since every facet's boundary gets traced regardless of whether it could possibly contain a hole.

Inputs: file_path (required), min_area, min_radius, min_loop_points, +1 more. Returns: result

fusion_add_chamferC

Chamfer edges. Same edge_selector format as fusion_add_fillet.

Inputs: body_id (required), distance_mm (required), edge_selector (required).

fusion_add_filletA

Round edges with a fillet.

edge_selector: {"kind": "all_edges"} for every edge of the body, or {"kind": "near_points", "points": [[x,y,z], ...], "max_distance_mm": 1.0} to select edges whose midpoint lies within max_distance_mm of any given point (get candidate points from mesh_tools.find_circular_holes/faces or fusion_get_body_info).

Inputs: body_id (required), radius_mm (required), edge_selector (required).

fusion_combineC

Boolean-combine bodies: operation "join" | "cut" | "intersect".

Inputs: tool_body_ids (required), target_body_id (required), operation, keep_tools.

fusion_create_sketchA

Create a sketch on a plane.

Either pass plane ("XY", "XZ" or "YZ", optionally with offset_mm along its normal) to sketch on/parallel to a base plane, or pass an explicit origin + normal (both length-3 lists, mm) for an arbitrary plane - typically taken straight from mesh_tools.get_cross_section()'s "origin" and "normal" fields so the sketch lines up exactly with a mesh cross-section.

Inputs: name, plane, normal, origin, +1 more.

fusion_export_stlA

Export one body to an STL file, e.g. so mesh_tools.compare_meshes() can check the reconstruction against the original.

Inputs: body_id (required), file_path (required).

fusion_extrudeB

Extrude a sketch profile.

operation: "new_body" | "join" | "cut" | "intersect". "join"/"cut"/ "intersect" combine into target_body_id (required for those three).

Inputs: sketch_id (required), distance_mm (required), profile_index (required), operation, +3 more.

fusion_fit_viewA

Zoom/fit the Fusion viewport to the visible geometry (call before fusion_screenshot for a useful picture).

Inputs: no named parameters.

fusion_get_body_infoA

Detailed geometry of one body: every face (type, area) and every edge (type, length, midpoint) - use the edge midpoints to build an edge_selector for fusion_add_fillet/fusion_add_chamfer.

Inputs: body_id (required).

fusion_get_timelineA

List the feature timeline (creation order, name, type, suppressed state) - Fusion's own record of every feature created so far.

Inputs: no named parameters.

fusion_list_bodiesA

List all solid bodies in the design with their id, name, volume and bounding box - use this to get a body_id for combine/fillet/export.

Inputs: no named parameters.

fusion_list_parametersA

List all user parameters currently defined in the design.

Inputs: no named parameters.

fusion_list_sketch_profilesA

List the closed regions (profiles) Fusion has found in a sketch, with their index, area and centroid - use this to pick the right profile_index for extrude()/revolve() when a sketch has more than one closed region.

Inputs: sketch_id (required).

fusion_loftA

Loft through 2+ sketch profiles to build a shape that tapers/morphs between cross-sections, e.g. a wedge or a rounded-to-square transition - use this instead of extrude when the profile isn't constant along its length. Each entry in profiles is {"sketch_id": ..., "profile_index": ...}, given in loft order (they don't need to be parallel planes).

Inputs: profiles (required), operation, target_body_id.

fusion_mirrorA

Mirror the body/feature produced by feature_id across a base plane ("XY", "XZ" or "YZ"), optionally offset along that plane's normal by offset_mm - use this for a mirrored pair that isn't touching along the mirror line (e.g. two parts with a real gap between them).

Inputs: feature_id (required), plane, offset_mm.

fusion_new_documentB

Create a new, empty Fusion design document to reconstruct the part in.

Inputs: name.

fusion_pattern_circularB

Circular pattern of the body/feature produced by feature_id, around the given base-plane axis ("x", "y" or "z").

Inputs: feature_id (required), axis, quantity, total_angle_deg.

fusion_pattern_rectangularC

Rectangular pattern of the body/feature produced by feature_id, along the body's own X and Y directions.

Inputs: feature_id (required), quantity_x, quantity_y, spacing_x_mm, +1 more.

fusion_pingA

Check whether Fusion 360 is running with the bridge add-in started.

Inputs: no named parameters.

fusion_revolveB

Revolve a sketch profile around an axis line given by two 2D points in the sketch's own coordinate system (mm).

Inputs: axis_end (required), sketch_id (required), axis_start (required), profile_index (required), +3 more.

fusion_screenshotA

Save a screenshot of the current Fusion viewport to file_path (PNG).

Inputs: file_path (required).

fusion_set_parameterA

Create (or update) a Fusion user parameter, e.g. name="wall_thickness", expression="3 mm". Reference it in later calls' numeric fields is not supported over this bridge (those stay plain numbers) - this is for keeping the design's parameter table meaningful for a human opening it afterwards.

Inputs: name (required), expression (required).

fusion_shellA

Hollow out a solid body into a shell. Pass remove_face_indices (from fusion_get_body_info's face_index, matched by its normal/point_on_face_mm) to leave those faces open - e.g. remove the top face of a box to turn it into an open-top container. Omit for a fully closed hollow shell. direction: "inside" | "outside" | "both" - which way the wall thickness is measured from the original surface.

Inputs: body_id (required), thickness_mm (required), direction, remove_face_indices.

fusion_sketch_add_arc_three_pointB

Add a 3-point arc (start, end, point-on-arc) to a sketch, in mm.

Inputs: x1 (required), x2 (required), x3 (required), y1 (required), +3 more.

fusion_sketch_add_circleA

Add a circle to a sketch, center (cx, cy) and radius in mm.

Inputs: cx (required), cy (required), radius_mm (required), sketch_id (required).

fusion_sketch_add_lineA

Add a straight line segment to a sketch, in the sketch's own mm coordinates.

Inputs: x1 (required), x2 (required), y1 (required), y2 (required), +1 more.

fusion_sketch_add_rectangleC

Add a rectangle to a sketch defined by two opposite corners (mm).

Inputs: x1 (required), x2 (required), y1 (required), y2 (required), +1 more.

get_cross_sectionA

Slice the mesh with a plane and return the resulting 2D profile(s) - exactly what you need to know to draw the matching Fusion sketch on that plane. Each polygon has an outer loop and zero or more hole loops, given as 2D points in the plane's own (u, v) coordinate system (same plane_u_axis/plane_v_axis convention fusion_create_sketch's origin+normal uses, so these coordinates drop straight into sketch_add_line/etc.).

Raw tessellation gives a mesh's cross-section thousands of near-collinear points even for a simple flat-sided shape - simplify_tolerance_mm runs a Douglas-Peucker simplification (points contributing less than this distance to the outline are dropped) so the result is small enough to read and close enough to straight-line/arc-fittable for sketching. Set to 0 to get the raw, unsimplified outline instead.

Inputs: file_path (required), plane_normal (required), plane_origin (required), simplify_tolerance_mm.

list_planar_facetsA

List coplanar face groups (flat regions) large enough to matter, each with its normal, area and in-plane footprint size - useful for spotting the flat faces that become sketch planes (top/bottom/side walls, bosses, counterbore floors).

Inputs: file_path (required), min_area. Returns: result

mesh_summaryB

Overall size, volume and sanity-check info for an STL/3MF file.

Inputs: file_path (required).

render_orthographic_viewsA

Render front/top/right/isometric silhouette views to PNG files so a vision-capable LLM can look at the part's overall shape before deciding how to reconstruct it. Returns paths, not image bytes - open them with a file-reading / vision tool.

Inputs: file_path (required), out_dir.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 34 tools

    Disambiguation5/5

    Every tool targets a distinct resource or action: mesh analysis tools, Fusion document/sketch tools, and modeling operations are all clearly separated. Even similar operations like find_circular_holes vs find_circular_faces or fusion_screenshot vs render_orthographic_views are distinguished by precise names and detailed descriptions.

    Naming Consistency4/5

    Most tools follow a clear snake_case verb-oriented pattern, with fusion_ prefixed for CAD operations and imperative verbs like list_, find_, get_, and add_ for mesh and sketch operations. Minor deviations like mesh_summary, fusion_shell, fusion_mirror, and fusion_new_document are small inconsistencies in an otherwise predictable scheme.

    Tool Count3/5

    34 tools is a large surface, but the domain of mesh analysis plus Fusion 360 reconstruction genuinely requires many granular operations. The count feels heavy, especially with separate sketch primitive tools, yet each tool has a clear purpose and the breadth is understandable for the task.

    Completeness3/5

    The server covers the full reconstruction workflow from mesh inspection through sketching, solid modeling, and STL comparison. However, there is no tool for deleting/undoing features or bodies and no way to edit existing sketches, so agents can hit dead ends when a modeling step goes wrong.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI-powered parametric CAD design in Autodesk Fusion 360 through natural language commands. Supports multiple AI backends (Ollama, OpenAI, Gemini, Claude) with intelligent routing and safety validation for geometric operations.
      22
      MIT
    • -
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables AI-powered CAD automation in Autodesk Fusion 360 through natural language prompts. Features a modern web chat interface with multiple LLM backends for creating 3D models, sketches, and parametric designs.
      -
    • A
      license
      B
      quality
      C
      maintenance
      Connects AI coding agents to Autodesk Fusion 360 for CAD automation, enabling natural language control over sketching, 3D modeling, and CAM operations. It uses a Python-based bridge and a custom add-in to execute over 80 tools ranging from simple geometry creation to complex assembly and parameter management.
      80
      483 PyPI
      147
      MIT