FreeCAD MCP Next
Provides an MCP interface to a running FreeCAD instance, enabling AI clients to create, manipulate, and interact with CAD models through the FreeCAD workbench.
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., "@FreeCAD MCP Next Create a 20mm cube in FreeCAD"
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.
FreeCAD MCP Next
Русский
FreeCAD MCP Next connects FreeCAD to MCP clients: Codex, GitHub Copilot Chat in Visual Studio Code, and other compatible assistants.
The project consists of two local processes:
A Workbench inside FreeCAD exposes XML-RPC on
127.0.0.1:9875.The
freecad-mcpcommand acts as an stdio MCP server for the AI client.
Quick start from source
Requirements: FreeCAD 1.0 or newer, Python 3.12+, Git, and
uv.
git clone https://github.com/Lumitorus/freecad-mcp-next.git
cd freecad-mcp-next
uv sync
uv run python scripts/install_addon.pyRestart FreeCAD, select the MCP Addon workbench, and click Start RPC Server. Then connect your MCP client:
codex mcp add freecad -- uv --directory "C:\path\to\freecad-mcp-next" run freecad-mcpFor Copilot, copy .vscode/mcp.example.json to
.vscode/mcp.json, replace the path, and run the MCP: List Servers command
in VS Code.
Full guide: docs/installation.ru.md.
Special thanks to
neka-nat/freecad-mcp for the
foundation of this project.
Related MCP server: FreeCAD Robust MCP Server
English
FreeCAD MCP Next connects FreeCAD to MCP clients such as Codex, GitHub Copilot Chat in Visual Studio Code, and other compatible assistants.
The project uses two local processes:
A FreeCAD workbench exposes XML-RPC on
127.0.0.1:9875.The
freecad-mcpcommand provides an stdio MCP server to the AI client.
Quick start from source
Requirements: FreeCAD 1.0 or newer, Python 3.12+, Git, and
uv.
git clone https://github.com/Lumitorus/freecad-mcp-next.git
cd freecad-mcp-next
uv sync
uv run python scripts/install_addon.pyRestart FreeCAD, select the MCP Addon workbench, and click Start RPC Server. Then connect your MCP client:
codex mcp add freecad -- uv --directory "C:\path\to\freecad-mcp-next" run freecad-mcpFor Copilot, copy .vscode/mcp.example.json to
.vscode/mcp.json, replace the path, and run MCP: List Servers in VS Code.
Full guide: docs/installation.en.md.
Special thanks to
neka-nat/freecad-mcp for providing
the foundation of this project.
Development and releases
Pull requests run linting, unit tests, package builds, and addon validation on Windows, macOS, and Linux. Release Please maintains a version/changelog PR from Conventional Commits. Merging that PR creates a draft release, verifies it on all three operating systems, attaches the artifacts, and publishes it:
a Python wheel and source distribution;
FreeCADMCP-<version>.zipfor manual FreeCAD installation;SHA-256 checksum files;
a GitHub Release containing all artifacts.
See CONTRIBUTING.md and docs/releasing.md.
Continue, Ollama, and terminal clients
Ollama provides the local language model; Continue acts as the MCP client and connects that model to FreeCAD tools. A ready-to-copy configuration is available at examples/config/continue-ollama.yaml.
Detailed Russian and English instructions:
License and acknowledgements
Maintained by Lumitorus and distributed under the MIT License.
Special thanks to
neka-nat/freecad-mcp for the
foundation of this project. See NOTICE.md.
Available Tools
14 toolscreate_documentB
Create a new document in FreeCAD.
Args:
name: The name of the document to create.
Returns:
A message indicating the success or failure of the document creation.
Examples:
If you want to create a document named "MyDocument", you can use the following data.
```json
{
"name": "MyDocument"
}
```
Inputs: name (required).
create_objectA
Create a new object in FreeCAD. Object type is starts with "Part::" or "Draft::" or "PartDesign::" or "Fem::".
Args:
doc_name: The name of the document to create the object in.
obj_type: The type of the object to create (e.g. 'Part::Box', 'Part::Cylinder', 'Draft::Circle', 'PartDesign::Body', etc.).
obj_name: The name of the object to create.
obj_properties: The properties of the object to create.
include_screenshot: Whether to return a screenshot of the model (default True).
Set to False to save tokens when visual feedback is not needed,
e.g. for intermediate steps in a longer sequence of changes.
view_name: The view orientation of the returned screenshot (default "Isometric").
Pick the view that best shows the change being made.
Returns:
A message indicating the success or failure of the object creation and a screenshot of the object.
Examples:
If you want to create a cylinder with a height of 30 and a radius of 10, you can use the following data.
```json
{
"doc_name": "MyCylinder",
"obj_name": "Cylinder",
"obj_type": "Part::Cylinder",
"obj_properties": {
"Height": 30,
"Radius": 10,
"Placement": {
"Base": {
"x": 10,
"y": 10,
"z": 0
},
"Rotation": {
"Axis": {
"x": 0,
"y": 0,
"z": 1
},
"Angle": 45
}
},
"ViewObject": {
"ShapeColor": [0.5, 0.5, 0.5, 1.0]
}
}
}
```
If you want to create a circle with a radius of 10, you can use the following data.
```json
{
"doc_name": "MyCircle",
"obj_name": "Circle",
"obj_type": "Draft::Circle",
}
```
If you want to create a FEM analysis, you can use the following data.
```json
{
"doc_name": "MyFEMAnalysis",
"obj_name": "FemAnalysis",
"obj_type": "Fem::AnalysisPython",
}
```
If you want to create a FEM constraint, you can use the following data.
```json
{
"doc_name": "MyFEMConstraint",
"obj_name": "FemConstraint",
"obj_type": "Fem::ConstraintFixed",
"analysis_name": "MyFEMAnalysis",
"obj_properties": {
"References": [
{
"object_name": "MyObject",
"face": "Face1"
}
]
}
}
```
If you want to create a FEM mechanical material, you can use the following data.
```json
{
"doc_name": "MyFEMAnalysis",
"obj_name": "FemMechanicalMaterial",
"obj_type": "Fem::MaterialCommon",
"analysis_name": "MyFEMAnalysis",
"obj_properties": {
"Material": {
"Name": "MyMaterial",
"Density": "7900 kg/m^3",
"YoungModulus": "210 GPa",
"PoissonRatio": 0.3
}
}
}
```
If you want to create a FEM mesh, you can use the following data.
The `Shape` property is required (legacy `Part` is also accepted).
On FreeCAD 1.x the size limits are `CharacteristicLengthMax/Min`;
the legacy `ElementSizeMax/Min` keys are also accepted.
```json
{
"doc_name": "MyFEMMesh",
"obj_name": "FemMesh",
"obj_type": "Fem::FemMeshGmsh",
"analysis_name": "MyFEMAnalysis",
"obj_properties": {
"Shape": "MyObject",
"CharacteristicLengthMax": 10,
"CharacteristicLengthMin": 0.1
}
}
```
Inputs: doc_name (required), obj_name (required), obj_type (required), view_name, +3 more.
delete_objectA
Delete an object in FreeCAD.
Args:
doc_name: The name of the document to delete the object from.
obj_name: The name of the object to delete.
include_screenshot: Whether to return a screenshot of the model (default True).
Set to False to save tokens when visual feedback is not needed,
e.g. for intermediate steps in a longer sequence of changes.
view_name: The view orientation of the returned screenshot (default "Isometric").
Pick the view that best shows the change being made.
Returns:
A message indicating the success or failure of the object deletion and a screenshot of the object.
Inputs: doc_name (required), obj_name (required), view_name, include_screenshot.
edit_objectA
Edit an object in FreeCAD.
This tool is used when the create_object tool cannot handle the object creation.
Args:
doc_name: The name of the document to edit the object in.
obj_name: The name of the object to edit.
obj_properties: The properties of the object to edit.
include_screenshot: Whether to return a screenshot of the model (default True).
Set to False to save tokens when visual feedback is not needed,
e.g. for intermediate steps in a longer sequence of changes.
view_name: The view orientation of the returned screenshot (default "Isometric").
Pick the view that best shows the change being made.
Returns:
A message indicating the success or failure of the object editing and a screenshot of the object.
Inputs: doc_name (required), obj_name (required), obj_properties (required), view_name, +1 more.
execute_codeA
Execute arbitrary Python code in FreeCAD.
Args:
code: The Python code to execute.
include_screenshot: Whether to return a screenshot of the model (default True).
Set to False to save tokens when the code does not change the model's
appearance, e.g. analytical or computational scripts whose result is
printed output, or intermediate steps in a longer sequence of changes.
view_name: The view orientation of the returned screenshot (default "Isometric").
Pick the view that best shows the change being made.
Returns:
A message indicating the success or failure of the code execution, the output of the code execution, and a screenshot of the object.
Inputs: code (required), view_name, include_screenshot.
execute_code_asyncA
Execute Python code in FreeCAD without waiting for completion.
Use this ONLY for long-running background computations that do NOT touch the
FreeCAD GUI or mutate the FreeCAD document tree directly.
This tool runs the submitted code in a background thread and returns
immediately. Because it does not run on FreeCAD's main GUI thread, the code
must NOT call FreeCADGui APIs, manipulate the active view or selection, create
or edit document objects, change object properties, call doc.recompute(), or
save documents.
For code that touches FreeCAD documents, document objects, FreeCADGui, the
active view, selection, recompute, or save operations, use execute_code instead.
execute_code runs on the FreeCAD GUI thread and is the safe default for normal
FreeCAD automation.
Use execute_code_async only for background-safe work such as long-running
pure OCCT geometry calculations (e.g. fuse/cut/loft on already-fetched shapes)
or other CPU-bound computations that do not interact with the document or GUI.
Typical usage pattern:
1. Fetch shapes into local variables first (via execute_code on the GUI thread).
2. Store intermediate results in a module-level Python variable (not in the
FreeCAD document) so execute_code can read them later.
3. Run the heavy computation via execute_code_async.
4. After the expected computation time has elapsed, apply results to the
document via execute_code (which runs on the GUI thread).
Args:
code: Background-safe Python code to execute.
Returns:
A message confirming that background execution has started.
Inputs: code (required).
get_objectA
Get an object from a document. You can use this tool to get the properties of an object to see what you can check or edit.
Args:
doc_name: The name of the document to get the object from.
obj_name: The name of the object to get.
include_screenshot: Whether to return a screenshot of the document (default True).
Set to False to save tokens when only the object data is needed.
view_name: The view orientation of the returned screenshot (default "Isometric").
Returns:
The object and a screenshot of the object.
Inputs: doc_name (required), obj_name (required), view_name, include_screenshot.
get_objectsB
Get all objects in a document. You can use this tool to get the objects in a document to see what you can check or edit.
Args:
doc_name: The name of the document to get the objects from.
include_screenshot: Whether to return a screenshot of the document (default True).
Set to False to save tokens when only the object data is needed.
view_name: The view orientation of the returned screenshot (default "Isometric").
Returns:
A list of objects in the document and a screenshot of the document.
Inputs: doc_name (required), view_name, include_screenshot.
get_parts_listA
Get the list of parts in the parts library addon.
Inputs: no named parameters.
get_viewB
Get a screenshot of the active view.
Args:
view_name: The name of the view to get the screenshot of.
The following views are available:
- "Isometric"
- "Front"
- "Top"
- "Right"
- "Back"
- "Left"
- "Bottom"
- "Dimetric"
- "Trimetric"
width: The width of the screenshot in pixels. If not specified, uses the viewport width.
height: The height of the screenshot in pixels. If not specified, uses the viewport height.
focus_object: The name of the object to focus on. If not specified, fits all objects in the view.
Returns:
A screenshot of the active view.
Inputs: view_name (required), width, height, focus_object.
insert_part_from_libraryA
Insert a part from the parts library addon.
Args:
relative_path: The relative path of the part to insert.
include_screenshot: Whether to return a screenshot of the model (default True).
Set to False to save tokens when visual feedback is not needed,
e.g. for intermediate steps in a longer sequence of changes.
view_name: The view orientation of the returned screenshot (default "Isometric").
Pick the view that best shows the change being made.
Returns:
A message indicating the success or failure of the part insertion and a screenshot of the object.
Inputs: relative_path (required), view_name, include_screenshot.
list_documentsA
Get the list of open documents in FreeCAD.
Returns:
A list of document names.
Inputs: no named parameters.
reload_documentA
Close and re-open a document to pick up external file changes.
Use this AFTER the document's .FCStd file has been modified by
something outside of FreeCAD's GUI process — for example, a
headless `freecadcmd` script that edited and saved the file. The
open GUI document is otherwise unaware of on-disk changes; this
tool closes the stale in-memory copy and reopens the file from
disk so the GUI shows current geometry.
Args:
doc_name: The name of the open document to reload. Must match
the name shown by ``list_documents``.
Returns:
A message confirming the document was reloaded, or describing
the failure (document not loaded, no associated file, etc).
Examples:
```json
{
"doc_name": "chassis"
}
```
Inputs: doc_name (required).
run_fem_analysisA
Run the CalculiX solver on an existing Fem::FemAnalysis container and return summary results.
Prerequisites in the document:
- A Part-derived solid (e.g. Part::Box, PartDesign::Body) acting as the geometry.
- A Fem::AnalysisPython container created via `create_object`.
- A Fem::MaterialCommon assigned to the geometry, added to the analysis.
- A Fem::FemMeshGmsh referencing the geometry, added to the analysis (the
mesh is generated automatically when created via `create_object`).
- At least one Fem::ConstraintFixed and one Fem::ConstraintForce (or
ConstraintPressure) bound to faces of the geometry, added to the analysis.
A SolverCcxTools is auto-created if the analysis has none.
The solver runs synchronously on the FreeCAD GUI thread and blocks all
other RPC calls for its duration; do not fan out parallel requests.
Returns max von Mises stress (MPa), max/min displacement (mm), node count,
and the working directory CalculiX wrote to. On failure, returns the
prerequisite-check or solver error along with the working directory for
triage.
Args:
doc_name: Name of the FreeCAD document.
analysis_name: Name of the Fem::AnalysisPython object.
timeout: Seconds to wait for the solver (default 600).
include_screenshot: Whether to return a screenshot of the model (default True).
Set to False to save tokens when only the numeric results are needed.
view_name: The view orientation of the returned screenshot (default "Isometric").
Inputs: doc_name (required), analysis_name (required), timeout, view_name, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 14 tools
Most tools have clear distinct purposes (create, edit, delete, get, list, execute, run FEM). The main ambiguity is edit_object, whose description says it is used 'when create_object cannot handle object creation,' blurring the line between creating and editing. execute_code and execute_code_async are clearly differentiated by threading and GUI-safety rules.
Tool names generally follow a consistent verb_noun snake_case pattern (create_object, get_object, delete_object, reload_document, run_fem_analysis). Minor inconsistencies exist: get_parts_list uses 'get' while list_documents uses 'list' for essentially the same operation, and execute_code_async uses a suffix rather than a verb-prefix pattern.
14 tools is within the well-scoped 3-15 range and each tool addresses a distinct aspect of FreeCAD automation: document management, object CRUD, inspection, code execution, view capture, parts library access, and FEM analysis. No tools feel redundant or extraneous.
The surface covers the core lifecycle well: create_document, create/edit/delete_object, get_object(s), list_documents, and run_fem_analysis provide solid end-to-end workflows. Minor gaps exist, such as no explicit save_document or close_document tool, though reload_document implies an external-editing workflow and most gaps can be worked around via execute_code.
Maintenance
Related MCP Connectors
MCP server for AI dialogue using various LLM models via AceDataCloud
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for OpenAI API (chat completions, image generation, embeddings) via AceDataCloud
MCP server for generating rough-draft project plans from natural-language prompts.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceThis 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.27MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server that enables AI assistants to interact with FreeCAD for 3D modeling, macro development, and debugging through 150+ tools supporting multiple connection modes.266Apache 2.0
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables automation of FreeCAD model creation, macro execution, and view management through a server-client architecture, supporting integration with external AI tools like Claude and Cursor.101MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for FreeCAD that enables AI assistants to create and manipulate 3D models via natural language.MIT