MCP server wrapping build123d for interactive 3D CAD
Project description
build123d-mcp
An MCP (Model Context Protocol) server that exposes build123d CAD operations as tools, enabling AI assistants to build, inspect, and iterate on 3D geometry interactively.
Why
When using an AI to write build123d scripts, the AI writes blind — it cannot see the geometry it produces. This server closes the feedback loop: the AI can create geometry, render views, query dimensions, and catch errors incrementally rather than writing complete scripts and hoping they are correct.
Tools
Core
execute— run build123d Python code in a persistent session; useshow(shape, name)to register named partsreset— clear session back to empty state (namespace, shapes, snapshots)
Geometry inspection
measure— full geometric summary: volume, area, topology, bounding box, centre of mass, inertia tensor, face-type inventoryclearance— minimum distance (mm) between two named shapescross_sections— cross-sectional areas at evenly spaced planes along X/Y/Z; useful for detecting voids and wall-thickness variationsession_state— full JSON snapshot of active shapes, named objects, snapshot names, and Python namespace variableslast_error— details of the last failedexecute(): type, message, line number, and code excerpt
Viewing
render_view— render one or more shapes as PNG or SVG; supports assembly compositing, high-quality tessellation, cross-section clip planes, and optional labels for named shapes or specific faces/edges
Import / export
export— export as STEP, STL, or both in one call; targets a named object, the current shape, or*for all objects as an assemblyimport_cad_file— load a STEP or STL file as a named object for comparison
Comparison
shape_compare— compare two named shapes by volume, bbox, topology, and centre offsetinterference— check intersection volume between two named shapes
Session checkpoints
save_snapshot/restore_snapshot/diff_snapshot— checkpoint, recover, and compare geometric state
Part library (requires --library flag)
search_library— search the part library by keyword; returns full parameter specsload_part— load a named part with optional parameter overrides
Utility
version— return the server versionhealth_check— verify VTK/SVG/STEP/STL dependencies work end-to-endrepair_hints— get targeted fix suggestions for a givenexecute()error messageworkflow_hints— guidance on using the tools effectively
Resources
Read-only MCP resources available to LLM clients:
build123d://quickref— build123d API quick reference (primitives, booleans, positioning, selectors, fillets)build123d://selectors— task-indexed selector cookbook (get the top face, find circular edges, filter by area/length/radius,Select.LASTin builder context, fillet detection)build123d://session— live session state as JSON (current shape, named objects, snapshots, variables)build123d://bd_warehouse— catalogue of pre-built parametric parts from bd_warehouse (bearings, fasteners, gears, pipes, threads, and more)
build123d version: examples in
quickrefandselectorsare tested against build123d 0.10.x (soft-pinned inpyproject.tomlas>=0.10,<0.11). The exact installed version is reported at the top of each resource. If you need a different build123d version, override the dependency and verify the examples still match the API.
Prompts
start-cad-session— primes a new CAD design session with the task description and step-by-step workflow reminders
See llms.md for full tool reference and usage patterns.
Recommended workflow
Build complexity falls into two tiers and the right approach differs between them.
Simple shapes (a few primitives, up to ~5 booleans): build entirely in execute().
Complex shapes (IsoThread, multi-body fillets, high face counts): the execute() timeout (default 120 s) is a hard ceiling. The efficient pattern is:
- Probe in the MCP — small
execute()calls to discover API signatures, size strings, and face counts. Usedir()andimport inspect; inspect.signature(ClassName)freely. - Build in a Python script — run it with Bash (or your shell). No timeout, full Python.
- Import and verify in the MCP:
import_cad_file("/path/to/part.step", "part") measure("part") # verify volume, topology, bounding box render_view(objects="part") # visualise
Timeout note: the default is 120 s. Raise it with
--exec-timeout NorBUILD123D_EXEC_TIMEOUT=N. When a timeout fires, all session state is lost (worker is restarted) — you must re-run any setup code.
Import note: after
import_cad_file()the shape is a named session object. Always render it by name (objects="part") when other shapes from the same build are also in session — two co-located shapes cause Z-fighting (striped colour artifacts). STL imports produce a shell (volume = 0);render_viewandmeasurework, butinterference()and boolean operations require a solid.
bd_warehouse fasteners
bd_warehouse is a full fastener system, not just a thread library. Always:
- Probe sizes first (correct string format is
"M6-1"not"M6-1.0"):from bd_warehouse.fastener import CounterSunkScrew print(CounterSunkScrew.sizes("iso10642"))
- Instantiate the fastener object, then pass it to the hole operation — never compute head geometry or tap-drill diameters manually:
from bd_warehouse.fastener import CounterSunkScrew, CounterSinkHole, TapHole screw = CounterSunkScrew(size="M6-1", fastener_type="iso10642", length=10) with BuildPart() as wheel: Cylinder(radius=20, height=10) CounterSinkHole(fastener=screw, depth=10) # countersunk through-hole TapHole(fastener=screw, depth=8) # tapped bore
See build123d://bd_warehouse (MCP resource) for the full catalogue and usage patterns.
Requirements
- uv
- An MCP-compatible client (Claude Code, Claude Desktop, Cursor, etc.)
All Python dependencies (build123d, vtk, etc.) are installed automatically by uv.
Installation
No clone needed. Install directly from PyPI:
pip install build123d-mcp
Or just use uv tool run — it fetches and runs the package in one step with no prior install required (see below).
Adding to MCP clients
The server runs over stdio — the client launches it as a subprocess using uv tool run build123d-mcp.
Note on Python version. All examples below pass
--python 3.12. VTK and cadquery-ocp do not yet ship wheels for Python 3.13+, so pinning to 3.12 is required. uv will auto-download a managed Python 3.12 if you don't already have one.
Claude Code
Add to your project's .mcp.json (or ~/.claude/mcp.json for global use):
{
"mcpServers": {
"build123d-mcp": {
"command": "uv",
"args": ["tool", "run", "--python", "3.12", "build123d-mcp"]
}
}
}
Restart Claude Code after editing. The tools appear automatically once connected.
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"build123d-mcp": {
"command": "uv",
"args": ["tool", "run", "--python", "3.12", "build123d-mcp"]
}
}
}
Restart Claude Desktop after saving.
Cursor
Open Settings → MCP and add a new server entry, or edit ~/.cursor/mcp.json:
{
"mcpServers": {
"build123d-mcp": {
"command": "uv",
"args": ["tool", "run", "--python", "3.12", "build123d-mcp"]
}
}
}
VS Code (GitHub Copilot / Continue)
For Continue extension, add to .continue/config.json:
{
"mcpServers": [
{
"name": "build123d-mcp",
"command": "uv",
"args": ["tool", "run", "--python", "3.12", "build123d-mcp"]
}
]
}
For GitHub Copilot with MCP support, add to .vscode/mcp.json in your workspace:
{
"servers": {
"build123d-mcp": {
"type": "stdio",
"command": "uv",
"args": ["tool", "run", "--python", "3.12", "build123d-mcp"]
}
}
}
System prompt
For best results, paste the contents of default_prompt.md as a system prompt in your AI client. This tells the assistant to work incrementally, verify geometry after each step, and use the tools in the right order.
Status
Active development (v0.3.14).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file build123d_mcp-0.3.14.tar.gz.
File metadata
- Download URL: build123d_mcp-0.3.14.tar.gz
- Upload date:
- Size: 187.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e51286963453da9c57362dceb4b895e9198b09aaf8ec357d8cf6ec4dfd915b2a
|
|
| MD5 |
214cc8ddcb66fd181794e9689dd7ce09
|
|
| BLAKE2b-256 |
bf2e0ade81f111d53b038722ebe29a6132290945a98dfd5476a766993ac88d29
|
Provenance
The following attestation bundles were made for build123d_mcp-0.3.14.tar.gz:
Publisher:
publish.yml on pzfreo/build123d-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
build123d_mcp-0.3.14.tar.gz -
Subject digest:
e51286963453da9c57362dceb4b895e9198b09aaf8ec357d8cf6ec4dfd915b2a - Sigstore transparency entry: 1486995354
- Sigstore integration time:
-
Permalink:
pzfreo/build123d-mcp@b75f5d9f36f2c89654d760f118fd7b218c9b4035 -
Branch / Tag:
refs/tags/v0.3.14 - Owner: https://github.com/pzfreo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b75f5d9f36f2c89654d760f118fd7b218c9b4035 -
Trigger Event:
release
-
Statement type:
File details
Details for the file build123d_mcp-0.3.14-py3-none-any.whl.
File metadata
- Download URL: build123d_mcp-0.3.14-py3-none-any.whl
- Upload date:
- Size: 67.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d4bc8de6aff7043981e2d1b498304a6d01396513dd2be9cba83ecedeaab863b
|
|
| MD5 |
a67fa86857652bf62878792a20840b08
|
|
| BLAKE2b-256 |
08ea056577b8c0db3241e5fffeae3e3a50c63193bc4f195a46c1094a99f52d15
|
Provenance
The following attestation bundles were made for build123d_mcp-0.3.14-py3-none-any.whl:
Publisher:
publish.yml on pzfreo/build123d-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
build123d_mcp-0.3.14-py3-none-any.whl -
Subject digest:
4d4bc8de6aff7043981e2d1b498304a6d01396513dd2be9cba83ecedeaab863b - Sigstore transparency entry: 1486995366
- Sigstore integration time:
-
Permalink:
pzfreo/build123d-mcp@b75f5d9f36f2c89654d760f118fd7b218c9b4035 -
Branch / Tag:
refs/tags/v0.3.14 - Owner: https://github.com/pzfreo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b75f5d9f36f2c89654d760f118fd7b218c9b4035 -
Trigger Event:
release
-
Statement type: