Note: This repository is under heavy development. Expect daily commits and potential breaking changes.
This project provides a robust integration between AI assistants and FreeCAD CAD software using the Model Context Protocol (MCP). It allows external applications to interact with FreeCAD through a standardized interface, offering multiple connection methods and specialized tools.
For the most reliable setup, follow these steps:
-
Setup Environment (One-time): Run the setup script. This clones the repository to
~/.mcp-freecad
, creates a Python virtual environment, downloads the latest stable FreeCAD AppImage, extracts it, and configures the server to use it.curl -sSL https://raw.githubusercontent.com/jango-blockchained/mcp-freecad/main/scripts/bin/setup_freecad_env.sh | bash
Alternatively, clone the repo and run
./scripts/bin/setup_freecad_env.sh
manually. -
Run the MCP Server: Use the installer script (which now just ensures the venv is active and runs the server) or the global command if installed.
# Option A: Run via the installer script in the default location ~/.mcp-freecad/scripts/bin/mcp-freecad-installer.sh # Option B: Run the global command (if installed via install-global.sh) mcp-freecad
This starts the MCP server using the recommended launcher
method with the downloaded and extracted AppImage.
You can also run MCP-FreeCAD in a Docker container for easier deployment and isolation.
-
Start the container:
docker compose up
-
Build from scratch (if you've made changes):
docker compose build --no-cache docker compose up
The Docker container exposes the following ports:
- 8080: MCP server
- 12345: FreeCAD server
The Docker setup consists of:
Dockerfile
: Defines the container with Python 3.12, installs dependencies, and sets up the environmentdocker-compose.yml
: Configures the service, ports, volumes, and restart policies.dockerignore
: Excludes unnecessary files from the container
This approach is especially useful for CI/CD pipelines or when you need to isolate the MCP-FreeCAD environment from your system.
graph TD
subgraph "Client"
A["AI Assistant / MCP Client"]
end
subgraph "Server & Connection"
B["MCP Server (freecad_mcp_server.py)"]
C["FreeCAD Connection (freecad_connection.py)"]
C_Auto{"Auto-Select Method"}
end
subgraph "Connection Methods (Backends)"
D["Server Mode (freecad_server.py)"]
E["Bridge Mode (freecad_bridge.py)"]
F["Wrapper Mode (freecad_wrapper.py)"]
L["Launcher Mode (freecad_launcher.py)"]
M["Mock Mode"]
end
subgraph "FreeCAD Execution"
FS["Socket Server inside FreeCAD"]
FCLI["FreeCAD CLI"]
FSub["FreeCAD via Subprocess"]
FAppRun["FreeCAD via AppRun"]
G["FreeCAD Instance/Modules"]
end
%% Client to Server
A --> |MCP Request| B
%% Server uses Connection Layer
B --> |Requests Connection| C
%% Connection Logic
C --> C_Auto
C_Auto -- "Pref=Launcher or Auto" --> L
C_Auto -- "Pref=Wrapper or Auto Fail" --> F
C_Auto -- "Pref=Server or Auto Fail" --> D
C_Auto -- "Pref=Bridge or Auto Fail" --> E
C_Auto -- "Pref=Mock or Auto Fail" --> M
%% Backends to Execution
L --> |"Uses AppRun"| FAppRun
F --> |"Uses freecad_subprocess.py"| FSub
D --> |"Connects via Socket"| FS
E --> |"Calls CLI"| FCLI
%% Execution to FreeCAD
FAppRun --> G
FSub --> G
FS --> G
FCLI --> G
%% Style (Optional)
classDef client fill:#cde4ff,stroke:#333,stroke-width:1px;
classDef server fill:#ccffcc,stroke:#333,stroke-width:1px;
classDef backend fill:#fff0cc,stroke:#333,stroke-width:1px;
classDef execution fill:#ffcccc,stroke:#333,stroke-width:1px;
class A,B,C,C_Auto client;
class D,E,F,L,M backend;
class FS,FCLI,FSub,FAppRun,G execution;
This flowchart shows the main components and how different connection methods selected by freecad_connection.py
lead to various ways of executing commands within FreeCAD. The launcher
method, often used with extracted AppImages via AppRun
, is the recommended approach for reliability.
For more detailed flowcharts, see FLOWCHART.md.
- Description: The main server implementing the Model Context Protocol. It acts as the central hub for AI assistants or other clients to communicate with FreeCAD via MCP.
- Features:
- Handles standard MCP requests (
mcp/listTools
,mcp/executeTool
). - Utilizes
FreeCADConnection
to interact with FreeCAD using the configured method. - Exposes various toolsets (primitives, manipulation, export, etc.) based on configuration.
- Configurable via
config.json
.
- Handles standard MCP requests (
- Usage:
# Start the server (uses config.json by default) python src/mcp_freecad/server/freecad_mcp_server.py # Start with a specific config python src/mcp_freecad/server/freecad_mcp_server.py --config my_config.json
- Description: A unified Python interface encapsulating the logic for connecting to FreeCAD. Used internally by the MCP server and available for direct scripting.
- Features:
- Intelligently selects the best connection method based on configuration and availability.
- Methods:
- Launcher: (Recommended) Uses
freecad_launcher.py
andAppRun
. - Wrapper: Uses
freecad_wrapper.py
andfreecad_subprocess.py
. - Server: Connects to a running
freecad_server.py
via sockets. - Bridge: Uses the FreeCAD CLI via
freecad_bridge.py
. - Mock: Simulates FreeCAD for testing.
- Auto: Tries methods in recommended order (launcher > wrapper > server > bridge > mock).
- Launcher: (Recommended) Uses
- Usage (Direct Scripting Example):
from freecad_connection import FreeCADConnection # Auto-connect using settings potentially from config.json # (Ensure config.json is present or provide args) fc = FreeCADConnection(auto_connect=True) if fc.is_connected(): print(f"Connected via: {fc.get_connection_type()}") version_info = fc.get_version() print(f"FreeCAD Version: {version_info}") fc.create_document("TestDocFromScript") else: print("Failed to connect to FreeCAD.")
- Description: Handles launching the FreeCAD environment, typically using
AppRun
from an extracted AppImage. It executesfreecad_script.py
within the launched environment. - Features:
- Manages the subprocess execution of FreeCAD/AppRun.
- Passes commands and parameters to the internal FreeCAD script.
- Parses JSON results from the script's output.
- Usage: Primarily used internally by
FreeCADConnection
when thelauncher
method is selected (configured inconfig.json
). Not typically run directly by the user.
- Description: The
freecad_wrapper.py
startsfreecad_subprocess.py
in a separate Python process.freecad_subprocess.py
imports FreeCAD modules and communicates with the wrapper via stdio pipes. - Features:
- Isolates FreeCAD module imports into a dedicated process.
- Provides an alternative connection method if direct module imports are feasible but AppRun/launcher is problematic.
- Usage: Used internally by
FreeCADConnection
when thewrapper
method is selected (configured inconfig.json
). Requires a Python environment where the subprocess can successfullyimport FreeCAD
.
- Description: A standalone socket server designed to run inside a FreeCAD instance. Listens for connections from
FreeCADConnection
. - Features:
- Allows connection to a potentially persistent FreeCAD instance.
- Can interact with the GUI if run in
--connect
mode.
- Usage (Manual Start within FreeCAD):
Requires
# Inside FreeCAD Python Console: exec(open("/path/to/mcp-freecad/freecad_server.py").read())
connection_method: server
inconfig.json
for the MCP Server to connect. (Seedocs/FREECAD_SERVER_SETUP.md
)
- Description: Enables command-line interaction with the FreeCAD executable. Bypasses direct module import issues but can be slower.
- Features:
- Executes FreeCAD commands via subprocess calls to the
freecad
executable.
- Executes FreeCAD commands via subprocess calls to the
- Usage: Used internally by
FreeCADConnection
when thebridge
method is selected (configured inconfig.json
). Requiresfreecad
to be in the system PATH or thepath
correctly set in config.
- Description: A command-line utility for interacting directly with the
FreeCADConnection
interface (for testing/debugging connection methods, not the MCP server). - Features:
- Allows testing specific
FreeCADConnection
commands (e.g., creating primitives, getting version) from the terminal. - Uses
config.json
to determine connection settings.
- Allows testing specific
- Usage Examples:
# Test connection and get version python freecad_client.py version # Create a box using the configured connection method python freecad_client.py create-box --length 20 --width 10
The MCP-FreeCAD project is organized with the following directory structure:
mcp-freecad/
βββ assets/ # 3D model assets (STL, STEP files)
βββ backups/ # Backup files
βββ config.json # Main configuration file
βββ docs/ # Documentation files
β βββ FLOWCHART.md # Detailed flow diagrams
β βββ FREECAD_INTEGRATION.md # FreeCAD integration guide
β βββ FREECAD_SERVER_SETUP.md # Server setup instructions
β βββ OPTIMIZATION_FEATURES.md # Performance optimization guide
β βββ PYTHON_INTERPRETER_SETUP.md # Python interpreter configuration
βββ examples/ # Example scripts showing API usage
βββ freecad_bridge.py # Bridge for CLI interaction with FreeCAD
βββ freecad_client.py # Command-line client
βββ freecad_connection.py # Unified connection interface
βββ freecad_mcp.py # Entry point script
βββ freecad_mcp_server.py # MCP server implementation
βββ freecad_server.py # Socket-based server for FreeCAD
βββ scripts/ # Shell scripts for installation and execution
β βββ README.md # Scripts documentation
β βββ bin/ # Executable scripts
β β βββ install-global.sh # Global installation script
β β βββ mcp-freecad-installer.sh # Installer script
β β βββ mcp-freecad.sh # Simple wrapper script
β β βββ run-freecad-server.sh # Server runner script
β βββ start_freecad_with_server.sh # FreeCAD starter with server
β βββ start_server.py # Python script for server startup
βββ src/ # Source code
βββ tests/ # Test files
βββ tmp/ # Temporary files
For more details on scripts, see scripts/README.md.
This section provides more details on the different installation and setup options.
This involves two main scripts:
-
scripts/bin/setup_freecad_env.sh
: Prepares the environment.- Clones or updates the repository to
~/.mcp-freecad
. - Creates/updates a Python virtual environment (
.venv
) and installs requirements. - Runs
download_appimage.py
to fetch the latest stable FreeCAD Linux AppImage into~/.mcp-freecad
. - Runs
extract_appimage.py
which:- Extracts the downloaded AppImage to
~/.mcp-freecad/squashfs-root
. - Updates
~/.mcp-freecad/config.json
to useconnection_method: launcher
anduse_apprun: true
with correct absolute paths.
- Extracts the downloaded AppImage to
- How to run:
curl -sSL <URL>/setup_freecad_env.sh | bash
or./scripts/bin/setup_freecad_env.sh
- Clones or updates the repository to
-
scripts/bin/mcp-freecad-installer.sh
: Runs the server.- Note: Despite the name, this script no longer performs the full installation. It primarily ensures the repository is up-to-date, activates the virtual environment, and starts
freecad_mcp_server.py
. - It assumes the environment (AppImage download/extraction) has been prepared by
setup_freecad_env.sh
or manually. - How to run:
~/.mcp-freecad/scripts/bin/mcp-freecad-installer.sh
ormcp-freecad
(global command).
- Note: Despite the name, this script no longer performs the full installation. It primarily ensures the repository is up-to-date, activates the virtual environment, and starts
- Creates a symbolic link
mcp-freecad
in/usr/local/bin
pointing tomcp-freecad-installer.sh
in the repo. - Allows running
mcp-freecad
from anywhere. - Requires the environment to be set up first using
setup_freecad_env.sh
if you want to use the recommended launcher method.
# Navigate to the repository (e.g., ~/.mcp-freecad)
cd ~/.mcp-freecad
# Run the setup script first
./scripts/bin/setup_freecad_env.sh
# Then run the global installation script
sudo ./scripts/bin/install-global.sh # Needs sudo for /usr/local/bin
# Now you can run the server from anywhere
mcp-freecad
- Clone the repo.
- Create venv, install requirements.
- Manually download and extract AppImage: Run
python download_appimage.py
andpython extract_appimage.py /path/to/downloaded.AppImage
yourself. - Run the server:
python freecad_mcp_server.py
.
This is the primary way to interact with FreeCAD using AI assistants like Claude.
# Start the server using the default config.json
python src/mcp_freecad/server/freecad_mcp_server.py
# Start with a specific configuration file
python src/mcp_freecad/server/freecad_mcp_server.py --config /path/to/your/config.json
# Enable debug logging
python src/mcp_freecad/server/freecad_mcp_server.py --debug
The server will run and listen for connections from MCP clients.
Use any MCP-compatible client. Example using the reference mcp client
:
# Replace 'mcp client' with the actual client command if different
mcp client connect stdio --command "python src/mcp_freecad/server/freecad_mcp_server.py"
Or using uv
if you have a client script like the one in the MCP docs:
uv run path/to/your/mcp_client.py python src/mcp_freecad/server/freecad_mcp_server.py
You can also start FreeCAD with the integrated server using:
./scripts/start_freecad_with_server.sh
This will launch FreeCAD and automatically start the server inside it.
The config.json
file controls various aspects of the server. Here is an example reflecting the recommended launcher setup after running extract_appimage.py
:
{
"auth": { // Optional authentication settings
"api_key": "development",
"enabled": false
},
"server": { // MCP server settings
"host": "0.0.0.0",
"port": 8000,
"debug": true,
"workers": 1,
"name": "mcp-freecad",
"version": "0.3.1", // Example version
"mcp": {
"transport": "stdio", // Use stdio for Cursor/local clients
"protocol_version": "0.1.0"
// ... other MCP settings
}
},
"freecad": { // FreeCAD connection settings
// Paths are set automatically by extract_appimage.py for launcher mode
"path": "/home/user/mcp-freecad/squashfs-root/usr/bin/freecad", // Example path
"python_path": "/home/user/mcp-freecad/squashfs-root/usr/bin/python", // Example path
"module_path": "/home/user/mcp-freecad/squashfs-root/usr/lib/", // Example path
"host": "localhost", // Not used by launcher
"port": 12345, // Not used by launcher
"auto_connect": false, // Connection handled internally
"reconnect_on_failure": true,
"use_mock": false,
"connection_method": "launcher", // *** KEY: Use the launcher method ***
"script_path": "/home/user/mcp-freecad/freecad_script.py", // Script run inside FreeCAD
"launcher_path": "/home/user/mcp-freecad/freecad_launcher.py", // Script that starts AppRun
"use_apprun": true, // *** KEY: Tells launcher to use AppRun ***
"apprun_path": "/home/user/mcp-freecad/squashfs-root/AppRun" // Path to AppRun executable
},
"logging": { // Logging configuration
"level": "INFO",
"file": "mcp_freecad.log",
"max_size": 10485760,
"backup_count": 3
},
"tools": { // Optional: control which tool groups are enabled
"enable_smithery": true,
"enable_primitives": true,
"enable_model_manipulation": true,
"enable_export_import": true,
"enable_measurement": true,
"enable_code_generator": true
// ... other tool settings
}
// ... other sections like cache, recovery, cors, performance ...
}
Note: Replace example paths with your actual absolute paths.
See FREECAD_INTEGRATION.md for more details on integration options.
The MCP server exposes various tool groups. Here are all available tools:
freecad.create_document
: Create a new documentfreecad.export_stl
: Export the model or specific objects to STLfreecad.import_stl
: Import STL files into the current documentfreecad.save_document
: Save the current documentfreecad.load_document
: Load an existing document
model_manipulation.rotate
: Rotate objects around specified axesmodel_manipulation.translate
: Move objects in 3D spacemodel_manipulation.scale
: Scale objects uniformly or non-uniformlymodel_manipulation.mirror
: Mirror objects across specified planesmodel_manipulation.union
: Combine multiple objects using boolean unionmodel_manipulation.cut
: Cut objects using boolean differencemodel_manipulation.intersect
: Create intersection of multiple objects
measurement.distance
: Measure distance between two pointsmeasurement.angle
: Measure angle between three pointsmeasurement.area
: Calculate surface area of objectsmeasurement.volume
: Calculate volume of solid objectsmeasurement.mass
: Calculate mass of objects (requires material properties)
primitives.create_box
: Create a rectangular boxprimitives.create_cylinder
: Create a cylinderprimitives.create_sphere
: Create a sphereprimitives.create_cone
: Create a coneprimitives.create_torus
: Create a torusprimitives.create_polygon
: Create a regular polygonprimitives.create_ellipse
: Create an ellipse
export_import.export_step
: Export to STEP formatexport_import.import_step
: Import from STEP formatexport_import.export_iges
: Export to IGES formatexport_import.import_iges
: Import from IGES formatexport_import.export_dxf
: Export to DXF formatexport_import.import_dxf
: Import from DXF format
code_generator.generate_python
: Generate Python code for the current modelcode_generator.generate_openscad
: Generate OpenSCAD code for the current modelcode_generator.generate_gcode
: Generate G-code for CNC machiningcode_generator.generate_3d_print
: Generate optimized 3D printing settings
Here are conceptual examples of using the MCP server with an AI assistant:
User: Create a box 50mm long, 30mm wide, and 20mm high.
Assistant: Okay, I can create that box.
[Tool Call: primitives.create_box (arguments: {"length": 50.0, "width": 30.0, "height": 20.0})]
[Tool Result: {"object_name": "Box", "message": "Created box...", "success": true}]
User: Now export it as box.stl
Assistant: Sure, exporting the model to box.stl.
[Tool Call: export_import.export_stl (arguments: {"file_path": "box.stl", "object_names": ["Box"]})]
[Tool Result: {"file_path": "box.stl", "message": "Exported successfully...", "success": true}]
Assistant: I've exported the box model to `box.stl`.
- MCP Server Connection Issues:
- Ensure
python src/mcp_freecad/server/freecad_mcp_server.py
can run without immediate errors. Check terminal output. - Check firewall settings if relevant (unlikely for
stdio
). - Verify
config.json
is valid JSON.
- Ensure
- FreeCAD Connection Issues (Especially with
launcher
method):- Run
extract_appimage.py
: Ensure the AppImage was extracted correctly andconfig.json
was updated. - Check
config.json
Paths: Verify all absolute paths in thefreecad
section are correct for your system. - Check Permissions: Ensure
squashfs-root/AppRun
has execute permissions (chmod +x
). - Check Logs: Examine
mcp_freecad.log
(created in the project root if logging starts),freecad_server_stdout.log
, andfreecad_server_stderr.log
for errors fromfreecad_launcher.py
,AppRun
, or the FreeCAD process itself. - Environment Variables: If
AppRun
fails to find libraries, ensureLD_LIBRARY_PATH
andPYTHONPATH
are correctly set, potentially within.cursor/mcp.json
if using Cursor, or exported manually if testing in the terminal. Theextract_appimage.py
script aims to make this less necessary, but it can be a factor. - Headless Issues: Sometimes FreeCAD has issues running completely headless (
QT_QPA_PLATFORM=offscreen
). Check logs for GUI-related errors.
- Run
server
method: Ensurefreecad_server.py
is running inside an active FreeCAD instance, listening on the correct host/port configured inconfig.json
.bridge
method: Verify FreeCAD is installed system-wide and thefreecad
command works in your terminal. Check thefreecad_path
inconfig.json
.- Missing MCP SDK: Install via
pip install modelcontextprotocol
. - Python Path Issues: If FreeCAD modules aren't found when not using the recommended AppImage setup, refer to PYTHON_INTERPRETER_SETUP.md.
This project is licensed under the MIT License - see the LICENSE file for details.
The MCP server is designed for integration with tools like Cursor IDE.
-
Configure Cursor: Add the MCP server in Cursor's settings (Settings > Features > MCP Servers > Add New MCP Server). Configure it to run the Python script directly, setting the necessary environment variables and working directory. An example configuration in
.cursor/mcp.json
would look like this:{ "mcpServers": { "mcp-freecad": { "command": "python3", // Command to run python "args": [ "src/mcp_freecad/server/freecad_mcp_server.py" // Script to run ], "env": { // Environment variables needed for headless AppRun "QT_QPA_PLATFORM": "offscreen", "DISPLAY": "", "FREECAD_CONSOLE": "1", "PYTHONNOUSERSITE": "1", // These might be needed if AppRun doesn't set them automatically "LD_LIBRARY_PATH": "/path/to/mcp-freecad/squashfs-root/usr/lib:/path/to/mcp-freecad/squashfs-root/usr/Ext:...", "PYTHONPATH": "/path/to/mcp-freecad/squashfs-root/usr/lib/python3.11/site-packages:..." }, "cwd": "/path/to/mcp-freecad" // Set working directory to project root } // ... other servers like memory ... } }
Replace
/path/to/mcp-freecad
with the actual absolute path to your project. Ensure theLD_LIBRARY_PATH
andPYTHONPATH
match your AppImage structure if needed. -
Restart Cursor: Fully restart Cursor for the configuration changes to take effect.
-
Server Communication: The server uses
stdio
transport by default (configured inconfig.json
underserver.mcp.transport
), which is compatible with Cursor's communication protocol. Errors should be reported back to Cursor via MCP error responses.
- The
freecad_mcp_server.py
script loadsconfig.json
by default. Ensure this file contains the correct settings, especially thefreecad
section updated byextract_appimage.py
. - The environment variables set in
.cursor/mcp.json
are crucial for allowing thelauncher
method to work correctly within the environment Cursor provides.
- Launcher Connection (Recommended)
- Uses
AppRun
from an extracted AppImage. Most reliable. - Configured automatically by
extract_appimage.py
. - Configuration (
config.json
):
{ "freecad": { "connection_method": "launcher", "use_apprun": true, "apprun_path": "/path/to/squashfs-root/AppRun", ... } }
- Uses
- Wrapper Connection
- Runs FreeCAD logic in a separate Python subprocess. Good alternative if AppImage/AppRun causes issues.
- Configuration (
config.json
):
{ "freecad": { "connection_method": "wrapper", ... } }
- Socket Server Connection
- Requires running
freecad_server.py
inside FreeCAD. - Use when running FreeCAD as a persistent background server.
- Configuration (
config.json
):
{ "freecad": { "connection_method": "server", "host": "localhost", "port": 12345, ... } }
- Requires running
- CLI Bridge Connection
- Uses the
freecad
command-line tool. Can be slower/less reliable. - Configuration (
config.json
):
{ "freecad": { "connection_method": "bridge", "freecad_path": "/path/to/system/freecad", ... } }
- Uses the
- Mock Connection
- For testing without FreeCAD.
- Configuration (
config.json
):
{ "freecad": { "connection_method": "mock", "use_mock": true } }
- Auto Connection
- Automatically selects the best available method (launcher > wrapper > server > bridge > mock).
- Default if
connection_method
is missing or set to"auto"
.
-
Basic FreeCAD Operations
- Essential document management
- Use cases:
- Creating new documents
- Saving and loading projects
- Exporting to various formats
- Managing document structure
-
Model Manipulation
- Transforming and modifying objects
- Use cases:
- Rotating objects precisely
- Moving objects in 3D space
- Scaling models
- Creating mirrors and copies
- Boolean operations (union, cut, intersect)
-
Measurement Tools
- Analysis and verification
- Use cases:
- Distance measurements
- Angle calculations
- Surface area analysis
- Volume calculations
- Mass properties
-
Primitive Creation
- Basic shape generation
- Use cases:
- Creating boxes and cylinders
- Generating spheres
- Making cones and tori
- Creating regular polygons
- Drawing ellipses
-
Export/Import Operations
- File format conversion
- Use cases:
- STEP file export/import
- IGES format handling
- DXF file processing
- STL export for 3D printing
-
Code Generation
- Automated code creation
- Use cases:
- Python script generation
- OpenSCAD code export
- G-code generation for CNC
- 3D printer settings optimization
-
Cursor IDE Integration
- Development environment integration
- Use cases:
- Direct model manipulation from IDE
- Real-time feedback
- Debug logging
- Error tracking
-
AI Assistant Integration
- AI-powered design automation
- Use cases:
- Natural language model creation
- Automated design modifications
- Parameter optimization
- Design validation
-
Command Line Usage
- Scripting and automation
- Use cases:
- Batch processing
- Automated testing
- CI/CD integration
- Command-line tools
- Rapid Prototyping
# Create a new document
freecad.create_document("Prototype")
# Add basic shapes
primitives.create_box(length=100, width=50, height=20)
# Export for 3D printing
export_import.export_stl("prototype.stl")
- Automated Processing
# Import and modify multiple files
for file in files:
import_step(file)
model_manipulation.scale(1.5)
export_stl(f"{file}_scaled.stl")
- Server Configuration
{
"server": {
"name": "custom-server-name",
"version": "1.0.0",
"description": "Custom description"
}
}
- Tool Enablement
{
"tools": {
"enable_smithery": true,
"enable_primitives": true,
"enable_model_manipulation": true,
"enable_export_import": true,
"enable_measurement": true,
"enable_code_generator": true
}
}
- Debug Configuration
{
"cursor": {
"debug": true,
"log_level": "DEBUG",
"stdio_transport": true
}
}
- Connect AI assistants to FreeCAD through the MCP protocol
- Create and manipulate 3D models programmatically
- Support for primitive shapes (box, cylinder, sphere, cone)
- Boolean operations (union, intersection, cut)
- Object transformations (move, rotate)
- Export models to STL format
- Document and object management
- Python 3.8 or newer
- MCP SDK (
pip install modelcontextprotocol
) - Recommended: A FreeCAD AppImage (downloaded and extracted using
extract_appimage.py
) for the reliablelauncher
connection method. - Alternatively: A system installation of FreeCAD 0.20+ (for
bridge
orserver
methods, potentially less reliable).
- freecad.create_document - Create a new FreeCAD document
- freecad.list_documents - List all open documents
- freecad.list_objects - List all objects in a document
- freecad.create_box - Create a box primitive
- freecad.create_cylinder - Create a cylinder primitive
- freecad.create_sphere - Create a sphere primitive
- freecad.create_cone - Create a cone primitive
- freecad.boolean_union - Create a union of two objects (add)
- freecad.boolean_cut - Cut the second object from the first (subtract)
- freecad.boolean_intersection - Create the intersection of two objects (common volume)
- freecad.move_object - Move an object to a new position
- freecad.rotate_object - Rotate an object
- freecad.export_stl - Export the model to an STL file
The project includes both unit tests and end-to-end (E2E) tests to ensure quality and reliability.
To run the basic unit tests:
python test_mcp_tools.py
python test_mcp_client.py
End-to-end tests verify that the entire system works correctly from the client's perspective. They test real-world scenarios and interactions between different components.
To run all E2E tests:
# Run with mock FreeCAD (default, doesn't require actual FreeCAD installation)
./tests/e2e/run_tests.py
# Run with verbose output
./tests/e2e/run_tests.py --verbose
# Run with real FreeCAD connection (requires FreeCAD to be installed)
./tests/e2e/run_tests.py --real
# Run a specific test file
./tests/e2e/run_tests.py --single test_primitives.py
The E2E tests are organized by functionality:
test_primitives.py
- Tests for basic shape creation and manipulationtest_smithery.py
- Tests for blacksmithing tool operations
To add new E2E tests:
- Create a new test file in the
tests/e2e/
directory - Extend the appropriate base test class (
MCPClientTestBase
) - Add test methods that use the MCP client to interact with the tools
- Run your tests with the test runner
See existing test files for examples.
The project includes several documentation files for different aspects:
- PYTHON_INTERPRETER_SETUP.md - How to configure the Python interpreter
- FREECAD_SERVER_SETUP.md - Server setup guide
- FREECAD_INTEGRATION.md - FreeCAD integration methods
- FLOWCHART.md - Detailed flow diagrams
- OPTIMIZATION_FEATURES.md - Performance optimization guide
- scripts/README.md - Scripts documentation
For AI assistants, please refer to the AI_ASSISTANT_GUIDE.md for detailed usage instructions and examples.
Contributions are welcome! Please feel free to submit a Pull Request.
- FreeCAD development team for the amazing CAD software
- Anthropic and Claude for the Model Context Protocol (MCP) SDK