fusion-reconstruct-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fusion-reconstruct-mcp Reconstruct ~/Downloads/bracket.stl into a parametric Fusion model"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
fusion-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 overhttp://127.0.0.1:6172, which executes them against the realadsk.fusionAPI 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.txtThen 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.stlas 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_viewsuses a plainmatplotlibwireframe/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", optionallyoffset_mm) is thoroughly live-verified. Its arbitrary-plane path (origin+normal) had a real bug fixed (setByThreePointsneeds point entities, not rawPoint3D- see git history) but was never confirmed working afterward: a second, different error ("Environment is not supported" fromConstructionPoints.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'sMCPServerAPI. The Fusion-side actions have all been exercised against a real, running Fusion 360 session (not just written against the docs) - seetests/smoke_test_fusion_live.py(sketch → extrude → cut/join → export, verified against the original mesh to within 0.01mm) andtests/smoke_test_fusion_live_features.py(fillet, chamfer, mirror, circular pattern, revolve, explicit combine).sketch_add_line,sketch_add_arc_three_pointandpattern_rectangularshare 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 againstfusion_addin/very welcome regardless.
License
MIT - see LICENSE.
Available Tools
34 toolscheck_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
Scored across 34 tools
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.
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.
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.
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
Related MCP Connectors
Parametric 3D CAD for AI agents: build print-ready parts, check them, export STL, 3MF or STEP.
CAD in ChatGPT and Claude: editable parts, STEP/STL/drawings, in-chat 3D, automatic checks.
Text-to-CAD: build exact STEP or 3MF/STL on the server, each stated requirement measured.
A browser 3D CAD for your AI: it scripts real-size models, uCAD builds them and returns pictures.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact programmatically with Autodesk Fusion 360 for creating parametric 3D models through simple API calls.18-
- AlicenseNot gradedqualityDmaintenanceEnables 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.22MIT
- -licenseNot gradedqualityNot gradedmaintenanceEnables 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.-
- AlicenseBqualityCmaintenanceConnects 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.80483 PyPI147MIT