Build123d MCP

by pzfreo• 137•• Scanned•Claim this listing•Request removal
Data Science & MLai toolsbuild123dcadmcpmcp server

MCP server for build123d to improve AI cognition when creating 3D CAD models

Build123d MCP is an open-source mcp server by pzfreo, written mainly in Python, with 137 GitHub stars and the Apache-2.0 license. Its code was last updated Oct 15, 2026.

Scan summary: scanned Nov 5, 2026 at commit 59b2561. Seen able to run shell commands, run dynamic code, read environment and secrets. Scan policy

Scanned
Full scan at 59b2561 · Nov 5, 2026
Scanned Builds Boots No undeclared egress Reproducible
Static code scanwarn
Secrets scanpass
Dependency audit100 known vulnerabilitiesfail
Manifestserver.jsonpass
Buildpass
Boot & handshake48 toolspass
Network egresspass
Reproducible (×3)pass

Findings (15)

  • high
    dependencies issue
    Details are available to the maintainer after claiming this listing.
  • high
    dependencies issue
    Details are available to the maintainer after claiming this listing.
  • high
    dependencies issue
    Details are available to the maintainer after claiming this listing.
  • high
    dependencies issue
    Details are available to the maintainer after claiming this listing.
  • medium
    Deserializes data with pickle/marshal, which can execute code.
    src/build123d_mcp/_vtk_render_subprocess_worker.py:22
  • medium
    Deserializes data with pickle/marshal, which can execute code.
    src/build123d_mcp/tools/render.py:506
  • medium
    cryptography@47.0.0: 4 known vulnerabilities
    PYSEC-2026-3552, PYSEC-2026-3553, PYSEC-2026-3554, GHSA-537c-gmf6-5ccf
    uv.lock
  • medium
    httpcore2@2.9.1: 1 known vulnerability
    PYSEC-2026-3844
    uv.lock
  • medium
    httpx2@2.9.1: 5 known vulnerabilities
    PYSEC-2026-3845, PYSEC-2026-3846, PYSEC-2026-3847, PYSEC-2026-3848, PYSEC-2026-3849
    uv.lock
  • medium
    mcp@2.0.0: 4 known vulnerabilities
    GHSA-5h93-6whr-6q8j, GHSA-84m7-p3x7-pcfv, GHSA-rwrf-2pqf-9j8j, GHSA-w4fh-qvv9-3v23
    uv.lock
  • medium
    python-multipart@0.0.27: 4 known vulnerabilities
    PYSEC-2026-3036, PYSEC-2026-3037, PYSEC-2026-3040, PYSEC-2026-3041
    uv.lock
  • medium
    starlette@1.0.0: 5 known vulnerabilities
    PYSEC-2026-161, PYSEC-2026-2280, PYSEC-2026-2281, PYSEC-2026-248, PYSEC-2026-249
    uv.lock
  • medium
    urllib3@2.7.0: 3 known vulnerabilities
    PYSEC-2026-4175, PYSEC-2026-4176, PYSEC-2026-4177
    uv.lock
  • low
    opentelemetry-api@1.44.0: 1 known vulnerability
    GHSA-xcq7-p3pf-p88h
    uv.lock
  • low
    Reads environment variables not listed in the manifest
    BUILD123D_PART_LIBRARY, BUILD123D_ALLOW_ALL_IMPORTS, BUILD123D_ALLOW_IMPORTS, BUILD123D_NO_SANDBOX, BUILD123D_EXEC_TIMEOUT, BUILD123D_IN_PROCESS, BUILD123D_TRANSPORT, BUILD123D_HOST, BUILD123D_PORT, BUILD123D_MAX_SESSIONS, BUILD123D_SESSION_IDLE_TIMEOUT, BUILD123D_MEMORY_LIMIT_MB, BUILD123D_CPU_LIMI…

Network activity

During install
files.pythonhosted.orgpypi.org
While running
No connections

Tools exposed (48)

  • execute

    Execute build123d Python code in the persistent session. Errors include automatic fix hints — read them before retrying. Use show(shape, name) to register named objects (name defaults to 'shape'); show() immediately prints volume and face count confirming the shape is non-empty. After any boolean op

  • execute_file

    Execute a canonical build123d .py file in a clean namespace and atomically promote its result. The prior active model is restored if the source has a syntax/runtime error, times out, produces no shape, or does not produce result_name. Assign a Shape to `result` or call show(); optionally set result_

  • render_view

    Render model. Auto-detects 3D vs 2D: solids use VTK; flat drawings use the 2D pipeline. Renders confirm appearance, not geometry. format: png, svg, dxf, or both. direction accepts top, bottom, front, rear, side, left, right, or iso. quality: preview, standard, or high; a timed-out standard/high PNG

  • measure

    Measure a shape and return a complete geometric summary: volume (mm³), surface area (mm²), topology (face/edge/vertex counts), bounding box with per-axis size and center, volumetric center of mass, 6-component inertia tensor (Ixx/Iyy/Izz/Ixy/Ixz/Iyz), and a face-type inventory classifying every face

  • validate

    Check whether a shape would pass a CAD validity gate before exporting it. Returns a PASS/FAIL verdict plus JSON (passes_gate, n_solids, volume, is_manifold, brep_valid, reasons). The gate mirrors what strict CAD and mesh consumers require: a well-formed (BRepCheck), watertight, manifold solid with n

  • locate_gate_defects

    Report WHERE a solid fails the validity gate, with 3D coordinates — so you can fix the exact edge/face instead of guessing. validate()/export() tell you WHAT is wrong (e.g. "1 non-manifold edge", "BRepCheck failed") but not where; call this when validate() FAILs to get a per-defect list: brep_invali

  • design_audit

    Audit the current session program as a *design*, not just a shape: surface its named numeric parameters (Θ) and test how robust each is to editing. Parses the assembled program (see script()) for top-level numeric assignments (e.g. `plate_thickness = 5.0`), then rebuilds the program with each parame

  • analyze_printability

    Analyse a build123d shape for FDM printability using augura (BREP-exact analysis). Checks: overhangs, manifold/watertight, tip-over risk, brim/raft need, minimum vertical feature (→ max layer height), and thin walls. Optionally checks bed-fit against a declared build volume. Return

  • cross_sections

    Compute cross-sectional areas at evenly spaced planes along an axis. Returns a list of {position, area} pairs. axis: X, Y, or Z (default Z). num_slices: number of planes (default 10, minimum 2). Useful for detecting internal voids, wall-thickness variation, or verifying that a shape's cross-section

  • mesh_section

    Loops on one cross-section plane of a mesh, largest first. Returns JSON {axis, position, loop_count, enclosed_passages, loops:[{points, center, size, min, max, enclosed}]}, all in the two axes that are not `axis`. enclosed_passages counts loops at odd nesting depth, representing passages through mat

  • mesh_holes

    Find fastener holes in a MESH by slicing it on all three axes. Returns JSON {count, holes:[{axis, diameter, location, span, depth, through}]} where axis is the drilling direction and location is the hole centre in world coordinates. This is the mesh counterpart to find_holes(), which needs real topo

  • inspect_part

    Return one compact generation-checkpoint inventory: bbox, solid/topology counts, holes grouped by axis/diameter/depth/bottom, bosses grouped by axis/diameter/height, recognised patterns with member counts, and a cross-section area profile. expected is an optional JSON object derived from the drawing

  • export

    Export model. format: step, stl, 3mf, dxf, svg, or comma-separated list e.g. 'step,stl' or 'dxf,svg'. 3D shapes (solids) export to step/stl/3mf; 2D shapes (Sketches and dimensioned drawings composed via build123d.drafting) export to dxf/svg. 3mf is a minimal core-spec mesh export (single object, no

  • bank_candidate

    Atomically promote a gate-clean STEP as the safe output/checkpoint. Writes the candidate to a private sibling file, runs the authoritative written-and-reimported STEP gate, and replaces filename only on a fully verified PASS; on FAIL or an unchecked mesh gate, the candidate is deleted and any existi

  • inspect_drawing

    DEPRECATED (#465) — moved to draftwright; off by default in 0.4.0, removed in 0.5.0. Calling it explains the replacement. Structured bbox and annotation report for a 2D drawing. Two modes: 1. Session mode (default): inspects objects registered via annotate()/show(). Returns per-obje

  • prepare_drawing

    Prepare a raster engineering drawing for efficient inspection. Detects substantial spatial regions, saves one labelled overview plus readable PNG crops, and returns their pixel bounding boxes and paths. Region ids are layout evidence only: this tool does NOT label views, recognise CAD features, inte

  • crop_drawing

    Save one model-selected raster drawing region at readable scale. bbox_px is exact source-image [x0,y0,x1,y1]; scale is 0.25..12. Returns the saved PNG path and an exact crop-pixel→source-pixel transform, so coordinates read from the enlargement remain usable. This is a mechanical crop only: it perfo

  • view_axes

    DEPRECATED (#465) — moved to draftwright; off by default in 0.4.0, removed in 0.5.0. Calling it explains the replacement. Return the world→page axis mapping for a project_to_viewport call, computed analytically (no projection performed). Use this BEFORE rendering a projected view to confirm

  • lint_drawing

    DEPRECATED (#465) — moved to draftwright; off by default in 0.4.0, removed in 0.5.0. Calling it explains the replacement. Run structural drawing-quality checks and return JSON {violations: [...]}. Session mode (default): reconstructs the session's annotations and delegates to build123d-draf

  • render_drawing

    DEPRECATED (#465) — moved to draftwright; off by default in 0.4.0, removed in 0.5.0. Calling it explains the replacement. Rasterise an existing SVG file to PNG via resvg-py. Complements render_view (which takes build123d shapes from the live session) by accepting an SVG written outside the

  • save_drawing_annotations

    DEPRECATED (#465) — moved to draftwright; off by default in 0.4.0, removed in 0.5.0. Calling it explains the replacement. Write a .dims.json sidecar file alongside an SVG with label metadata. build123d renders Text as filled glyph paths, not <text> SVG elements, so label strings are irrecov

  • save_snapshot

    Save a named checkpoint of the current geometric state (current_shape and the show() object registry). The Python variable namespace is NOT saved — only geometry. Call this before risky experiments so you can restore known-good geometry without re-running all prior execute() calls.

  • restore_snapshot

    Restore geometric state from a previously saved snapshot (current_shape and the show() registry). The Python variable namespace is NOT restored — execute() calls made after the snapshot are still in scope, but current_shape and all show() objects revert to what they were at snapshot time.

  • session_state

    Return a structured JSON snapshot of the current session: current_shape metrics, all named objects (replaces list_objects) with geometry stats, snapshot names, and a variables summary of the Python namespace (type + volume for shapes, type + length for collections, type + value for scalars). Use thi

  • health_check

    Verify that render and export dependencies are working. Tests PNG render (VTK), SVG render (build123d HLR), STEP export, and STL export with a trivial shape. Returns JSON with ok/error per capability. Run at session start if you suspect a missing dependency.

  • reset

    Clear the current session back to empty state, including all snapshots.

  • destroy_session

    Close THIS client's CAD session, discarding its namespace, objects and snapshots, and release its worker subprocess. The next tool call transparently starts a fresh session under the same handle. Use when abandoning a model entirely; prefer reset() to clear geometry while keeping the session. Only m

  • list_sessions

    Report how many CAD sessions this server process is holding, its configured limit, and how long each has been idle. Handles are secrets and are never returned. Operator/diagnostic tool for HTTP deployments — over stdio there is always exactly one session.

  • compare

    Unified comparison tool. kind='shape' compares two named shapes from show(), a and b, by volume/bbox/topology and localized surface deviation; b is required. kind='fit' reports the spatial relationship between two named shapes, a and b: clearance, apart/touching/containing/interpen

  • find_holes

    Recognise drilled holes on a session object (defaults to current shape). Coaxial internal cylinders are grouped into one record per hole: drill + counterbore + spotface stacks, keyway-split bores, and bores interrupted by crossing holes all count once. Returns JSON: {count, holes: [{axis (drilling d

  • find_hole_patterns

    Recognise hole patterns on a session object (defaults to current shape): ≥3 identical-spec holes equally spaced on a circle → bolt_circle (center, diameter/BCD), collinear at constant pitch → linear_array (pitch, direction). Returns JSON: {count, patterns: [{type, holes: [HoleFeature records], cente

  • find_bosses

    Recognise external cylindrical bosses on a session object (defaults to current shape), including a turned part's OD — filter on diameter against the part envelope for local bosses only. Returns JSON: {count, bosses: [{axis (base toward free end), location (free-end point), diameter, height}]}.

  • find_bored_bosses

    Find candidate bored bosses and report target-selection/edit evidence: bore opening location, axis into the part, outward axis, bore diameter/depth, planar cap faces at the opening, whether the cap is split across multiple faces, and construction advice. Use this before lengthening any boss that car

  • find_countersinks

    Recognise countersinks (conical screw-head recesses) on a session object (defaults to current shape) — the feature find_holes reports only as a plain opening. A countersink is an internal cone flaring from a drilled bore out to a larger opening, coaxial with the drill; drill-point cones and external

  • recognise_features

    Run the shared quiddity inventory once and return exact, run-local edit evidence. With families='' the response is a compact inventory and targetable-family count; pass comma-separated families such as 'holes,bosses,blends' for structured records and @feature handles. Returned handles are usable ins

  • find_candidates

    List recognised instances of a hole, boss, polygonal boss, slot, chamfer or fillet. qualifiers is JSON with optional axis (X/Y/Z), side (+X/-X/+Y/-Y/+Z/-Z, relative to the part bounding-box centre), and value_field; matches are reported for the literal axes and grouped over all 24 proper rotations o

  • interface_features

    Suggest planar mounting faces from recognised hole openings, with exact hole handles. These are geometric candidates, not a declaration of design intent. Pass chosen hole handles as protected_refs to edit_feature(); that edit also checks every other recognised hole and the outer envelope.

  • edit_feature

    Transactionally resize one plain cylindrical through hole identified by a current @feature handle. Reject holes with counterbores, spotfaces, countersinks or multiple constituent faces. Predict the annular volume change, then check exact added/removed material, hole recognition, every other hole and

  • resolve

    Evaluate a selector expression against a named object and return a geometry descriptor. selector is a Python expression suffix applied to the object, e.g. '.faces().filter_by(Axis.Z).last()'. If label is given, the descriptor is stored in session.geometry_refs[label] and appears in session_state().

  • script

    Return a single Python script assembled from all successfully executed code blocks in this session. Prepends 'from build123d import *' if not already present. If save_to is given, writes the script to that path and returns {script_path, blocks}; otherwise returns {script, blocks}. Useful for exporti

  • import_cad_file

    Import a STEP (.step/.stp), STL (.stl), or 3MF (.3mf) file as a named object in the session. path: absolute or relative path to the file. name: name to register the shape under (defaults to the filename stem). The shape becomes both the named object and the current_shape. A multi-object 3MF register

  • repair_hints

    Given an error message or validity-gate reason, return targeted fix suggestions for common build123d mistakes and gate failures: wrong Location syntax, missing .part, CadQuery idioms, blocked imports, degenerate boolean results, fillet edge selection, B-rep defects, mesh non-manifold/open-edge failu

  • repair_advice

    Return structured, field-proven repair/edit recipes for an agent to implement explicitly in execute(). Unlike repair_hints(), which gives short error-specific tips, this emits a sequenced plan with code-pattern names, acceptance checks, and stop conditions. Provide the full validate()/export()/last_

  • last_error

    Return details of the last failed execute() call: exception type, message, and (for runtime and syntax errors) line number and a 5-line excerpt around the failing line. Security errors include a message but no line/excerpt. Returns {"error": null} if the last execute() succeeded or no execute() has

  • version

    Return the installed versions of the build123d-mcp server, its key dependencies (build123d, build123d-drafting-helpers), and the companion packages importable inside execute() (bd_warehouse for threads/fasteners/gears/bearings, augura for printability analysis). Use this to confirm which server buil

  • workflow_hints

    Return guidance on how to use these tools effectively. Call this at the start of a session or whenever unsure which tool to reach for.

  • suggest_view_layout

    DEPRECATED (#465) — moved to draftwright; off by default in 0.4.0, removed in 0.5.0. Calling it explains the replacement. Auto-calculate safe VIEW_X / VIEW_Y positions for a multi-view engineering drawing. Measures the named shape's bounding box and returns per-view page positions (VIEW_X,

  • install_skill

    Copy a b123d workflow skill into the current project. Writes the appropriate config file for the requested agent so the step-by-step workflow is available in future sessions. skill: which workflow to install (default "modeling") - drawing → DEPRECATED; still installs, but drawi

Automated result for the commit shown. See our scan policy. View the scan log

Maintainers can claim the listing to rescan, or dispute a result.

Build123d MCP alternatives

View more →

Similar mcp servers in Data Science & ML, ranked by GitHub stars. Compare licence, recent activity and scan status before you choose.

NameStarsLicenceLast updatedScan
Build123d MCP (this page)
pzfreo
137Apache-2.0Oct 15, 2026Scanned, no flagged issues
MaxKB
1Panel-dev
23kGPL-3.0Nov 1, 2026Scanned, no flagged issues
FunASR
modelscope
21kMITNov 1, 2026Scanned, no flagged issues
Ida Pro MCP
mrexodia
13kMITSep 26, 2026Scanned, no flagged issues
Pal MCP Server
BeehiveInnovations
12kNone foundDec 15, 2025Not scanned yet
Osaurus
osaurus-ai
8.1kMITNov 1, 2026Scanned, no flagged issues