FreeCAD MCP
This repository is a FreeCAD MCP that allows you to control FreeCAD from Claude Desktop.
Demo
Design a flange
Design a toy car
Design a part from 2D drawing
Input 2D drawing
Demo
This is the conversation history.
https://claude.ai/share/7b48fd60-68ba-46fb-bb21-2fbb17399b48
Setting up Claude Desktop
Pre-installation of the uvx is required.
And you need to edit Claude Desktop config file, claude_desktop_config.json.
For user.
{
"mcpServers": {
"freecad": {
"command": "uvx",
"args": [
"freecad-mcp"
]
}
}
}
If you want to save token, you can set only_text_feedback to true and use only text feedback.
{
"mcpServers": {
"freecad": {
"command": "uvx",
"args": [
"freecad-mcp",
"--only-text-feedback"
]
}
}
}
Screenshots can also be controlled per tool call instead of globally: every tool that returns a screenshot accepts an optional include_screenshot parameter (pass false to get text-only feedback, e.g. for analytical scripts or intermediate steps) and an optional view_name parameter to orient the screenshot ("Isometric" by default, or "Front", "Top", "Right", etc.). The --only-text-feedback flag always wins: when it is set, no screenshots are returned regardless of include_screenshot.
For developer.
First, you need clone this repository.
git clone https://github.com/neka-nat/freecad-mcp.git
{
"mcpServers": {
"freecad": {
"command": "uv",
"args": [
"--directory",
"/path/to/freecad-mcp/",
"run",
"freecad-mcp"
]
}
}
}
Remote Connections
By default the RPC server does not accept remote connections and listens on localhost. To control FreeCAD from another machine on your network:
1. Enable remote connections in FreeCAD
In the FreeCAD MCP toolbar:
-
Check Remote Connections — the RPC server will bind to 0.0.0.0 (all interfaces) on the next restart. For security reasons, it only accepts connections from the IP addresses or CIDR subnets specified in the Allowed IPs field. By default this is 127.0.0.1.
-
Click Configure Allowed IPs and enter a comma-separated list of IP addresses or CIDR subnets that are allowed to connect, e.g.:
192.168.1.100, 10.0.0.0/24
127.0.0.1 is always the default. Invalid entries are rejected with an error dialog. Restart the RPC server after changing these settings.
2. Point the MCP server at the remote host
Pass the --host flag with the IP address or hostname of the machine running FreeCAD:
{
"mcpServers": {
"freecad": {
"command": "uvx",
"args": [
"freecad-mcp",
"--host", "192.168.1.100"
]
}
}
}
The --host value is validated on startup — it must be a valid IPv4/IPv6 address or hostname.
Tools
create_document: Create a new document in FreeCAD.
create_object: Create a new object in FreeCAD.
edit_object: Edit an object in FreeCAD.
delete_object: Delete an object in FreeCAD.
execute_code: Execute arbitrary Python code in FreeCAD.
insert_part_from_library: Insert a part from the parts library.
get_view: Get a screenshot of the active view.
get_objects: Get all objects in a document.
get_object: Get an object in a document.
get_parts_list: Get the list of parts in the parts library.
get_rpc_status: Report RPC and GUI-dispatch health without using the FreeCAD GUI thread.
run_fem_analysis: Run the CalculiX solver on an existing Fem::FemAnalysis and return summary results (max von Mises stress, max displacement, node count, working directory). Auto-creates a SolverCcxTools if the analysis has none. See examples/cantilever_fem.py for an end-to-end usage example.
Tools that return a screenshot (create_object, edit_object, delete_object, execute_code, insert_part_from_library, get_objects, get_object, run_fem_analysis) accept optional include_screenshot (default true) and view_name (default "Isometric") parameters to suppress or reorient the returned image per call.
GUI dispatch timeouts
If a GUI-thread operation exceeds its timeout after it has started, the bridge
returns GUI_DISPATCH_STUCK and rejects later GUI operations immediately. Use
get_rpc_status from a separate RPC client to identify the operation that is
still running. The RPC server handles connections concurrently, so diagnostics
do not wait for another request to finish. Document queries (get_object,
get_objects, and list_documents) run on the GUI thread alongside modelling
operations and report an RPC fault if dispatch times out or is stuck. FreeCAD GUI
work cannot be force-cancelled safely; if the status does not return to
healthy after the operation finishes, restart FreeCAD.
execute_code and execute_code_async share a persistent script namespace with
FreeCAD/App and FreeCADGui/Gui aliases. Script variables survive between
calls without overwriting the RPC server's own functions. This prevents accidental
name collisions; code execution still has FreeCAD's full privileges.
After an execute_code exception on a FreeCAD development build, inspect any
new FeaturePython object before mutating or deleting it. In particular, do
not continue with an object whose required Proxy was never installed, as
touching that broken object can wedge FreeCAD's GUI thread.
Contributors
Made with contrib.rocks.