freecad-mcp
Enables AI-driven control of FreeCAD for CAD modeling, including creating, editing, measuring objects and running FEM analysis, via natural language interaction through Claude Desktop.
README
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
Install addon
FreeCAD Addon directory is
- Windows:
%APPDATA%\FreeCAD\Mod\ - Mac:
- FreeCAD 1.1:
~/Library/Application\ Support/FreeCAD/v1-1/Mod/ - FreeCAD 1.0:
~/Library/Application\ Support/FreeCAD/v1-0/Mod/
- FreeCAD 1.1:
- Linux:
- Ubuntu:
~/.FreeCAD/Mod/or~/snap/freecad/common/Mod/(if you install FreeCAD from snap) - Debian:
~/.local/share/FreeCAD/Mod - Arch / CachyOS (FreeCAD 1.1 from
extra/freecad):~/.local/share/FreeCAD/v1-1/Mod/
- Ubuntu:
Please put addon/FreeCADMCP directory to the addon directory.
git clone https://github.com/neka-nat/freecad-mcp.git
cd freecad-mcp
# For Linux (Ubuntu/Debian)
cp -r addon/FreeCADMCP ~/.FreeCAD/Mod/
# For Linux (Arch/CachyOS, FreeCAD 1.1 from extra/freecad)
mkdir -p ~/.local/share/FreeCAD/v1-1/Mod/
cp -r addon/FreeCADMCP ~/.local/share/FreeCAD/v1-1/Mod/
# For macOS (FreeCAD 1.1)
cp -r addon/FreeCADMCP ~/Library/Application\ Support/FreeCAD/v1-1/Mod/
When you install addon, you need to restart FreeCAD. You can select "MCP Addon" from Workbench list and use it.

And you can start RPC server by "Start RPC Server" command in "FreeCAD MCP" toolbar.

Auto-Start RPC Server
By default, the RPC server must be started manually each time FreeCAD opens. To start it automatically:
- Open the FreeCAD MCP menu (switch to the MCP Addon workbench first)
- Check Auto-Start Server
The setting is saved to freecad_mcp_settings.json and persists across sessions. On the next FreeCAD launch, the RPC server will start automatically once the application finishes loading.
You can disable it at any time by unchecking Auto-Start Server in the same menu.
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"
]
}
}
}
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 is127.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/24127.0.0.1is 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. See Security model below.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.run_fem_analysis: Run the CalculiX solver on an existingFem::FemAnalysisand return summary results (max von Mises stress, max displacement, node count, working directory). Auto-creates aSolverCcxToolsif the analysis has none. Seeexamples/cantilever_fem.pyfor an end-to-end usage example.
Verified geometry tools
Every tool above reports "success" once the underlying FreeCAD call didn't
raise — which a CAD kernel will do for a lot of operations that don't
actually accomplish anything (a pocket cut over empty space, a pattern with
an axis reference that silently resolves to nothing, a placement that gets
reverted by its owning body on the next recompute). The tools below instead
report measured geometry (volume, bounding box, isValid) so a caller can
tell the difference between "the call succeeded" and "the call did what I
wanted":
measure: Volume, area, bounding box,isValid, and face/edge/vertex counts for any object.probe_material_at: Checks whether solid material actually exists inside a given box — "is there a floor/wall here?"place: Positions an object by its real bounding-box corner (not a derived offset), and automatically moves the owningPartDesign::Bodywhen needed, since a feature's ownPlacementis silently reverted by its Body otherwise.create_sketch,add_rectangle,add_circle,add_polygon: Build sketches that are fully constrained as they're drawn (no separate dimensioning step, and no "closed but unpinned" loops that PartDesign refuses to pad).pad,pocket: Extrude/cut a sketch, reportingvolumeBefore/volume/isValid.pocketfails loudly if no material was removed. Through-holes always cut from the midplane so they penetrate regardless of which side the material is on.linear_pattern,polar_pattern: Repeat features along/around a sketch axis, resolving the axis reference correctly so a pattern doesn't silently pattern nothing.fillet,chamfer: Round/bevel a solid feature's edges; reject a sketch as the base outright (with an explanation) instead of poisoning the feature tree.measure_gap: Measures the real gap between two parts along one axis, so a spanning part (e.g. a shelf between two supports) can be sized from measured geometry instead of a number derived independently of where those parts actually ended up.instantiate_family: Builds a parametric part from a small library of part-family templates (l_bracket,flanged_disc,box_enclosure) instead of a manual op sequence.
Security model
execute_code/execute_code_asyncrun unsandboxed Python on the machine hosting FreeCAD —exec(code, globals())with no import allowlist, AST restrictions, or resource limits. Anything reachable from this tool (import os; os.system(...),subprocess, arbitrary file access) is reachable by anyone who can call it. This is a deliberate design choice, not an oversight, but it means connecting to the RPC port is equivalent to full shell access to that machine — treat network exposure accordingly (see Remote Connections below). The MCP server blocks a denylist of known-dangerous patterns (import os,import subprocess,subprocess.,os.system(,eval(,exec(,open(,__import__) plus three Sketcher calls observed to hang FreeCAD's solver indefinitely on an already-constrained sketch (.solve(,deleteAllGeometry(,movePoint() before running code — this raises the bar against accidental misuse, it is not a security sandbox against an adversarial caller.execute_code's Python namespace is shared and persists across everyexecute_code/execute_code_asynccall for the life of the FreeCAD process (it is therpc_servermodule's ownglobals(), not a fresh namespace per call). This is what letsexecute_code_asyncstash a result in a module-level variable for a laterexecute_codecall to read — but it also means a variable, import, or class defined by one call remains visible (and can collide) in every later, unrelated call, with no reset short of restarting FreeCAD or the RPC server.edit_object's property assignment is partial, not atomic. If several properties are passed and one fails to apply, the properties that did succeed remain applied on the object — only the failure is reported. Always re-check withget_object/measureafter an edit rather than assuming all-or-nothing semantics.- The only network access control is an IP allowlist (see Remote Connections) — there is no authentication token and no TLS. It stops connections from unlisted addresses; it does not stop a request that is merely spoofed or already inside the same trusted network.
Contributors
<a href="https://github.com/neka-nat/freecad-mcp/graphs/contributors"> <img src="https://contrib.rocks/image?repo=neka-nat/freecad-mcp" /> </a>
Made with contrib.rocks.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。
