MCP tools¶
The server exposes 26 tools. Each relays to the app's REST API, so they behave
like the equivalent action in the UI. All take a project_id. The payloads
execute_command accepts are in the command catalog.
One write path
execute_command is the only tool that changes a project. Everything else
is a read and is safe to call at any time.
The run_* and slice_* tools go through the app's job registry and poll until
the run finishes. They obey the one-expensive-job-per-project rule: if another
job holds the project they return {"error": ...} instead of queueing.
Catalog and execution¶
| Tool | Signature | Returns |
|---|---|---|
get_command_catalog |
() |
The command type / payload JSON schemas execute_command accepts. Versioned with the app, so it is the authority on what this deployment takes. |
execute_command |
(project_id, type, payload) |
Applies one command. status is accepted (with new_revision) or rejected (with a structured reason). project_id is filled in automatically; retries once on a stale revision. |
Inspect the model¶
| Tool | Signature | Returns |
|---|---|---|
get_model_tree |
(project_id) |
Parts, sketches, features and their rebuild statuses. |
get_assembly_overview |
(project_id, assembly_id=None) |
Per assembly: its parts (bounding box, feature/instance counts), sub-assembly occurrences with their placements, and composed bounding boxes. The first call to orient in a multi-part or nested project, before drilling into one part. |
get_motion_state |
(project_id, assembly_id) |
Every joint in an assembly: current position (angle in degrees, offset in mm, measured from where the joint was created) and its travel limits (null when unbounded). Read it back after assembly.joint.set_value to confirm the mechanism moved. |
get_diagnostics |
(project_id) |
Features in a non-ok rebuild state (failed, warning, unresolved_reference, stale) with structured diagnostics. |
get_topology |
(project_id, part_id) |
A part's faces (id, surface type, centroid, normal, area, bbox, cylinder info), edge count and bounding box. The starting point for finding geometry to edit. |
find_entities |
(project_id, part_id, entity, ...) |
Selects faces or edges by predicate (surface/curve type, normal axis, area/length/radius bounds, internal-cylinder, extreme position) instead of guessing indices. The best way to target a hole, top face or fillet edge. A filter belonging to the other entity type (cyl_internal on an edge query) is rejected rather than quietly matching nothing. |
get_sketch |
(project_id, part_id, sketch_id) |
A sketch's elements (type plus 2D params), its plane and constraint count. |
get_command_log |
(project_id, limit=20) |
Recent commands (type, actor, payload, status, new revision, rejection). Useful to see what just happened or to replay a command. |
list_parameters |
(project_id) |
Named parameters and their resolved values. |
get_screenshot |
(project_id, view="multiview", width=1024, height=768) |
Renders the model to a PNG. multiview is a 2x2 orthographic sheet (front, top, right, iso); pass a single view (front, back, top, bottom, left, right, iso) when that is enough. Use it to check proportions and that features landed where you meant. |
Resolve reference geometry¶
| Tool | Signature | Returns |
|---|---|---|
get_face_plane |
(project_id, part_id, face_id) |
A planar face's sketch plane {origin, normal, x_dir}, ready to pass as a plane_def. Errors for non-planar faces. |
get_face_axis |
(project_id, part_id, face_id) |
A cylindrical or conical face's axis {axis_origin, axis_dir, radius, internal, half_angle?}. internal: true is a hole. Use for concentric cuts, revolve, circular pattern or mirror. |
get_part_references |
(project_id, part_id) |
Inferred reference geometry: datum_planes, axes, holes (through or blind, with any counterbore/countersink step) and recognized fillets / chamfers. A starting point for remodeling imported STEP parts; empty for reference-only meshes. |
Measure and estimate¶
| Tool | Signature | Returns |
|---|---|---|
measure |
(project_id, part_id, kind, ...) |
volume returns volume, surface area and center of mass; distance the minimum distance between two entities; angle the angle between them. Entity ids come from get_topology. |
estimate_spacing |
(project_id, part_id, mode, ...) |
Size-aware pattern spacing so copies do not overlap. linear returns extent and suggested spacing, circular extent and suggested radius. Advisory. |
diff_parts |
(project_id, part_a_id, part_b_id) |
Geometric diff of two solids overlaid at their local origins: added_volume, removed_volume, common_volume, symmetric_difference_volume and match_ratio (1.0 = identical). Verifies a parametric remodel against an imported reference. Solids only. |
check_interference |
(project_id, assembly_id=None, part_ids=None) |
Body pairs tested where the assembly places them, each positioned through its occurrence chain, so a part used several times is checked at each position. Each pair is clash (with volume in mm³), touch, clear (with the gap in mm) or failed. Defaults to every root assembly. |
Simulation¶
| Tool | Signature | Returns |
|---|---|---|
list_stress_studies |
(project_id, part_id) |
The stress studies on a part (id, name, fixtures, loads). Call before running one. |
run_stress_study |
(project_id, part_id, study_id) |
Runs a linear-static study: max von Mises, max displacement, min safety factor and per-face max stress. Define the study first with simulation.create. |
list_flow_studies |
(project_id, part_id) |
The flow studies on a part (id, name, mode, fluid, domain, resolution). Define them with flow.create. |
run_flow_study |
(project_id, part_id, study_id) |
Runs a flow study and returns its scalars and diagnostics. Both modes give force_n and moment_n_mm; rotation adds flow_rate_mm3_s and torque_n_mm. Takes minutes (one to ten by resolution preset). It is a design-stage trend tool: a rotating body's torque holds its sign and order of magnitude under refinement, not its figure. |
See Materials and stress simulation for the workflow these mirror.
Fabrication¶
| Tool | Signature | Returns |
|---|---|---|
list_slice_setups |
(project_id, part_id) |
{printers, setups} for the project and part. Define them with slicer.printer.create and slicer.setup.create. Part-scoped; there is no assembly-level equivalent. |
slice_part |
(project_id, part_id, setup_id) |
Slices a part: stats (layer count, object height, estimated time, filament mm/g, per-role breakdowns), warnings and bed placement. Filament settings come from the part's material; without a printable one it slices as generic PLA and warns. The layer preview is omitted here. |