# FreeCAD Robust MCP User Guide

This guide explains how to use AI assistants with FreeCAD via the MCP (Model Context Protocol) server to create and manipulate 3D CAD models.

---

## Table of Contents

1. [Getting Started](#getting-started)
1. [Running Modes](#running-modes)
1. [Basic Workflows](#basic-workflows)
1. [Object Creation Examples](#object-creation-examples)
1. [PartDesign Workflow](#partdesign-workflow)
1. [Complete Example: Mounting Bracket](#complete-example-mounting-bracket)
1. [Tips and Best Practices](#tips-and-best-practices)

---

## Getting Started

### Prerequisites

1. **FreeCAD installed** - Version 1.0.x or later
1. **An MCP client** (Claude Code, or other MCP-compatible AI assistant) configured
1. **Python 3.11** - Must match FreeCAD's bundled Python version

### Starting FreeCAD with MCP Bridge

You have two options depending on your workflow:

#### Headless Mode (Command-line only)

Best for automated workflows, batch processing, or when you don't need visual feedback.

```bash
just freecad::run-headless
```

**Capabilities:** All modeling operations, export, scripting.
**Limitations:** No screenshots, no visual feedback, no color/visibility control.

#### GUI Mode (Full graphical interface)

Best for interactive design work where you want to see results visually.

```bash
just freecad::run-gui
```

**Capabilities:** Everything headless mode can do, plus screenshots, colors, view control.

### Verifying Connection

Once FreeCAD is running with the MCP bridge, you can verify the connection:

```text
"Check the FreeCAD connection status"
```

Claude will use the `get_connection_status` tool to confirm the bridge is working.

---

## Running Modes

### Headless vs GUI Mode

| Feature                  | Headless Mode | GUI Mode |
| ------------------------ | ------------- | -------- |
| Object creation          | Yes           | Yes      |
| Boolean operations       | Yes           | Yes      |
| Export (STEP, STL, etc.) | Yes           | Yes      |
| Save documents           | Yes           | Yes      |
| Screenshots              | No            | Yes      |
| Object colors            | No            | Yes      |
| Object visibility        | No            | Yes      |
| Camera control           | No            | Yes      |
| Interactive selection    | No            | Yes      |

### Detecting the Current Mode

When working with Claude, it will automatically detect whether FreeCAD is in GUI or headless mode and adapt accordingly. GUI-only operations will return informative errors in headless mode rather than crashing.

---

## Basic Workflows

### Creating a Document

Every FreeCAD project needs a document. You can ask Claude:

```text
"Create a new FreeCAD document called 'MyProject'"
```

Claude will use the `create_document` tool.

### Creating Simple Shapes

Ask Claude to create primitive shapes:

```text
"Create a box that's 50mm long, 30mm wide, and 10mm tall"
"Add a cylinder with radius 5mm and height 20mm"
"Create a sphere with 15mm radius"
```

### Positioning Objects

Move and rotate objects:

```text
"Move the box to position (100, 50, 0)"
"Rotate the cylinder 45 degrees around the Z axis"
```

### Boolean Operations

Combine shapes:

```text
"Fuse the box and cylinder together"
"Cut a hole through the box using the cylinder"
"Find the intersection of the two shapes"
```

### Saving and Exporting

```text
"Save the document as MyProject.FCStd"
"Export the model to STEP format"
"Export for 3D printing as STL"
```

---

## Object Creation Examples

### Example 1: Simple Box with Hole

**Request:**

```text
Create a 50x50x20mm box with a 10mm diameter hole through the center.
```

**What Claude does:**

1. Creates a document
1. Creates a box (50x50x20)
1. Creates a cylinder (radius 5, height 30) positioned at center
1. Performs boolean cut operation
1. Returns the result

### Example 2: Pipe/Tube Shape

**Request:**

```text
Create a pipe with outer diameter 40mm, inner diameter 30mm, and length 100mm.
```

**What Claude does:**

1. Creates outer cylinder (radius 20, height 100)
1. Creates inner cylinder (radius 15, height 100)
1. Cuts inner from outer to create hollow tube

### Example 3: L-Bracket

**Request:**

```text
Create an L-shaped bracket:
- Horizontal part: 100mm x 50mm x 5mm
- Vertical part: 5mm x 50mm x 80mm standing on the horizontal part
```

**What Claude does:**

1. Creates horizontal box
1. Creates vertical box positioned at correct location
1. Fuses them together

---

## PartDesign Workflow

For parametric modeling that maintains design history, use the PartDesign workflow.

### Understanding PartDesign Concepts

**Body**: A container for a single solid model built from features.

**Sketch**: A 2D drawing that defines profiles for 3D operations.

**Features**: Operations like Pad (extrude), Pocket (cut), Fillet, etc.

### Basic PartDesign Example

**Request:**

```text
Create a parametric mounting plate:
1. Start with a PartDesign body
2. Create a sketch on the XY plane with a 100x60mm rectangle
3. Pad it 8mm thick
4. Add four 5mm holes near each corner for mounting screws
5. Fillet all edges with 2mm radius
```

**What Claude does:**

1. `create_partdesign_body()` - Creates the Body container
1. `create_sketch(body_name="Body", plane="XY_Plane")` - Creates attached sketch
1. `add_sketch_rectangle(...)` - Adds the profile geometry
1. `pad_sketch(sketch_name="Sketch", length=8)` - Extrudes to solid
1. Creates new sketches with points for hole locations
1. `create_hole(...)` for each mounting hole
1. `fillet_edges(...)` - Rounds the edges

### Revolving Profiles

**Request:**

```text
Create a turned part:
- Draw a profile on the XZ plane
- Revolve it 360 degrees around the X axis
```

**What Claude does:**

1. Creates body and sketch on XZ plane
1. Draws the profile using lines and arcs
1. Uses `revolution_sketch()` to create the solid

### Pattern Operations

**Request:**

```text
Create a plate with a row of 6 holes spaced 15mm apart.
```

**What Claude does:**

1. Creates the base plate
1. Creates one hole feature
1. Uses `linear_pattern()` to repeat the hole

---

## Complete Example: Mounting Bracket

This detailed example shows a complete workflow for creating a practical part.

### Design Requirements

Create a mounting bracket with:

- Base plate: 80mm x 60mm x 5mm
- Vertical support: 5mm thick, 50mm tall, 60mm wide
- Two mounting holes (6mm diameter) on the base
- One slot (10mm x 20mm) on the vertical support
- 3mm fillets on external corners

### Step-by-Step Workflow

#### Step 1: Ask Claude to create the bracket

```text
Create a mounting bracket with the following specifications:

Base plate:
- Size: 80mm x 60mm x 5mm
- Two 6mm diameter mounting holes, centered 15mm from each short edge

Vertical support:
- Attached to one end of the base
- 5mm thick, 60mm wide, 50mm tall
- One slot: 10mm wide x 20mm tall, centered

Finish:
- 3mm fillet on all outer edges
- Export as STEP file when done
```

#### Step 2: Claude's approach

Claude will break this down into manageable operations:

```python
# 1. Create document and PartDesign body
create_document(name="MountingBracket")
create_partdesign_body(name="Body")

# 2. Create base plate sketch and pad
create_sketch(body_name="Body", plane="XY_Plane", name="BaseSketch")
add_sketch_rectangle(sketch_name="BaseSketch", x=0, y=0, width=80, height=60)
pad_sketch(sketch_name="BaseSketch", length=5)

# 3. Add vertical support
create_sketch(body_name="Body", plane="XZ_Plane", name="SupportSketch")
# ... add geometry
pad_sketch(sketch_name="SupportSketch", length=60)

# 4. Add mounting holes
create_sketch(body_name="Body", plane="XY_Plane", name="HoleSketch")
add_sketch_point(sketch_name="HoleSketch", x=15, y=30)
add_sketch_point(sketch_name="HoleSketch", x=65, y=30)
create_hole(sketch_name="HoleSketch", diameter=6, hole_type="ThroughAll")

# 5. Add slot (as pocket)
create_sketch(body_name="Body", plane="Face...", name="SlotSketch")
add_sketch_rectangle(...)
pocket_sketch(sketch_name="SlotSketch", length=5, type="ThroughAll")

# 6. Add fillets
fillet_edges(object_name="...", radius=3)

# 7. Export
export_step(file_path="/path/to/bracket.step")
```

#### Step 3: View the result (GUI mode)

```text
Take a screenshot of the bracket from an isometric view
```

Claude will use `get_screenshot(view_angle="Isometric")` to capture and display the result.

---

## Tips and Best Practices

### 1. Be Specific with Dimensions

**Good:** "Create a box 50mm x 30mm x 10mm"

**Vague:** "Create a small box"

### 2. Specify Units

FreeCAD uses millimeters by default. Always include units to avoid confusion:

```text
"Create a cylinder with 25.4mm (1 inch) diameter"
```

### 3. Use Meaningful Names

```text
"Create a box named 'BasePlate' and a cylinder named 'MountingHole'"
```

This makes it easier to reference objects later.

### 4. Work Incrementally

For complex parts, build step by step:

1. Create the basic shape
1. Verify it looks correct
1. Add features one at a time
1. Check after each major operation

### 5. Save Frequently

```text
"Save the document"
```

FreeCAD can crash, and you don't want to lose work.

### 6. Use PartDesign for Parametric Parts

If you might need to modify dimensions later, use the PartDesign workflow with sketches rather than direct Part operations.

### 7. Export to Multiple Formats

For manufacturing or 3D printing:

```text
"Export as STEP for CNC machining and STL for 3D printing"
```

### 8. Use the execute_python Tool for Advanced Operations

For operations not covered by the standard tools, Claude can execute custom Python:

```text
"Calculate the volume and center of mass of the part"
```

Claude will use `execute_python()` to run the necessary FreeCAD Python commands.

### 9. Check GUI Mode for Visual Features

Before asking for screenshots or colors:

```text
"Is FreeCAD running in GUI mode?"
```

### 10. Use Patterns for Repetitive Features

Instead of creating many individual features:

```text
"Create one hole and pattern it in a 4x3 grid with 20mm spacing"
```

---

## Common Operations Quick Reference

| Task             | How to Ask                                              |
| ---------------- | ------------------------------------------------------- |
| Create box       | "Create a box 50x30x10mm"                               |
| Create cylinder  | "Create a cylinder with 10mm radius and 20mm height"    |
| Move object      | "Move MyBox to position (100, 50, 0)"                   |
| Rotate object    | "Rotate MyCylinder 45 degrees around Z axis"            |
| Boolean union    | "Fuse Box and Cylinder together"                        |
| Boolean subtract | "Cut Cylinder from Box"                                 |
| Create hole      | "Add a 6mm through hole at (25, 15)"                    |
| Fillet edges     | "Add 3mm fillet to all edges"                           |
| Chamfer edges    | "Add 2mm chamfer to selected edges"                     |
| Export STEP      | "Export to STEP format"                                 |
| Export STL       | "Export for 3D printing"                                |
| Save document    | "Save the document as MyPart.FCStd"                     |
| Screenshot       | "Take a screenshot from the front view" (GUI mode only) |
| Change color     | "Make the box red" (GUI mode only)                      |

---

## Troubleshooting

### "GUI not available" Error

You're running in headless mode and trying to use a GUI-only feature. Either:

- Switch to GUI mode: `just freecad::run-gui`
- Use an alternative approach (e.g., skip visual operations)

### Objects Not Appearing

Make sure to recompute the document:

```text
"Recompute the document"
```

### Boolean Operations Failing

Ensure:

1. Both objects have valid shapes
1. The objects actually intersect
1. Objects are in the same document

### Sketch Errors

Sketches need to be fully constrained for PartDesign operations. Ask Claude to:

```text
"Check if the sketch is fully constrained"
```

### Connection Issues

If the MCP bridge isn't responding:

1. Check FreeCAD is running with the bridge started
1. Verify ports 9875 (XML-RPC) and 9876 (socket) are available
1. Restart FreeCAD with `just freecad::run-gui` or `just freecad::run-headless`

---

## Next Steps

- See [MCP_TOOLS_REFERENCE.md](MCP_TOOLS_REFERENCE.md) for detailed API documentation
- Explore the FreeCAD wiki for advanced techniques
- Practice with simple parts before attempting complex assemblies
