| name | fusion360-mcp |
| description | Fusion 360 MCP CAD operations guide for Claude Opus. Comprehensive reference for 3D modeling, assemblies, manufacturing design, and parametric CAD automation. Includes coordinate system rules, assembly positioning workflows, API patterns, and DFM guidelines. |
| version | 1.0.0 |
| model_target | any-claude-model |
| mcp_version | 7.0.0 |
Fusion 360 MCP Skill Guide for Claude Opus v4.6
Preamble: Your Role as CAD Assistant
You are assisting users with professional CAD modeling through the Fusion 360 MCP interface. This skill file provides comprehensive guidance for creating accurate, manufacturable, and well-organized 3D models. As Opus, you have the reasoning capacity to handle complex multi-component assemblies, optimize designs for manufacturing, and troubleshoot geometric issues.
Your Responsibilities:
- Create accurate 3D geometry matching user specifications
- Ensure designs are manufacturable for the intended process
- Verify all component positions and detect interference
- Provide clear explanations of design decisions
- Anticipate potential issues before they occur
MCP v7.0 Capabilities:
- Component positioning with
move_component and rotate_component
- Hollow part creation with
shell
- Selective edge treatment with enhanced
fillet/chamfer
- Manufacturing features:
draft, pattern_rectangular, pattern_circular, mirror
- Inspection tools:
get_body_info, measure
- Offset sketch planes via
create_sketch(offset=...)
Section 0: Session Initialization Protocol (CRITICAL)
0.1 Vision-First Verification
MANDATORY ON EVERY SESSION START:
Before executing ANY Fusion 360 MCP commands, Claude MUST:
- Use Vision to visually inspect the current Fusion 360 state
- Verify design continuity - the drawing may not have saved where you left off
- Check what actually exists before assuming prior work is intact
PROTOCOL:
1. Call State-Tool with use_vision=true
2. Visually analyze:
- Is the expected design file open?
- What bodies/features are visible?
- Does the timeline show expected operations?
- Are there any error indicators?
3. Call get_design_info() to confirm programmatically
4. Compare visual vs programmatic state
5. Only then proceed with operations
0.2 Why This Matters
Common State Mismatches:
- Fusion 360 may have crashed and recovered to earlier state
- User may have undone operations after Claude's session ended
- Auto-save may not have captured all changes
- Design may have been edited manually between sessions
The Cost of Skipping:
- Operations on non-existent bodies ? errors
- Wrong body indices ? corrupted geometry
- Wasted time debugging phantom issues
0.3 Session Start Checklist
? Vision check completed
? Design file name matches expected
? Body count matches expected
? Key features visually confirmed
? Timeline length reasonable for work done
? No error dialogs or warnings visible
? get_design_info() matches visual observation
Only proceed with CAD operations after ALL checks pass.
Section 1: Coordinate System Mastery
1.1 The Global Coordinate System (MEMORIZE THIS)
Fusion 360 MCP uses a right-handed coordinate system. From the FRONT VIEW (looking at the origin from positive Y):
+Z (Vertical/Up)
|
|
|
+------------ +X (Horizontal/Right)
/
/
/
+Y (Depth/Toward Viewer)
| Axis | Physical Meaning | Positive Direction | Sketch Plane Usage |
|---|
| X | Width | Right | Horizontal in XY and XZ |
| Y | Depth | Toward viewer | Vertical in YZ, Horizontal in XY |
| Z | Height | Up | Vertical in XZ and YZ |
1.2 Construction Plane Deep Dive
Understanding plane selection is CRITICAL for correct geometry:
XY Plane (Horizontal/Ground Plane)
+Y (depth)
|
|
+-------- +X (width)
Extrusion: +Z (up) or -Z (down)
Use For: Floor plans, base plates, horizontal surfaces, table tops, PCB layouts.
XZ Plane (Vertical/Front Wall)
+Z (height)
|
|
+-------- +X (width)
Extrusion: +Y (toward you) or -Y (away)
Use For: Vertical panels, wall-mounted items, facades, elevation views.
YZ Plane (Vertical/Side Wall)
+Z (height)
|
|
+-------- +Y (depth)
Extrusion: +X (right) or -X (left)
Use For: Side profiles, cross-sections, lateral features.
1.3 Sketch-to-World Coordinate Mapping (EMPIRICALLY VERIFIED)
CRITICAL: Z-AXIS NEGATION RULE
When Z is part of the sketch plane (XZ or YZ), the sketch coordinate that maps to World Z is NEGATED.
| Sketch On | Sketch X -> World | Sketch Y -> World | Extrusion -> World | Z Negated? |
|---|
| XY Plane | X (direct) | Y (direct) | +/-Z | N/A |
| XZ Plane | X (direct) | -Z (negated) | +/-Y | YES |
| YZ Plane | -Z (negated) | Y (direct) | +/-X | YES |
Practical Application:
- XY plane: x1,x2 -> World X; y1,y2 -> World Y (direct mapping)
- XZ plane: x1,x2 -> World X; y1,y2 -> -World Z (to get Z from A to B, use y1=-B, y2=-A)
- YZ plane: x1,x2 -> -World Z (to get Z from A to B, use x1=-B, x2=-A); y1,y2 -> World Y
Section 1.4: MCP Tool Limitations (CRITICAL)
1.4.1 Missing Boolean Operations
The Fusion 360 MCP currently DOES NOT SUPPORT boolean operations:
- No Cut operation: Cannot subtract one body from another
- No Join operation: Cannot merge bodies together
- No Intersect operation: Cannot create intersection of bodies
Impact: The extrude() function ALWAYS creates a NEW BODY. It cannot:
- Cut holes in existing bodies
- Add material to existing bodies
- Perform any combine operations
Workaround: User must manually perform Modify > Combine in Fusion 360 UI after Claude creates the tool body.
1.4.2 Workflow for Creating Cutouts
Since boolean cut is not available, use this workflow:
- Create the main body (e.g., phone case shell)
- Create tool bodies for each cutout (camera hole, button slots, port openings)
- Inform user which bodies need to be combined/cut
- User performs Modify > Combine manually:
- Target Body: Main body
- Tool Bodies: Cutout bodies
- Operation: Cut
- Keep Tools: No (usually)
1.4.3 Requested MCP Enhancements
The following functions are needed but not yet implemented:
| Function | Purpose | Parameters Needed |
|---|
combine() | Boolean operations | target_body, tool_body, operation (cut/join/intersect), keep_tools |
extrude_cut() | Extrude and subtract | Same as extrude, plus target_body |
extrude_join() | Extrude and add | Same as extrude, plus target_body |
See: MCP_ENHANCEMENT_REQUEST_Fusion360.md for full specification.
1.4.4 Face/Edge Index Instability
CRITICAL: Face and edge indices are NOT stable across operations.
After ANY geometry-modifying operation (fillet, chamfer, shell, extrude, etc.):
- Face indices WILL change
- Edge indices WILL change
- Previously queried indices are INVALID
Required Protocol:
- Perform geometry operation
- IMMEDIATELY call
get_body_info() to get NEW indices
- Identify faces/edges by GEOMETRY (centroid position, area, length), not by memorized index
- Use fresh indices for next operation
Example - Finding Top Face After Modifications:
1. Call get_body_info(body_index=0)
2. Look at faces array
3. Find face where centroid.z == bounding_box.max.z
4. Use THAT face index for shell or other operations
1.4 Origin Behavior and Offset Planes (NEW in v7.0)
Fundamental Rule: All sketches are created at the world origin by default.
NEW: Offset Planes: MCP v7.0 supports creating sketches on offset planes:
create_sketch(plane="XY", offset=5)
draw_rectangle(x1=-5, y1=-5, x2=5, y2=5)
finish_sketch()
extrude(distance=2)
This eliminates the need for complex sketch positioning workarounds!
1.5 Utility Operations (v8.2)
The MCP now includes utility operations for cleanup and iteration:
undo(count=1)
Undo recent operations in Fusion 360.
undo()
undo(count=5)
undo(count=20)
Returns: {"undone_count": 5, "requested_count": 5}
Use Cases:
- Revert failed operations
- Clean up after experimentation
- Reset to known good state
delete_body(body_index=None)
Delete a specific body by index.
delete_body()
delete_body(body_index=3)
Returns: {"deleted_body": "Body5", "deleted_index": 3, "remaining_bodies": 4}
Important: After deleting a body, remaining body indices shift down!
delete_sketch(sketch_index=None)
Delete a specific sketch by index.
delete_sketch()
delete_sketch(sketch_index=2)
Returns: {"deleted_sketch": "Sketch3", "deleted_index": 2, "remaining_sketches": 4}
Cleanup Workflow Example
get_design_info()
delete_body(body_index=5)
delete_body(body_index=4)
delete_body(body_index=3)
delete_body(body_index=2)
delete_body(body_index=1)
undo(count=5)
1.6 Join Protocol (CRITICAL - USER REQUESTED)
RULE: Joining should be the FINAL step. Always verify with user before combining bodies.
Why This Matters:
- Once joined, individual parts cannot be easily edited
- Errors caught before joining are easy to fix
- Errors caught after joining require undo/rebuild
Protocol:
- Create all parts as separate bodies
- Position and verify each part visually
- ASK USER to confirm before any join/combine operation
- Only after user approval: execute combine(operation="join")
Example Workflow:
get_design_info()
combine(operation="join", target_body=0, tool_bodies=[1,2,3])
Never auto-join - always pause for user verification first.
Section 2: Complete Tool Reference
2.1 Sketch Creation and Management
create_sketch(plane, offset=0) ✨ ENHANCED
Initiates a new sketch on the specified construction plane.
Parameters:
| Name | Type | Required | Default | Description |
|---|
plane | string | Yes | - | "XY", "XZ", or "YZ" |
offset | number | No | 0 | Offset distance from origin (cm) |
NEW: Offset Capability:
create_sketch(plane="XY", offset=0)
create_sketch(plane="XY", offset=5)
create_sketch(plane="XY", offset=-3)
create_sketch(plane="XY")
draw_rectangle(x1=-5, y1=-5, x2=5, y2=5)
finish_sketch()
extrude(distance=2)
create_component(name="Base")
create_sketch(plane="XY", offset=2)
draw_rectangle(x1=-4, y1=-4, x2=4, y2=4)
finish_sketch()
extrude(distance=3)
create_component(name="Top")
finish_sketch()
Exits sketch edit mode. Required before any 3D operations.
2.2 Sketch Geometry Tools
draw_rectangle(x1, y1, x2, y2)
Creates a rectangle using two corner points (all values in cm).
Centering Strategies:
width, height = 20, 10
draw_rectangle(x1=-width/2, y1=-height/2, x2=width/2, y2=height/2)
draw_rectangle(x1=0, y1=0, x2=width, y2=height)
draw_circle(center_x, center_y, radius)
Creates a circle (all values in cm).
draw_line(x1, y1, x2, y2)
Creates a straight line segment. Lines must form CLOSED loops for extrusion.
draw_arc(center_x, center_y, start_x, start_y, end_x, end_y)
Creates a circular arc. Start and end must be equidistant from center.
Arc Direction Control (CRITICAL)
The draw_arc function draws from start to end around the center point. The direction of travel determines which way the arc curves.
Arc Direction Rule:
- Arc travels counterclockwise from start to end (when viewed from +Z)
- Swapping start and end points reverses the curvature direction
Example - Stadium/Obround Shape (for ergonomic handles):
draw_arc(start_x=-0.7, start_y=0.2, end_x=-0.7, end_y=-0.8, center_x=-0.7, center_y=-0.3)
draw_arc(start_x=-0.7, start_y=-0.8, end_x=-0.7, end_y=0.2, center_x=-0.7, center_y=-0.3)
Visual Guide:
For a stadium shape (pill/obround):
___________
( ) <- Arc curves OUTWARD (correct)
| |
| |
(___________)
If arcs are inverted:
___________
) ( <- Arc curves INWARD (wrong!)
| |
Key Insight: If your closed shape looks "pinched" or the arcs go the wrong way, swap the start_x/start_y with end_x/end_y for each arc.
draw_polygon(center_x, center_y, radius, sides=6)
Creates a regular polygon (default: hexagon).
Parameters:
| Name | Type | Required | Default | Description |
|---|
center_x | number | Yes | - | Center X (cm) |
center_y | number | Yes | - | Center Y (cm) |
radius | number | Yes | - | Circumscribed radius (cm) |
sides | integer | No | 6 | Number of sides (≥3) |
2.3 Feature Creation Tools
extrude(distance, profile_index=0, taper_angle=0) ✨ ENHANCED
Extrudes the most recent sketch profile.
Parameters:
| Name | Type | Required | Default | Description |
|---|
distance | number | Yes | - | Extrusion distance (cm) |
profile_index | integer | No | 0 | Which profile to extrude |
taper_angle | number | No | 0 | Draft angle during extrusion (degrees) |
NEW: Taper During Extrusion:
create_sketch(plane="XY")
draw_rectangle(x1=-5, y1=-5, x2=5, y2=5)
finish_sketch()
extrude(distance=10, taper_angle=2)
revolve(angle)
Revolves profile around the sketch's Y-axis.
fillet(radius, edges=None, body_index=None) ✨ ENHANCED
Applies rounded fillets to edges.
Parameters:
| Name | Type | Required | Default | Description |
|---|
radius | number | Yes | - | Fillet radius (cm) |
edges | list | No | None | Edge indices (None = all edges) |
body_index | integer | No | Last | Which body to fillet |
NEW: Selective Edge Filleting:
get_body_info()
fillet(radius=0.2, edges=[0, 1, 5, 6])
fillet(radius=0.2)
chamfer(distance, edges=None, body_index=None) ✨ ENHANCED
Applies beveled chamfers to edges.
Parameters:
| Name | Type | Required | Default | Description |
|---|
distance | number | Yes | - | Chamfer distance (cm) |
edges | list | No | None | Edge indices (None = all edges) |
body_index | integer | No | Last | Which body to chamfer |
NEW: Selective Edge Chamfering:
chamfer(distance=0.1, edges=[8, 9, 10, 11])
2.4 NEW: Shell, Draft, Patterns, and Mirror
shell(thickness, faces_to_remove=None, body_index=None) â NEW
Creates a hollow shell from a solid body.
Parameters:
| Name | Type | Required | Default | Description |
|---|
thickness | number | Yes | - | Wall thickness (cm) |
faces_to_remove | list | No | None | Face indices to open |
body_index | integer | No | Last | Which body to shell |
Examples:
shell(thickness=0.2)
get_body_info()
shell(thickness=0.15, faces_to_remove=[0])
shell(thickness=0.2, faces_to_remove=[0, 2])
Use Cases:
- Enclosures and housings
- Containers and boxes
- Weight reduction
- Material savings
draft(angle, faces=None, body_index=None, pull_x=0, pull_y=0, pull_z=1) â NEW
Applies draft angles for injection molding.
Parameters:
| Name | Type | Required | Default | Description |
|---|
angle | number | Yes | - | Draft angle (degrees) |
faces | list | No | None | Face indices to draft |
body_index | integer | No | Last | Which body to draft |
pull_x/y/z | number | No | 0,0,1 | Pull direction vector |
Manufacturing Guideline: 1° per inch of depth minimum.
draft(angle=1.0)
get_body_info()
draft(angle=1.5, faces=[1, 2, 3, 4])
pattern_rectangular(x_count, x_spacing, y_count=1, y_spacing=0, body_index=None) â NEW
Creates a rectangular (linear) pattern.
Parameters:
| Name | Type | Required | Default | Description |
|---|
x_count | integer | Yes | - | Instances in X direction |
x_spacing | number | Yes | - | Spacing in X (cm) |
y_count | integer | No | 1 | Instances in Y direction |
y_spacing | number | No | 0 | Spacing in Y (cm) |
body_index | integer | No | Last | Which body to pattern |
Examples:
pattern_rectangular(x_count=5, x_spacing=2)
pattern_rectangular(x_count=4, x_spacing=2.5, y_count=3, y_spacing=2.5)
Use Cases:
- Mounting hole arrays
- Heat sink fins
- Ventilation slots
- Repeated features
pattern_circular(count, angle=360, axis="Z", body_index=None) â NEW
Creates a circular (radial) pattern.
Parameters:
| Name | Type | Required | Default | Description |
|---|
count | integer | Yes | - | Number of instances |
angle | number | No | 360 | Total angle (degrees) |
axis | string | No | "Z" | Rotation axis: "X", "Y", or "Z" |
body_index | integer | No | Last | Which body to pattern |
Examples:
pattern_circular(count=6)
pattern_circular(count=4, angle=180)
pattern_circular(count=8, axis="X")
Use Cases:
- Bolt circles
- Radial fins
- Spoke patterns
- Decorative features
mirror(plane="YZ", body_index=None) â NEW
Creates a mirrored copy of a body.
Parameters:
| Name | Type | Required | Default | Description |
|---|
plane | string | No | "YZ" | Mirror plane: "XY", "XZ", "YZ" |
body_index | integer | No | Last | Which body to mirror |
Plane Selection:
mirror(plane="YZ")
mirror(plane="XZ")
mirror(plane="XY")
2.5 Component and Assembly Tools
create_component(name=None)
Converts the most recent body into a named component.
list_components()
Returns all components with positions and bounding boxes.
delete_component(name=None, index=None)
Removes a component by name or index.
check_interference()
Detects bounding box collisions. MANDATORY after every component creation.
2.6 NEW: Component Positioning â CRITICAL
move_component(x=0, y=0, z=0, index=None, name=None, absolute=True) â NEW
Moves a component to a new position.
Parameters:
| Name | Type | Required | Default | Description |
|---|
x, y, z | number | No | 0 | Target position or offset (cm) |
index | integer | No | None | Component index |
name | string | No | None | Component name |
absolute | boolean | No | True | Absolute position vs. relative offset |
Examples:
move_component(x=0, y=10, z=5, index=1)
move_component(x=5, y=0, z=0, index=0, absolute=False)
move_component(x=0, y=0, z=10, name="Top_Cover")
Why This Matters:
Previously, all geometry started at origin causing overlaps. Now you can:
- Create geometry centered at origin (easiest to design)
- Convert to component
- Move to final position
create_sketch(plane="XY")
draw_rectangle(x1=-10, y1=-10, x2=10, y2=10)
finish_sketch()
extrude(distance=2)
create_component(name="Base")
create_sketch(plane="XY")
draw_rectangle(x1=-8, y1=-8, x2=8, y2=8)
finish_sketch()
extrude(distance=3)
create_component(name="Top")
move_component(z=2, name="Top")
list_components()
check_interference()
rotate_component(angle, axis="Z", index=None, name=None, origin_x=0, origin_y=0, origin_z=0) â NEW
Rotates a component around an axis.
Parameters:
| Name | Type | Required | Default | Description |
|---|
angle | number | Yes | - | Rotation angle (degrees) |
axis | string | No | "Z" | Rotation axis: "X", "Y", "Z" |
index | integer | No | None | Component index |
name | string | No | None | Component name |
origin_x/y/z | number | No | 0 | Rotation origin point (cm) |
Examples:
rotate_component(angle=45, axis="Z", index=1)
rotate_component(angle=90, axis="X", name="Arm", origin_z=5)
2.7 Joint System
create_revolute_joint(...)
Creates a hinge-type rotating joint.
Parameters:
| Name | Type | Default | Description |
|---|
component1_index | int | Auto | First component |
component2_index | int | Auto | Second component |
x, y, z | number | 0 | Joint origin (cm) |
axis_x, axis_y, axis_z | number | 0,0,1 | Rotation axis |
min_angle, max_angle | number | None | Limits (degrees) |
flip | boolean | False | Flip direction |
create_slider_joint(...)
Creates a linear sliding joint.
Parameters:
| Name | Type | Default | Description |
|---|
component1_index | int | Auto | First component |
component2_index | int | Auto | Second component |
x, y, z | number | 0 | Joint origin (cm) |
axis_x, axis_y, axis_z | number | 1,0,0 | Slide axis |
min_distance, max_distance | number | None | Limits (cm) |
set_joint_angle(angle, joint_index=None)
Animates a revolute joint.
set_joint_distance(distance, joint_index=None)
Animates a slider joint.
2.8 NEW: Inspection and Measurement
get_body_info(body_index=None) â NEW
Returns detailed information about edges and faces.
Parameters:
| Name | Type | Required | Default | Description |
|---|
body_index | integer | No | Last | Which body to inspect |
Returns:
{
"body_name": "Body1",
"edge_count": 12,
"face_count": 6,
"edges": [
{"index": 0, "length": 10.0, "start": {"x": -5, "y": -5, "z": 0}, "end": {"x": 5, "y": -5, "z": 0}},
{"index": 1, "length": 10.0, ...},
...
],
"faces": [
{"index": 0, "area": 100.0, "centroid": {"x": 0, "y": 0, "z": 2}},
{"index": 1, "area": 20.0, ...},
...
]
}
Use Cases:
- Find edge indices for selective fillet/chamfer
- Find face indices for shell openings or draft
- Understand geometry structure
measure(type="body", body_index=None, edge_index=None, face_index=None) â NEW
Measures dimensions of geometry.
Parameters:
| Name | Type | Required | Default | Description |
|---|
type | string | No | "body" | "body", "edge", or "face" |
body_index | integer | No | Last | Which body |
edge_index | integer | No | - | Edge to measure |
face_index | integer | No | - | Face to measure |
Returns by Type:
{
"volume": 150.0,
"surface_area": 220.0,
"bounding_box": {
"min": {"x": -5, "y": -5, "z": 0},
"max": {"x": 5, "y": 5, "z": 3},
"size": {"x": 10, "y": 10, "z": 3}
}
}
{"edge_index": 5, "length": 10.0}
{"face_index": 2, "area": 30.0}
2.9 View, Export, Import, and Batch
fit_view()
Adjusts camera to show all geometry.
get_design_info()
Returns design statistics.
export_stl(filepath) / export_step(filepath) / export_3mf(filepath)
Export to various formats.
import_mesh(filepath, unit="mm")
Import mesh files.
batch(commands)
Execute multiple commands in one call.
batch([
{"name": "create_sketch", "params": {"plane": "XY"}},
{"name": "draw_rectangle", "params": {"x1": -5, "y1": -5, "x2": 5, "y2": 5}},
{"name": "finish_sketch", "params": {}},
{"name": "extrude", "params": {"distance": 2}},
{"name": "shell", "params": {"thickness": 0.2, "faces_to_remove": [0]}},
{"name": "create_component", "params": {"name": "Container"}}
])
⚠️ CRITICAL: NEVER AUTO-JOIN BODIES
HARD RULE: Create bodies separately, get user verification, THEN join.
This is non-negotiable. Joining is destructive and cannot be easily undone.
The Protocol (MANDATORY)
create_sketch(...)
draw_polygon(...)
finish_sketch()
extrude(...)
get_design_info()
combine(operation="join", target_body=0, tool_bodies=[1])
Why This Matters
- Joined geometry cannot be easily separated
- Mistakes discovered after joining require manual undo
- User verification catches errors BEFORE they're permanent
Real-World Failure (2025-12-17)
Created rain guard → immediately joined without verification → geometry merged incorrectly creating embedded diamond shape instead of hexagon → required user to manually undo multiple operations.
Lesson: The 10 seconds saved by auto-joining cost 10 minutes of cleanup.
Section 3: Assembly Positioning Mastery
3.1 The New Workflow (v7.0)
With move_component, assembly positioning is dramatically simplified:
OLD Workflow (v6.0 and earlier):
create_sketch(plane="XY")
draw_rectangle(x1=15, y1=-5, x2=25, y2=5)
finish_sketch()
extrude(distance=2)
create_component(name="Part2")
NEW Workflow (v7.0):
create_sketch(plane="XY")
draw_rectangle(x1=-5, y1=-5, x2=5, y2=5)
finish_sketch()
extrude(distance=2)
create_component(name="Part2")
move_component(x=20, y=0, z=0, name="Part2")
3.2 Complete Assembly Example
Task: Create a box with lid
batch([
{"name": "create_sketch", "params": {"plane": "XY"}},
{"name": "draw_rectangle", "params": {"x1": -5, "y1": -5, "x2": 5, "y2": 5}},
{"name": "finish_sketch", "params": {}},
{"name": "extrude", "params": {"distance": 4}}
])
get_body_info()
shell(thickness=0.2, faces_to_remove=[0])
create_component(name="Box_Body")
batch([
{"name": "create_sketch", "params": {"plane": "XY"}},
{"name": "draw_rectangle", "params": {"x1": -5.2, "y1": -5.2, "x2": 5.2, "y2": 5.2}},
{"name": "finish_sketch", "params": {}},
{"name": "extrude", "params": {"distance": 0.5}}
])
create_component(name="Lid")
move_component(z=4, name="Lid")
create_revolute_joint(
component1_index=0,
component2_index=1,
x=-5.2, y=0, z=4,
axis_x=0, axis_y=1, axis_z=0,
min_angle=0, max_angle=120
)
list_components()
check_interference()
fit_view()
set_joint_angle(45)
3.3 Assembly Verification Protocol
MANDATORY after every component creation:
list_components()
check_interference()
measure(type="body")
fit_view()
Section 4: Manufacturing Design Guidelines
4.1 Design for 3D Printing (FDM)
| Feature | Minimum | Recommended |
|---|
| Wall thickness | 0.08cm | 0.12cm+ |
| Hole diameter | Design + 0.02cm | Design + 0.04cm |
| Overhang angle | 45° | 35° |
4.2 Design for SLA/Resin
| Feature | Minimum |
|---|
| Wall thickness | 0.06cm |
| Drain holes | 0.2-0.3cm diameter |
| Feature size | 0.03cm |
4.3 Design for CNC
| Feature | Guideline |
|---|
| Internal corners | Radius ≥ tool radius |
| Wall thickness | ≥ 0.08cm |
| Hole depth | ≤ 4Ã diameter |
4.4 Design for Injection Molding
| Feature | Specification |
|---|
| Wall thickness | 0.15-0.25cm |
| Draft angle | 1° per inch minimum |
| Rib thickness | 50-60% of wall |
| Internal fillet | ≥ 50% wall thickness |
Using Draft Tool:
draft(angle=1.0)
get_body_info()
draft(angle=1.5, faces=[1, 2, 3, 4])
Section 5: Quick Reference
5.1 Tool Summary Table
| Category | Tool | Key Parameters |
|---|
| Sketch | create_sketch | plane, offset |
| finish_sketch | - |
| draw_rectangle | x1, y1, x2, y2 |
| draw_circle | center_x, center_y, radius |
| draw_line | x1, y1, x2, y2 |
| draw_arc | center, start, end |
| draw_polygon | center, radius, sides |
| Features | extrude | distance, taper_angle |
| revolve | angle |
| fillet | radius, edges |
| chamfer | distance, edges |
| shell | thickness, faces_to_remove |
| draft | angle, faces |
| pattern_rectangular | x/y_count, x/y_spacing |
| pattern_circular | count, angle, axis |
| mirror | plane |
| Components | create_component | name |
| list_components | - |
| delete_component | name/index |
| check_interference | - |
| move_component | x, y, z, absolute |
| rotate_component | angle, axis |
| Joints | create_revolute_joint | position, axis, limits |
| create_slider_joint | position, axis, limits |
| set_joint_angle | angle |
| set_joint_distance | distance |
| Inspection | get_body_info | body_index |
| measure | type, indices |
| get_design_info | - |
| fit_view | - |
| Export | export_stl | filepath |
| export_step | filepath |
| export_3mf | filepath |
| Import | import_mesh | filepath, unit |
| Batch | batch | commands |
5.2 Unit Conversion
ALWAYS USE CENTIMETERS
mm → cm: ÷ 10 (5mm = 0.5cm)
inches → cm: Ã 2.54 (1" = 2.54cm)
m → cm: Ã 100 (0.1m = 10cm)
5.3 Plane Selection
Horizontal surface → XY (extrude ±Z)
Vertical front → XZ (extrude ±Y)
Side profile → YZ (extrude ±X)
5.4 Verification Commands
list_components()
check_interference()
get_body_info()
measure()
fit_view()
Document Metadata
skill_name: fusion360-mcp
version: 1.0.0
mcp_version: 7.0.0
target_model: claude-opus-4-5
last_updated: 2025-12
changes_from_v4.4:
- INTEGRATED CPI_Fusion360_UnitConfusion (VERIFIED)
- INTEGRATED CPI_Fusion360_ExtrusionDirection (VERIFIED)
- INTEGRATED CPI_Fusion360_ComponentPositioning (VERIFIED)
- INTEGRATED CPI_Fusion360_BladeBevels (VERIFIED)
- Added Section 6: VERIFIED Lessons Learned
- Added unit conversion red flags
- Added pre-extrusion checklist
- Added component positioning mental models
- Added blade bevel chamfer protocol
- Added edge identification for complex models
End of Fusion 360 MCP Skill Guide for Claude Opus v4.5
Section 6: VERIFIED Lessons Learned (CPI Integration)
The following hard constraints have been VERIFIED through documented failures and successful resolution. These are NOT suggestions - they are MANDATORY protocols.
6.1 Unit Confusion (CPI_Fusion360_UnitConfusion)
STATUS: VERIFIED ?
The Golden Rule: ALL Fusion 360 MCP dimensions are in CENTIMETERS.
| Real World | MCP Value | Example |
|---|
| 1mm | 0.1 | M3 screw = 0.3cm |
| 5mm | 0.5 | Small gap |
| 10mm | 1.0 | 1cm (easy) |
| 25mm | 2.5 | ~1 inch |
| 50mm | 5.0 | |
| 100mm | 10.0 | |
Common Component Sizes (in cm for MCP):
| Component | Real Size | MCP Values |
|---|
| Raspberry Pi 4 | 85x56mm | 8.5 x 5.6 |
| Pi Zero | 65x30mm | 6.5 x 3.0 |
| 18650 Battery | 65x18mm | 6.5 x 1.8 |
RED FLAGS - STOP AND VERIFY:
- Value > 50: Are you sure? That is 50cm = ~20 inches
- Value > 100: Very likely mm/cm confusion
- Value > 200: Almost certainly wrong
Quick Mental Math:
- mm to cm: Move decimal LEFT one place (165mm ? 16.5cm)
- cm to mm: Move decimal RIGHT one place (8.5cm ? 85mm)
6.2 Extrusion Direction (CPI_Fusion360_ExtrusionDirection)
STATUS: VERIFIED ?
Pre-Extrusion Checklist (MANDATORY):
- Identify target: Where should material END UP?
- Identify sketch plane: Where is the sketch located?
- Calculate direction: Does positive or negative get me there?
- Verify operation: This creates a NEW BODY (no join/cut in MCP)
Plane to Extrusion Direction Mapping:
| Sketch Plane | +Distance Goes | -Distance Goes |
|---|
| XY (offset=0) | +Z (up) | -Z (down) |
| XY (offset=5) | +Z (up from offset) | -Z (toward origin) |
| XZ | +Y (toward viewer) | -Y (away) |
| YZ | +X (right) | -X (left) |
Common Scenario - Creating a Lid on Top of a Case:
create_sketch(plane="XY", offset=3)
draw_rectangle(...)
finish_sketch()
extrude(distance=0.5)
6.3 Component Positioning (CPI_Fusion360_ComponentPositioning)
STATUS: VERIFIED ?
Stacking Mental Model:
"Stacking" means components OVERLAP in XY view (same X,Y, different Z):
Top View (looking down Z axis):
+-------------------+
| All components | Overlapping in XY
| at same X,Y |
| different Z |
+-------------------+
"Spreading" means components are ADJACENT (different X,Y, same Z):
Top View:
+-------+ +-------+ +-------+
| Comp1 | | Comp2 | | Comp3 | Different X,Y positions
+-------+ +-------+ +-------+
Pre-Positioning Checklist (MANDATORY):
- Query First:
list_components() to get positions and sizes
- Clarify Layout: Ask user "Stacked along which axis?" if unclear
- Plan Offsets: Calculate Z offsets based on component heights
- Verify After: Check new positions match intent
Stack Height Calculation:
move_component(name="Display", x=0, y=0, z=0)
move_component(name="Pi", x=0, y=0, z=display_height + 0.1)
move_component(name="Battery", x=0, y=0, z=display_height + pi_height + 0.2)
6.4 Blade Bevels with Chamfer (CPI_Fusion360_BladeBevels)
STATUS: VERIFIED ?
The Discovery: CHAMFER is the correct tool for blade bevels, NOT boolean cuts.
Why Chamfer Works:
- Direct edge selection - no positioning required
- Built-in to MCP as
chamfer(edges=[], distance=X)
- Clean, predictable results
Why Boolean Cuts Failed:
- MCP lacks native combine() with cut operation
- Positioning cutting bodies precisely is error-prone
- Coordinate confusion led to multiple failed attempts
Chamfer Distance Formula:
Sharp edge meeting at centerline: chamfer_distance = blade_thickness / 2
Partial bevel (leaves flat spine): chamfer_distance < blade_thickness / 2
Edge Identification Protocol (for models with 50+ edges):
get_body_info(body_index=0)
batch([
{"name": "measure", "params": {"type": "edge", "body_index": 0, "edge_index": 100}},
{"name": "measure", "params": {"type": "edge", "body_index": 0, "edge_index": 150}},
{"name": "measure", "params": {"type": "edge", "body_index": 0, "edge_index": 175}},
])
HARD CONSTRAINTS:
- Always use
get_body_info() first to understand edge structure
- Use
measure() to find edges beyond the 50-edge display limit
- Verify chamfer distance is appropriate for blade thickness
- Chamfer BOTH sides for symmetric blade
6.5 CPI Cross-Reference Index
| CPI Document | Key Lesson | Hard Constraint |
|---|
| UnitConfusion | ALL values in cm | Divide mm by 10 before API call |
| ExtrusionDirection | Know where material goes | Check plane?direction mapping |
| ComponentPositioning | Stack vs Spread | Query positions BEFORE moving |
| BladeBevels | Use chamfer for edges | Never use boolean cuts for bevels |
Save vs Export (Critical Distinction)
| Action | What It Does | Result |
|---|
| Save | Persists .f3d design to Fusion cloud | Design preserved in Fusion |
| Export | Creates copy in external format | STL/STEP file on disk |
⚠︠Export does NOT save the design. These are separate operations.
The current MCP does not have a save_design command. If a user asks to "save", you must:
- Inform them: "The MCP cannot save directly to Fusion 360's cloud storage"
- Request they manually save via File → Save or Ctrl+S
- Wait for confirmation before proceeding
- Then export if also requested