FreeCAD MCP Server mcpfreecad
mcpfreecad is an MCP server for driving a running FreeCAD session. It exposes document management, modeling, inspection, snapshot, and optional workbench operations to MCP clients over stdio or authenticated remote HTTP.
The server is designed around a small Python bridge that is loaded into FreeCAD's embedded interpreter. The MCP process then talks to that bridge over localhost.
Features
stdioand API-key authenticatedremotehttptransports- document lifecycle tools for opening, saving, closing, and enumerating FreeCAD documents
- explicit model inspection via document tree, topology, sketch status, and sketch details tools
- modeling support for Part primitives, PartDesign bodies/pads/pockets, spreadsheets, Draft arrays, and snapshots
- reusable object library backed by BREP plus JSON metadata
- optional workbench integration for helpers such as
freecad.gears, Fasteners, Curves sketch-on-surface workflows, and A2plus assembly operations when available - remote snapshot retrieval through authenticated URLs or tokenized snapshot download URLs
For LLM-facing operating guidance, see LLM_USAGE.md.
Installation
Install from PyPI:
pip install mcpfreecad
To enable remote HTTP mode:
pip install "mcpfreecad[remote]"
For local development:
git clone <repository-url>
cd mcpFreeCAD
pip install -e .
pip install -e ".[remote]"
Quick Start
- Start FreeCAD.
- Load the bridge module inside the FreeCAD Python console.
- Start
mcpfreecadinstdiomode orremotehttpmode. - Connect your MCP client and call
bridge_status.
Example bridge loading from a checkout:
exec(open("/path/to/mcpFreeCAD/examples/freecad_bridge_loader.py").read(), globals(), globals())
The loader starts the bridge on 127.0.0.1:48111 with token change-me. Adjust the example or call start_bridge_server(...) directly if you need different values.
Configuration
The default configuration path is ~/.config/mcpfreecad.conf.
Example configuration:
{
"mode": "remotehttp",
"logging": {
"level": "INFO"
},
"bridge": {
"host": "127.0.0.1",
"port": 48111,
"token": "change-me",
"timeout_seconds": 30.0
},
"remote_server": {
"transport": {
"uds": "/var/run/mcpfreecad.sock"
},
"url_prefix": "https://mcp.example.com/freecad/"
},
"stdio": {
"library_root": "/srv/mcpfreecad/stdio-library",
"allow_code_execution": true,
"allow_library_write": true,
"allow_snapshots": true
},
"api_keys": [
{
"id": "cad-agent",
"kdf": {
"algorithm": "argon2id",
"salt": "BASE64",
"time_cost": 3,
"memory_cost": 65536,
"parallelism": 1,
"hash_len": 32,
"hash": "BASE64"
},
"library_root": "/srv/mcpfreecad/cad-agent-library",
"allow_code_execution": true,
"allow_library_write": true,
"allow_snapshots": true
}
]
}
Generate or rotate a remote API key:
mcpfreecad --config ~/.config/mcpfreecad.conf --genkey cad-agent
Running
StdIO mode:
mcpfreecad --config ~/.config/mcpfreecad.conf
Remote HTTP mode:
mcpfreecad --config ~/.config/mcpfreecad.conf --transport remotehttp
The remote HTTP wrapper accepts:
Authorization: Bearer <token>X-API-Key: <token>?mcp=<token>- legacy
?api_key=<token>
/status is intentionally public so it can be used for health checks.
Reverse Proxy Notes
The FastMCP instance is created with:
TransportSecuritySettings(enable_dns_rebinding_protection=False)
That is intentional for reverse-proxy deployments.
Example Apache layout:
ProxyPass /freecad/status http://127.0.0.1:18080/status
ProxyPassReverse /freecad/status http://127.0.0.1:18080/status
ProxyPass /freecad/mcp/ http://127.0.0.1:18080/mcp/
ProxyPassReverse /freecad/mcp/ http://127.0.0.1:18080/mcp/
ProxyPass /freecad/snapshots/ http://127.0.0.1:18080/snapshots/
ProxyPassReverse /freecad/snapshots/ http://127.0.0.1:18080/snapshots/
When remote_server.url_prefix is configured, snapshot download URLs are returned as absolute URLs rooted there. Otherwise they fall back to relative ../snapshots/... paths.
Snapshot Retrieval
capture_snapshot(...) returns:
snapshot_iddownload_urldownload_url_with_token
download_url requires normal MCP auth again.
download_url_with_token is an easier direct-fetch URL for clients that cannot conveniently resend MCP auth. It contains a random in-memory token and returns image/png.
You can also retrieve a registered snapshot inline through:
get_snapshot_base64(snapshot_id="...")
Snapshots are exposed only if they were created through capture_snapshot(...). Arbitrary server files are not downloadable through the snapshot route.
FreeBSD rc.d Service
A sample rc.d script is included at freebsd/rc.d/mcpfreecad.
Install it as:
install -m 0555 freebsd/rc.d/mcpfreecad /usr/local/etc/rc.d/mcpfreecad
Default rc.conf settings:
mcpfreecad_enable="YES"
mcpfreecad_config="/usr/local/etc/mcpfreecad.conf"
Optional overrides:
mcpfreecad_daemon_user="mcpfreecad"
mcpfreecad_command="/usr/local/bin/mcpfreecad"
mcpfreecad_transport="remotehttp"
mcpfreecad_flags=""
mcpfreecad_pidfile="/var/run/mcpfreecad.pid"
Optional Workbenches
mcpfreecad only surfaces optional workbench tools when the corresponding workbench is available on the host. This currently includes support for areas such as:
freecad.gears- Fasteners
- Curves
- A2plus
Repository Layout
mcpfreecad/: package sourceexamples/: bridge loader and smoke examplesfreebsd/: FreeBSD service helpertests/: automated test suiteskill/: Codex skill material
Testing
Run the Python test suite with:
pytest -q
For bridge-side smoke testing from a checkout:
python3 examples/freecad_bridge_smoke.py
python3 examples/freecad_bridge_smoke.py --with-fasteners
Release files for mcpfreecad 0.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mcpfreecad-0.0.1.tar.gz | 45.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mcpfreecad-0.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 88.8 kB
Release files / mcpfreecad-0.0.1.tar.gz
| Download URL | mcpfreecad-0.0.1.tar.gz |
|---|---|
| Size | 45.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7ddc573e8f6c0584e8028752b050616109c7a2fe798d325b9999cdefadf67a87
|
|
BLAKE2b-256 checksum How to use checksums |
798401ad50084ab56e5553e482834309e159874a33eeb5b43015f7b6c8ada62f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.11.11
|
Release files / mcpfreecad-0.0.1-py3-none-any.whl
| Download URL | mcpfreecad-0.0.1-py3-none-any.whl |
|---|---|
| Size | 43.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ccde58826a7142e41e4baca01b8fc5c1a08792c96ab912947952f31ec75bd5b1
|
|
BLAKE2b-256 checksum How to use checksums |
aed539c178a69f1e38e3cb83fa482e5bd5516572b2c1e2d65e90a916a171ee37
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.11.11
|