{"name":"io.github.pzfreo/build123d-mcp","slug":"pzfreo-build123d-mcp","title":"build123d MCP","description":"AI-driven 3D CAD via build123d: execute, render, measure, and export geometry interactively.","url":"https://mcp.market/server/pzfreo-build123d-mcp","rating":null,"grade":"A","score":85,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":48,"stars":90,"forks":12,"downloads_week":738,"last_push_at":"2026-09-04T04:05:49.000Z","license":"Apache-2.0"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/pzfreo/build123d-mcp","website":null,"version":"0.3.84","remotes":[],"packages":[{"registryType":"pypi","identifier":"build123d-mcp","version":"0.3.84","transport":{"type":"stdio"}}],"tools":[{"name":"analyze_printability","description":"Analyse a build123d shape for FDM printability using augura (BREP-exact analysis).","write_action":false,"price_micros":0,"input_schema":null},{"name":"compare","description":"Unified comparison tool.","write_action":false,"price_micros":0,"input_schema":null},{"name":"crop_drawing","description":"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 performs no OCR, feature recognition, or geometry inference.","write_action":false,"price_micros":0,"input_schema":null},{"name":"cross_sections","description":"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 profile matches a reference. object_name: named object from show() (default: current shape).","write_action":false,"price_micros":0,"input_schema":null},{"name":"design_audit","description":"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 parameter nudged ±epsilon (default ±10%) in a hard-bounded subprocess (the live session is never mutated)","write_action":false,"price_micros":0,"input_schema":null},{"name":"destroy_session","description":"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 meaningful over HTTP with a session handle configured.","write_action":true,"price_micros":0,"input_schema":null},{"name":"execute","description":"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 operation (-, +, &) call measure() to confirm it succeeded (check topology.faces). named_face(shape, n","write_action":true,"price_micros":0,"input_schema":null},{"name":"execute_file","description":"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_name to require/register a specific Shape or BuildPart variable. snapshot saves the promoted geometr","write_action":true,"price_micros":0,"input_schema":null},{"name":"export","description":"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 color/material) intended for slicers (Bambu Studio, PrusaSlicer, Orca) — use step for downstream CAD","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_bored_bosses","description":"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 extending a square/rounded-square boss with a central bore; it is read-only and diagnostic, not proof of the requested target.","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_bosses","description":"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}]}.","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_countersinks","description":"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 edge chamfers are excluded. Returns JSON: {count, countersinks: [{location (opening centre), axis (","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_hole_patterns","description":"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], center/diameter | pitch/direction}]}. Each hole belongs to at most one pattern; make_drawing already anno","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_holes","description":"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 direction, unit vector), location (opening point), diameter, depth (bore top to deep end; drill-point","write_action":false,"price_micros":0,"input_schema":null},{"name":"health_check","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"import_cad_file","description":"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 registers an aggregate under name plus each member as name_1, name_2, etc.; the result includes per-member t","write_action":false,"price_micros":0,"input_schema":null},{"name":"inspect_drawing","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"inspect_part","description":"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/spec; supported keys are bbox [x,y,z], solid_count, holes/bosses/patterns group lists, section_vary","write_action":false,"price_micros":0,"input_schema":null},{"name":"install_skill","description":"Copy a b123d workflow skill into the current project.","write_action":false,"price_micros":0,"input_schema":null},{"name":"last_error","description":"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 failed yet. Call this immediately after an execute() error to get the exact failing line — much fast","write_action":false,"price_micros":0,"input_schema":null},{"name":"lint_drawing","description":"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: [...]}.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_sessions","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"load_part","description":"Load a named part from the library into the session. name: part name from search_library. params: optional JSON object of parameter overrides e.g. '{\"od\": 8.0, \"length\": 20.0}' — unspecified params use their defaults. The part is registered as a named object and becomes current_shape.","write_action":false,"price_micros":0,"input_schema":null},{"name":"locate_gate_defects","description":"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_invalid_face (face index + center + BRepCheck status, e.g. an unorientable BSpline), open_edge / nonmanifo","write_action":false,"price_micros":0,"input_schema":null},{"name":"measure","description":"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 as Plane/Cylinder/Cone/Sphere/Torus/BSpline with area and type-specific params (e.g. cylinder diame","write_action":false,"price_micros":0,"input_schema":null},{"name":"prepare_drawing","description":"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, interpret lines, infer dimensions, or trace geometry. Use it once near the start instead of repeatedly w","write_action":false,"price_micros":0,"input_schema":null},{"name":"recognise_features","description":"Run the shared b123d-recognisers 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 inside execute() as recognition_faces(handle), or recognition_faces(handle, role='defining'),","write_action":true,"price_micros":0,"input_schema":null},{"name":"render_drawing","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"render_view","description":"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 automatically retries once as a coarse preview. azimuth/elevation apply after the preset. objects se","write_action":false,"price_micros":0,"input_schema":null},{"name":"repair_advice","description":"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_error() text as error_text, the intended edit as goal, and any extra notes from locate_gate_defects(","write_action":false,"price_micros":0,"input_schema":null},{"name":"repair_hints","description":"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 failures, and more. Pass the full error string from execute(), last_error(), validate(), or export().","write_action":false,"price_micros":0,"input_schema":null},{"name":"reset","description":"Clear the current session back to empty state, including all snapshots.","write_action":false,"price_micros":0,"input_schema":null},{"name":"resolve","description":"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(). Returns JSON: {label, ref, object, selector, type, geom_type, area/length, center}. center is the en","write_action":false,"price_micros":0,"input_schema":null},{"name":"restore_snapshot","description":"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. Raises an error if the snapshot name does not exist.","write_action":false,"price_micros":0,"input_schema":null},{"name":"save_drawing_annotations","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"save_snapshot","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"script","description":"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 exporting a reproducible script after an interactive session.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_library","description":"Search the part library. query: keywords matched against name, description, tags, category (empty returns all). Returns name, category, description, tags, and full parameter specs including types, defaults, and descriptions.","write_action":false,"price_micros":0,"input_schema":null},{"name":"session_state","description":"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 this to orient after a reset, restore, or multi-step build to confirm what geometry and variables are a","write_action":false,"price_micros":0,"input_schema":null},{"name":"suggest_view_layout","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"validate","description":"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 CAD scorers and downstream tools require: a well-formed (BRepCheck), watertight, manifold solid with non-zero volume. A FAIL means a STEP/STL export would be rejected outright (e.g. CADGenBench score","write_action":false,"price_micros":0,"input_schema":null},{"name":"version","description":"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 build is running — e.g. to check whether a feature or fix is present, or whether the client is talking t","write_action":false,"price_micros":0,"input_schema":null},{"name":"view_axes","description":"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 which world axis ends up on which page axis and with what sign — catches bottom-view/side-view axis swaps be","write_action":false,"price_micros":0,"input_schema":null},{"name":"workflow_hints","description":"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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"wrapper","description":"","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":85,"grade":"A","scanned_at":"2026-09-20T16:16:50.620Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T16:16:50.593Z","components":{"code":{"score":20,"max":25,"notes":["72 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 17 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"build123d_mcp-0.3.84/src/build123d_mcp/tools/resolve.py: …ed_builtins() try: result = eval(expression, namespace) # noqa: S307 …"}],"inputs":{"packages":[{"registryType":"pypi","identifier":"build123d-mcp","version":"0.3.84","found":true,"weeklyDownloads":738,"dependencyCount":12,"publishedAt":"2026-09-04T04:05:33.826828Z","repositoryUrl":"https://github.com/pzfreo/build123d-mcp"}],"repo":{"found":true,"owner":"pzfreo","repo":"build123d-mcp","archived":false,"pushedAt":"2026-09-04T04:05:49Z","stars":90,"forks":12,"openIssues":61,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/1773202?v=4","ownerCreatedAt":"2012-05-24T08:07:50Z","license":"Apache-2.0"},"icon":{"url":"https://avatars.githubusercontent.com/u/1773202?v=4&s=128","source":"github"},"presence":{"stars":90,"forks":12,"downloadsWeek":738,"license":"Apache-2.0","lastPushAt":"2026-09-04T04:05:49.000Z","score":48}}}},"grade_history":[],"reviews":[]}