# Parametric Part Designer

## Links

- Product page URL: https://www.agentpmt.com/marketplace/parametric-part-designer
- Product markdown URL: https://www.agentpmt.com/marketplace/parametric-part-designer?format=agent-md
- Product JSON URL: https://www.agentpmt.com/marketplace/parametric-part-designer?format=agent-json

## Overview

- Product ID: 6ae3e6cf6b8e2f458be7d958
- Type: function
- Unit type: request
- Price: 500 credits
- Categories: Scientific Computing, Quality Assurance, Python Execution & Isolation, 3D Design & Modeling, 3D Printing / 3DMF, 3D Asset Creation
- Generated at: 2026-11-06T21:53:57.405Z

### Page Description

Design precise mechanical parts and assemblies from dimensions and editable scripts, all in one place. Start from built-in templates such as brackets, enclosures, flanges and spacers, write a parametric script, or import an existing STEP, BREP or DXF file. Every build comes back with validated measurements, a hole table, pass or fail results for the dimensions you expect, and preview images, so you can confirm the part is right before using it. Change any dimension to create a new revision while earlier versions stay available. Check clearance and interference between parts, mass and center of gravity, distances and cross sections, then export exact STEP and BREP for CAD, STL and 3MF for 3D printing, GLB and glTF for viewers, and DXF or SVG drawings.

### Agent Description

Build exact CAD parts from CadQuery scripts or templates and get measurements, hole tables, dimension checks and preview images in one call. Revise by parameter name, measure clearance, mass and sections, render views, and export STEP, STL, 3MF, GLB, DXF and more.

## Details

### Details

Design precise mechanical parts and assemblies from dimensions and editable scripts, all in one place. Start from built-in templates such as brackets, enclosures, flanges and spacers, write a parametric script, or import an existing STEP, BREP or DXF file. Every build comes back with validated measurements, a hole table, pass or fail results for the dimensions you expect, and preview images, so you can confirm the part is right before using it. Change any dimension to create a new revision while earlier versions stay available. Check clearance and interference between parts, mass and center of gravity, distances and cross sections, then export exact STEP and BREP for CAD, STL and 3MF for 3D printing, GLB and glTF for viewers, and DXF or SVG drawings.

### Actions

- `list_templates`: List the built-in part templates with every parameter, its default, unit and allowed range. Free.
- `build_part` (5 credits): Build a new part from CadQuery Python or a built-in template. Returns validated measurements, a hole table, check results, preview images and the requested files in one response. Script errors return the failing line and a specific fix.
- `import_part` (5 credits): Import a STEP, BREP or DXF file as a new part to measure, render, export or modify with a script. STEP assemblies keep body names and colors; DXF files become flat profiles.
- `revise_part` (5 credits): Create a new revision by changing parameters, replacing the script, or both. Earlier revisions stay unchanged. Returns measurements, checks, previews and the changes from the base revision.
- `measure_part` (2 credits): Measure a part precisely: size and mass properties, hole table, clearance or interference between bodies, distances between features, and cross sections.
- `render_part` (2 credits): Render PNG images of a part: shaded views, line drawings with hidden edges, a section view or a custom camera direction.
- `export_part` (3 credits): Export a part revision with explicit mesh accuracy. Mesh files report triangle count and watertightness. dxf is the cross section at section_offset along the projection axis; svg is a line drawing of the projection view.
- `get_part`: Get a part with its revision history, script, parameter values, latest measurements and files. Free.
- `list_parts`: List your parts, newest first. Free.
- `get_task`: Check work that returned status processing. Completed tasks return the original action result in outputs[0]. Free.
- `cancel_task`: Cancel work that is still processing. Free.

### Use Cases

Design a mounting bracket to exact dimensions, Create a 3D printable enclosure with a lid, Check that two parts do not interfere, Convert a DXF profile into a solid part, Export STEP and STL files for manufacturing, Iterate a part by changing parameters, Measure mass and center of gravity of a design

### Workflows Using This Tool

#### Engineering Drawings to Verified STEP Models

Converts a package of 2D engineering drawings into dimensionally verified STEP models with a full audit trail. For each sheet the agent inventories the title block, builds a provenance-tracked dimension table (every value labeled, measured, computed or flagged as an assumption), hand-computes acceptance values (bounding box, volume, cross-section areas) from the drawing arithmetic BEFORE modeling, then builds a parametric CadQuery model in the Parametric Part Designer with live dimension checks, reconciles every check, verifies the solid independently with face distances, mass properties and sections, renders line drawings with hidden edges to lay over the source sheet, and writes a per-part tolerance record with acceptance bands under the sheet's general tolerance standard (e.g. ISO 2768-m). Finishes with a package report and a human review gate for the open engineering questions. Deliverables per part: exact B-rep STEP, watertight STL, screenshots, the parametric script and the verification evidence.

- Page URL: https://www.agentpmt.com/agent-workflow-skills/engineering-drawings-to-verified-step-models
- Markdown URL: https://www.agentpmt.com/agent-workflow-skills/engineering-drawings-to-verified-step-models?format=agent-md
- Published: 2026-11-01T04:41:55.506Z

### Related Content

No related content is currently linked to this product.

## Documentation

No platform documentation is currently linked to this product.

## Integration Details

### DynamicMCP

- Setup page URL: https://www.agentpmt.com/dynamic-mcp
- Claude setup guide: https://www.agentpmt.com/dynamic-mcp#platform=claude
- ChatGPT setup guide: https://www.agentpmt.com/dynamic-mcp#platform=chatgpt
- Cursor setup guide: https://www.agentpmt.com/dynamic-mcp#platform=cursor
- Windsurf setup guide: https://www.agentpmt.com/dynamic-mcp#platform=windsurf

Use the local router for command-based MCP clients. It forwards requests to `https://api.agentpmt.com/mcp` and does not execute tools locally.

```bash
npm install -g @agentpmt/mcp-router
agentpmt-setup
```

### REST API

The live page renders cURL, Python, JavaScript, and Node.js examples. Logged-in users see those examples prefilled with their own API and budget credentials.

- Purchase endpoint: https://api.agentpmt.com/products/purchase
- Authorization format: `Bearer <base64(apiKey:budgetKey)>`

```bash
curl -X POST "https://api.agentpmt.com/products/purchase" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eW91ci1hcGkta2V5LWhlcmU6eW91ci1idWRnZXQta2V5LWhlcmU=" \
  -d '{
    "product_id": "6ae3e6cf6b8e2f458be7d958",
    "parameters": {
      "action": "list_templates"
    }
  }'
```

### Autonomous Agents

Autonomous agents can access this tool through AgentAddress credit balances or direct x402 payments. Use the Autonomous Agent API reference for endpoint shapes after choosing the access pattern below.

- Autonomous Agent API reference URL: https://www.agentpmt.com/docs/api-reference/autonomous-agents
- Autonomous Agent API reference markdown URL: https://www.agentpmt.com/docs/api-reference/autonomous-agents?format=agent-md
- Credit-Based Access Using AgentAddress: https://www.agentpmt.com/docs/autonomous-agents/credit-based-tool-usage-with-agentaddress
- AgentAddress is preferred for persistent file access, stored platform state, and maximum tool use ability across repeated calls.
- Direct x402 is for independent one-off tool calls that do not require shared files or stored platform state.
- Direct x402 public payments: USDC on Base, Arbitrum, Optimism, Polygon, and Avalanche.

### Schema

#### Parameters

- Schema type: actions

```json
{
  "actions": {
    "list_templates": {
      "description": "List the built-in part templates with every parameter, its default, unit and allowed range. Free.",
      "properties": {
        "template_id": {
          "type": "string",
          "description": "Return only this template, including its full script.",
          "required": false,
          "enum": [
            "mounting_plate",
            "l_bracket",
            "u_bracket",
            "enclosure",
            "enclosure_lid",
            "spacer",
            "standoff",
            "flange",
            "shaft_collar",
            "pipe_clamp",
            "knob",
            "cable_clip"
          ]
        }
      },
      "price_per_unit": 0
    },
    "build_part": {
      "description": "Build a new part from CadQuery Python or a built-in template. Returns validated measurements, a hole table, check results, preview images and the requested files in one response. Script errors return the failing line and a specific fix.",
      "properties": {
        "script": {
          "type": "string",
          "description": "CadQuery Python; cq is preloaded. Publish with show_object(shape, name='body') or assign the final shape to result. Top-level number, string and boolean assignments become parameters. Several show_object calls or a cq.Assembly make a multi-body part. Give script or template_id.",
          "required": false
        },
        "template_id": {
          "type": "string",
          "description": "Built-in template to build. Give script or template_id.",
          "required": false,
          "enum": [
            "mounting_plate",
            "l_bracket",
            "u_bracket",
            "enclosure",
            "enclosure_lid",
            "spacer",
            "standoff",
            "flange",
            "shaft_collar",
            "pipe_clamp",
            "knob",
            "cable_clip"
          ]
        },
        "parameters": {
          "type": "array",
          "description": "Parameter overrides by name. Names must match top-level assignments in the script or template; unknown names are rejected with the valid names. Set exactly one of value, text or flag.",
          "required": false,
          "items": {
            "type": "object",
            "description": "One parameter override",
            "properties": {
              "name": {
                "type": "string",
                "description": "Parameter name as assigned in the script, e.g. thickness.",
                "required": true,
                "maxLength": 100
              },
              "value": {
                "type": "number",
                "description": "Numeric value: lengths in the part units, angles in degrees.",
                "required": false
              },
              "text": {
                "type": "string",
                "description": "String value, e.g. label text.",
                "required": false,
                "maxLength": 200
              },
              "flag": {
                "type": "boolean",
                "description": "Boolean value.",
                "required": false
              }
            },
            "required": false
          },
          "maxItems": 100
        },
        "units": {
          "type": "string",
          "description": "Units for all lengths in the script, parameters, checks and results. Default mm.",
          "required": false,
          "enum": [
            "mm",
            "cm",
            "m",
            "in"
          ]
        },
        "checks": {
          "type": "array",
          "description": "Expected results to verify after building; each returns passed true or false with the measured value. hole_diameter passes when at least one hole has that diameter.",
          "required": false,
          "items": {
            "type": "object",
            "description": "One expected result",
            "properties": {
              "quantity": {
                "type": "string",
                "description": "What to measure.",
                "required": true,
                "enum": [
                  "size_x",
                  "size_y",
                  "size_z",
                  "volume",
                  "surface_area",
                  "solid_count",
                  "hole_count",
                  "hole_diameter",
                  "center_of_mass_x",
                  "center_of_mass_y",
                  "center_of_mass_z",
                  "is_valid"
                ]
              },
              "expected": {
                "type": "number",
                "description": "Expected value in the part units; 1 means true for is_valid.",
                "required": true
              },
              "tolerance": {
                "type": "number",
                "description": "Allowed difference. Default 0.01 in part units, 0 for counts.",
                "required": false,
                "minimum": 0
              },
              "body": {
                "type": "string",
                "description": "Body name to check. Default: the whole part.",
                "required": false,
                "maxLength": 100
              }
            },
            "required": false
          },
          "maxItems": 50
        },
        "export_formats": {
          "type": "array",
          "description": "Files to produce. Default step and stl.",
          "required": false,
          "items": {
            "type": "string",
            "description": "Format",
            "required": false,
            "enum": [
              "step",
              "stl",
              "3mf",
              "glb",
              "gltf",
              "brep",
              "amf",
              "vrml",
              "vtp",
              "dxf",
              "svg"
            ]
          },
          "maxItems": 11
        },
        "views": {
          "type": "array",
          "description": "Preview images to return. Default iso, top and front.",
          "required": false,
          "items": {
            "type": "string",
            "description": "View",
            "required": false,
            "enum": [
              "iso",
              "top",
              "bottom",
              "front",
              "back",
              "left",
              "right"
            ]
          },
          "maxItems": 7
        },
        "name": {
          "type": "string",
          "description": "Readable part name used in file names.",
          "required": false
        }
      },
      "price_per_unit": 5
    },
    "import_part": {
      "description": "Import a STEP, BREP or DXF file as a new part to measure, render, export or modify with a script. STEP assemblies keep body names and colors; DXF files become flat profiles.",
      "properties": {
        "file_id": {
          "type": "string",
          "description": "File Manager ID of a .step, .stp, .brep or .dxf file.",
          "required": true
        },
        "units": {
          "type": "string",
          "description": "Units of the file. STEP declares its own; needed for BREP and DXF. Default mm.",
          "required": false,
          "enum": [
            "mm",
            "cm",
            "m",
            "in"
          ]
        },
        "checks": {
          "type": "array",
          "description": "Expected results to verify after building; each returns passed true or false with the measured value. hole_diameter passes when at least one hole has that diameter.",
          "required": false,
          "items": {
            "type": "object",
            "description": "One expected result",
            "properties": {
              "quantity": {
                "type": "string",
                "description": "What to measure.",
                "required": true,
                "enum": [
                  "size_x",
                  "size_y",
                  "size_z",
                  "volume",
                  "surface_area",
                  "solid_count",
                  "hole_count",
                  "hole_diameter",
                  "center_of_mass_x",
                  "center_of_mass_y",
                  "center_of_mass_z",
                  "is_valid"
                ]
              },
              "expected": {
                "type": "number",
                "description": "Expected value in the part units; 1 means true for is_valid.",
                "required": true
              },
              "tolerance": {
                "type": "number",
                "description": "Allowed difference. Default 0.01 in part units, 0 for counts.",
                "required": false,
                "minimum": 0
              },
              "body": {
                "type": "string",
                "description": "Body name to check. Default: the whole part.",
                "required": false,
                "maxLength": 100
              }
            },
            "required": false
          },
          "maxItems": 50
        },
        "export_formats": {
          "type": "array",
          "description": "Files to produce. Default step and stl.",
          "required": false,
          "items": {
            "type": "string",
            "description": "Format",
            "required": false,
            "enum": [
              "step",
              "stl",
              "3mf",
              "glb",
              "gltf",
              "brep",
              "amf",
              "vrml",
              "vtp",
              "dxf",
              "svg"
            ]
          },
          "maxItems": 11
        },
        "views": {
          "type": "array",
          "description": "Preview images to return. Default iso, top and front.",
          "required": false,
          "items": {
            "type": "string",
            "description": "View",
            "required": false,
            "enum": [
              "iso",
              "top",
              "bottom",
              "front",
              "back",
              "left",
              "right"
            ]
          },
          "maxItems": 7
        },
        "name": {
          "type": "string",
          "description": "Readable part name used in file names.",
          "required": false
        }
      },
      "price_per_unit": 5
    },
    "revise_part": {
      "description": "Create a new revision by changing parameters, replacing the script, or both. Earlier revisions stay unchanged. Returns measurements, checks, previews and the changes from the base revision.",
      "properties": {
        "part_id": {
          "type": "string",
          "description": "Part identifier returned by build_part or import_part.",
          "required": true
        },
        "base_revision": {
          "type": "integer",
          "description": "Revision to start from. Default: the latest.",
          "required": false,
          "minimum": 1
        },
        "parameters": {
          "type": "array",
          "description": "Parameter overrides by name. Names must match top-level assignments in the script or template; unknown names are rejected with the valid names. Set exactly one of value, text or flag.",
          "required": false,
          "items": {
            "type": "object",
            "description": "One parameter override",
            "properties": {
              "name": {
                "type": "string",
                "description": "Parameter name as assigned in the script, e.g. thickness.",
                "required": true,
                "maxLength": 100
              },
              "value": {
                "type": "number",
                "description": "Numeric value: lengths in the part units, angles in degrees.",
                "required": false
              },
              "text": {
                "type": "string",
                "description": "String value, e.g. label text.",
                "required": false,
                "maxLength": 200
              },
              "flag": {
                "type": "boolean",
                "description": "Boolean value.",
                "required": false
              }
            },
            "required": false
          },
          "maxItems": 100
        },
        "script": {
          "type": "string",
          "description": "Full replacement script. For imported parts the variable imported holds the imported shape (flat DXF profiles are ready to extrude, e.g. result = imported.extrude(5)). Omit to keep the base script.",
          "required": false
        },
        "checks": {
          "type": "array",
          "description": "Expected results to verify after building; each returns passed true or false with the measured value. hole_diameter passes when at least one hole has that diameter.",
          "required": false,
          "items": {
            "type": "object",
            "description": "One expected result",
            "properties": {
              "quantity": {
                "type": "string",
                "description": "What to measure.",
                "required": true,
                "enum": [
                  "size_x",
                  "size_y",
                  "size_z",
                  "volume",
                  "surface_area",
                  "solid_count",
                  "hole_count",
                  "hole_diameter",
                  "center_of_mass_x",
                  "center_of_mass_y",
                  "center_of_mass_z",
                  "is_valid"
                ]
              },
              "expected": {
                "type": "number",
                "description": "Expected value in the part units; 1 means true for is_valid.",
                "required": true
              },
              "tolerance": {
                "type": "number",
                "description": "Allowed difference. Default 0.01 in part units, 0 for counts.",
                "required": false,
                "minimum": 0
              },
              "body": {
                "type": "string",
                "description": "Body name to check. Default: the whole part.",
                "required": false,
                "maxLength": 100
              }
            },
            "required": false
          },
          "maxItems": 50
        },
        "export_formats": {
          "type": "array",
          "description": "Files to produce. Default step and stl.",
          "required": false,
          "items": {
            "type": "string",
            "description": "Format",
            "required": false,
            "enum": [
              "step",
              "stl",
              "3mf",
              "glb",
              "gltf",
              "brep",
              "amf",
              "vrml",
              "vtp",
              "dxf",
              "svg"
            ]
          },
          "maxItems": 11
        },
        "views": {
          "type": "array",
          "description": "Preview images to return. Default iso, top and front.",
          "required": false,
          "items": {
            "type": "string",
            "description": "View",
            "required": false,
            "enum": [
              "iso",
              "top",
              "bottom",
              "front",
              "back",
              "left",
              "right"
            ]
          },
          "maxItems": 7
        }
      },
      "price_per_unit": 5
    },
    "measure_part": {
      "description": "Measure a part precisely: size and mass properties, hole table, clearance or interference between bodies, distances between features, and cross sections.",
      "properties": {
        "part_id": {
          "type": "string",
          "description": "Part identifier returned by build_part or import_part.",
          "required": true
        },
        "revision": {
          "type": "integer",
          "description": "Revision number. Default: the latest revision.",
          "required": false,
          "minimum": 1
        },
        "measurements": {
          "type": "array",
          "description": "Measurements to take. Default overview.",
          "required": false,
          "items": {
            "type": "object",
            "description": "One measurement",
            "properties": {
              "kind": {
                "type": "string",
                "description": "overview: size, volume, area, center of mass, validity per body. mass_properties: mass and inertia from density. holes: diameter, depth, axis, position, through and counterbores. clearance: interfering, touching or clear with overlap volume and minimum gap for body_a and body_b, or every pair when both are omitted. distance: minimum distance between selector_a and selector_b. section: area, perimeter and an outline SVG where a plane cuts the part.",
                "required": true,
                "enum": [
                  "overview",
                  "mass_properties",
                  "holes",
                  "clearance",
                  "distance",
                  "section"
                ]
              },
              "body_a": {
                "type": "string",
                "description": "First body name (also limits holes and mass_properties to that body).",
                "required": false,
                "maxLength": 100
              },
              "body_b": {
                "type": "string",
                "description": "Second body name for clearance.",
                "required": false,
                "maxLength": 100
              },
              "selector_a": {
                "type": "string",
                "description": "CadQuery selector for the first feature, e.g. >Z for the top face.",
                "required": false,
                "maxLength": 200
              },
              "selector_b": {
                "type": "string",
                "description": "CadQuery selector for the second feature, e.g. <Z.",
                "required": false,
                "maxLength": 200
              },
              "target": {
                "type": "string",
                "description": "What the selectors pick. Default faces.",
                "required": false,
                "enum": [
                  "faces",
                  "edges",
                  "vertices",
                  "solids"
                ]
              },
              "plane": {
                "type": "string",
                "description": "Section plane normal axis. Default Z.",
                "required": false,
                "enum": [
                  "X",
                  "Y",
                  "Z"
                ]
              },
              "offset": {
                "type": "number",
                "description": "Section position along the axis in part units. Default: the part's middle.",
                "required": false
              },
              "density": {
                "type": "number",
                "description": "Density in g/cm3 for mass_properties. Default 1.",
                "required": false,
                "minimum": 0
              }
            },
            "required": false
          },
          "maxItems": 20
        }
      },
      "price_per_unit": 2
    },
    "render_part": {
      "description": "Render PNG images of a part: shaded views, line drawings with hidden edges, a section view or a custom camera direction.",
      "properties": {
        "part_id": {
          "type": "string",
          "description": "Part identifier returned by build_part or import_part.",
          "required": true
        },
        "revision": {
          "type": "integer",
          "description": "Revision number. Default: the latest revision.",
          "required": false,
          "minimum": 1
        },
        "views": {
          "type": "array",
          "description": "Views to render. Default iso.",
          "required": false,
          "items": {
            "type": "string",
            "description": "View",
            "required": false,
            "enum": [
              "iso",
              "top",
              "bottom",
              "front",
              "back",
              "left",
              "right"
            ]
          },
          "maxItems": 7
        },
        "direction": {
          "type": "array",
          "description": "Custom view direction from the part toward the camera, e.g. [1, -1, 1].",
          "required": false,
          "items": {
            "type": "number",
            "description": "Component",
            "required": false
          },
          "minItems": 3,
          "maxItems": 3
        },
        "style": {
          "type": "string",
          "description": "shaded or lines (engineering line drawing). Default shaded.",
          "required": false,
          "enum": [
            "shaded",
            "lines"
          ]
        },
        "show_hidden_edges": {
          "type": "boolean",
          "description": "Draw hidden edges dashed in the lines style. Default false.",
          "required": false
        },
        "section_plane": {
          "type": "string",
          "description": "Cut the part along this axis before rendering.",
          "required": false,
          "enum": [
            "X",
            "Y",
            "Z"
          ]
        },
        "section_offset": {
          "type": "number",
          "description": "Section position along section_plane in part units. Default: the middle.",
          "required": false
        },
        "highlight_bodies": {
          "type": "array",
          "description": "Body names drawn in an accent color.",
          "required": false,
          "items": {
            "type": "string",
            "description": "Body name",
            "required": false,
            "maxLength": 100
          },
          "maxItems": 50
        },
        "width_px": {
          "type": "integer",
          "description": "Image width. Default 1024.",
          "required": false,
          "minimum": 256,
          "maximum": 2048
        },
        "height_px": {
          "type": "integer",
          "description": "Image height. Default 768.",
          "required": false,
          "minimum": 256,
          "maximum": 2048
        }
      },
      "price_per_unit": 2
    },
    "export_part": {
      "description": "Export a part revision with explicit mesh accuracy. Mesh files report triangle count and watertightness. dxf is the cross section at section_offset along the projection axis; svg is a line drawing of the projection view.",
      "properties": {
        "part_id": {
          "type": "string",
          "description": "Part identifier returned by build_part or import_part.",
          "required": true
        },
        "revision": {
          "type": "integer",
          "description": "Revision number. Default: the latest revision.",
          "required": false,
          "minimum": 1
        },
        "formats": {
          "type": "array",
          "description": "Formats to export.",
          "required": true,
          "items": {
            "type": "string",
            "description": "Format",
            "required": false,
            "enum": [
              "step",
              "stl",
              "3mf",
              "glb",
              "gltf",
              "brep",
              "amf",
              "vrml",
              "vtp",
              "dxf",
              "svg"
            ]
          },
          "minItems": 1,
          "maxItems": 11
        },
        "bodies": {
          "type": "array",
          "description": "Body names to include. Default: all bodies.",
          "required": false,
          "items": {
            "type": "string",
            "description": "Body name",
            "required": false,
            "maxLength": 100
          },
          "maxItems": 100
        },
        "linear_tolerance": {
          "type": "number",
          "description": "Maximum mesh deviation from the true surface in part units. Default 1 percent of the part size, at most 0.1 mm.",
          "required": false,
          "minimum": 0.0001
        },
        "angular_tolerance_deg": {
          "type": "number",
          "description": "Maximum angle between adjacent mesh facets in degrees. Default 5.",
          "required": false,
          "minimum": 0.5,
          "maximum": 45
        },
        "projection": {
          "type": "string",
          "description": "View for svg and section axis for dxf. Default top.",
          "required": false,
          "enum": [
            "iso",
            "top",
            "bottom",
            "front",
            "back",
            "left",
            "right"
          ]
        },
        "section_offset": {
          "type": "number",
          "description": "dxf section position along the projection axis in part units. Default: the middle.",
          "required": false
        },
        "filename": {
          "type": "string",
          "description": "Base file name without folder or extension.",
          "required": false
        }
      },
      "price_per_unit": 3
    },
    "get_part": {
      "description": "Get a part with its revision history, script, parameter values, latest measurements and files. Free.",
      "properties": {
        "part_id": {
          "type": "string",
          "description": "Part identifier returned by build_part or import_part.",
          "required": true
        },
        "revision": {
          "type": "integer",
          "description": "Revision number. Default: the latest revision.",
          "required": false,
          "minimum": 1
        }
      },
      "price_per_unit": 0
    },
    "list_parts": {
      "description": "List your parts, newest first. Free.",
      "properties": {
        "cursor": {
          "type": "string",
          "description": "next_cursor from the previous response.",
          "required": false
        },
        "limit": {
          "type": "integer",
          "description": "Maximum results. Default 20.",
          "required": false,
          "minimum": 1,
          "maximum": 100
        }
      },
      "price_per_unit": 0
    },
    "get_task": {
      "description": "Check work that returned status processing. Completed tasks return the original action result in outputs[0]. Free.",
      "properties": {
        "task_id": {
          "type": "string",
          "description": "task_id from a processing response.",
          "required": true
        },
        "wait_seconds": {
          "type": "integer",
          "description": "Seconds to wait for completion (0-55); use 55 when polling. Default 0.",
          "required": false,
          "minimum": 0,
          "maximum": 55
        }
      },
      "price_per_unit": 0
    },
    "cancel_task": {
      "description": "Cancel work that is still processing. Free.",
      "properties": {
        "task_id": {
          "type": "string",
          "description": "task_id from a processing response.",
          "required": true
        }
      },
      "price_per_unit": 0
    }
  }
}
```

### Usage Instructions

# Parametric Part Designer

Build exact CAD parts from CadQuery Python or built-in templates; every build returns validated measurements, a hole table, your dimension checks, preview images and files.

## Workflow

1. `build_part` with a `script` or `template_id`, plus `checks` for the dimensions you expect.
2. Read `checks.all_passed` and look at `previews`. If something is off, `revise_part` by parameter name.
3. `measure_part`, `render_part` and `export_part` work on any revision.

Any action that runs the geometry engine returns its result directly when it finishes within about 20 seconds. Longer work returns `status: "processing"` with a `task_id`; call `get_task` with `wait_seconds: 55` until `completed` (the result is in `outputs[0]`) or `failed`. Tasks are saved before work starts, so they survive server restarts (an interrupted job restarts automatically from the beginning) and wait in a queue when every engine is busy; you never need to resubmit a processing task.

## Writing scripts

- `cq` (CadQuery) is preloaded. Publish shapes with `show_object(shape, name="body")`; several calls make a multi-body part, and a `cq.Assembly` keeps its child names and constraints. If you never call `show_object`, a variable named `result`, `part`, `assembly` or `model` is published.
- Top-level assignments of a number, string or boolean (`thickness = 5.0`) become parameters you can change later with `revise_part`.
- All lengths are in the part `units` (default `mm`); angles are degrees.
- Booleans: if a union or cut reports `CAD_INVALID_GEOMETRY`, add `clean=False`, e.g. `a.union(b, clean=False)`.
- Select by geometry, not index; face and edge order changes between revisions.

Selectors: `>Z` / `<X` farthest along an axis, `|Z` parallel to Z, `#Z` perpendicular, `+Z` / `-Z` normal direction, `%PLANE` `%CYLINDER` `%LINE` `%CIRCLE` by type, `>Z[1]` second farthest, combine with `and`, `or`, `not`. Examples: `faces(">Z")`, `edges("|Z")`, `edges(">Z and |X")`.

## Actions

### `get_instructions`
Returns this documentation.

### `list_templates`
Optional: `template_id` (returns its full script). Templates: mounting_plate, l_bracket, u_bracket, enclosure, enclosure_lid, spacer, standoff, flange, shaft_collar, pipe_clamp, knob, cable_clip. Defaults and ranges are in mm and convert to other units.

`{"action":"list_templates"}`

### `build_part`
Required: `script` (string) or `template_id`. Optional: `parameters` (array of `{name, value|text|flag}`), `units` (mm, cm, m, in; default mm), `checks` (array of `{quantity, expected, tolerance, body}`), `export_formats` (default step and stl), `views` (default iso, top, front), `name`.

Check quantities: size_x, size_y, size_z, volume, surface_area, solid_count, hole_count, hole_diameter (passes if any hole matches), center_of_mass_x/y/z, is_valid (1 or 0). Default tolerance 0.01 part units, 0 for counts.

`{"action":"build_part","template_id":"mounting_plate","parameters":[{"name":"thickness","value":8}],"checks":[{"quantity":"size_z","expected":8},{"quantity":"hole_count","expected":4}]}`

`{"action":"build_part","script":"width = 40.0\nplate = cq.Workplane('XY').box(width, 30, 5).faces('>Z').workplane().hole(6)\nshow_object(plate, name='plate')","checks":[{"quantity":"hole_diameter","expected":6}],"export_formats":["step","stl","3mf"]}`

Multi-body example: `{"action":"build_part","script":"base = cq.Workplane('XY').box(50, 30, 20).faces('>Z').shell(-2)\nlid = cq.Workplane('XY').box(50, 30, 2).translate((0, 0, 11))\nshow_object(base, name='base')\nshow_object(lid, name='lid')"}`

### `import_part`
Required: `file_id` (.step, .stp, .brep or .dxf). Optional: `units` (needed for BREP and DXF; STEP declares its own), `checks`, `export_formats`, `views`, `name`. STEP assemblies keep body names and colors; DXF becomes a flat profile.

`{"action":"import_part","file_id":"FILE_ID","checks":[{"quantity":"is_valid","expected":1}]}`

### `revise_part`
Required: `part_id`, plus `parameters`, `script`, or both. Optional: `base_revision` (default latest), `checks`, `export_formats`, `views`. Parameter changes merge with the base revision's values (other values, in any units, are kept). Every revision gets its own number, even when several run at once. For imported parts send a `script` that uses the variable `imported` (flat DXF profiles extrude directly). The response includes `changes` from the base revision.

`{"action":"revise_part","part_id":"PART_ID","parameters":[{"name":"thickness","value":6}],"checks":[{"quantity":"size_z","expected":6}]}`

`{"action":"revise_part","part_id":"PART_ID","script":"result = imported.extrude(5)"}`

### `measure_part`
Required: `part_id`. Optional: `revision`, `measurements` (default overview). Kinds: overview, mass_properties (`density` g/cm3), holes, clearance (`body_a` and `body_b`, or all pairs), distance (`selector_a`, `selector_b`, `target` faces/edges/vertices/solids), section (`plane` X/Y/Z, `offset`; returns area, perimeter and an outline SVG).

`{"action":"measure_part","part_id":"PART_ID","measurements":[{"kind":"clearance","body_a":"base","body_b":"lid"},{"kind":"mass_properties","density":1.24}]}`

`{"action":"measure_part","part_id":"PART_ID","measurements":[{"kind":"distance","selector_a":">Z","selector_b":"<Z"}]}`

### `render_part`
Required: `part_id`. Optional: `revision`, `views` (default iso), `direction` ([x, y, z] toward the camera), `style` (shaded or lines), `show_hidden_edges`, `section_plane` and `section_offset`, `highlight_bodies`, `width_px`, `height_px`.

`{"action":"render_part","part_id":"PART_ID","views":["front","right"],"style":"lines","show_hidden_edges":true}`

### `export_part`
Required: `part_id`, `formats` (step, stl, 3mf, glb, gltf, brep, amf, vrml, vtp, dxf, svg). Optional: `revision`, `bodies`, `linear_tolerance` (part units), `angular_tolerance_deg`, `projection` (svg view, dxf section axis), `section_offset`, `filename`.

Units: step declares the part units; 3mf and amf are millimeters; glb and gltf are meters; stl, brep, vrml, vtp, dxf and svg are in the part units. Mesh files report `triangle_count` and `watertight`.

`{"action":"export_part","part_id":"PART_ID","formats":["step","stl"],"linear_tolerance":0.02}`

### `get_part`
Required: `part_id`. Optional: `revision`. Returns the revision list and the chosen revision's script, parameters, measurements and files.

`{"action":"get_part","part_id":"PART_ID"}`

### `list_parts`
Optional: `cursor` (from `next_cursor`), `limit` (1-100, default 20).

`{"action":"list_parts","limit":20}`

### `get_task`
Required: `task_id`. Optional: `wait_seconds` (0-55; returns as soon as the task finishes). `stage` shows progress: queued, loading, the running operation, saving. `restarts` appears if the job was interrupted and restarted.

`{"action":"get_task","task_id":"TASK_ID","wait_seconds":55}`

### `cancel_task`
Required: `task_id`. Stops a queued or running job; returns `cancelled: true` once it has stopped. A job that is already saving its results completes instead (`cancelled: false`). A cancelled job creates nothing.

`{"action":"cancel_task","task_id":"TASK_ID"}`

## Response

Build, import and revise return `part_id`, `revision`, `units`, `overview` (size, min, max, volume, per-body details, `all_valid`), `holes` (diameter, depth, through, kind, axis, start, end, stack), `checks` (`all_passed` and each result with `measured` and `difference`), `parameters` (name, kind, default, value), `previews` and `files` (each with `file_id` and `signed_url`), and `warnings`. Generated files are kept for 7 days.

## Errors

Script and geometry errors include a fix, and `error_details` with the failing `line` and `source_line` (or `valid_parameters`): CAD_SCRIPT_ERROR, CAD_NO_OUTPUT, CAD_FEATURE_FAILED (fillet, shell, boolean and similar), CAD_SELECTOR_INVALID, CAD_SELECTOR_EMPTY, CAD_UNKNOWN_PARAMETER (lists valid names), CAD_INVALID_PARAMETER, CAD_INVALID_GEOMETRY, CAD_IMPORT_FAILED, CAD_BODY_NOT_FOUND, CAD_MEASUREMENT_FAILED, CAD_EMPTY_RESULT. Tool errors: PART_DESIGNER_PART_NOT_FOUND, PART_DESIGNER_REVISION_NOT_FOUND, PART_DESIGNER_INVALID_PARAMETER, PART_DESIGNER_UNSUPPORTED_FILE, PART_DESIGNER_SCRIPT_REQUIRED, PART_DESIGNER_PART_EXPIRED. Limits: GEOMETRY_TIMEOUT, GEOMETRY_MEMORY_LIMIT, GEOMETRY_ENGINE_CRASH, GEOMETRY_INPUT_TOO_LARGE, GEOMETRY_INPUT_EXPIRED, GEOMETRY_WORKER_BUSY, GEOMETRY_WORKER_UNAVAILABLE. Tasks: GEOMETRY_TASK_NOT_FOUND, GEOMETRY_TASK_INTERRUPTED (restarted three times without finishing; run the action again).

### Frequently Asked Questions

#### How do I connect this tool to an external agent?

- Page URL: https://www.agentpmt.com/faq
- Markdown URL: https://www.agentpmt.com/faq?format=agent-md

You can install the local MCP server by opening a terminal and running:

```
npm install -g @agentpmt/mcp-router
agentpmt-setup
```

This will connect you to local agents like Claude Code, Windsurf, Grok Build, Cursor, etc.

Alternatively you can connect to the hosted version with this config block, no installation required:

```
{
  "mcpServers": {
    "agentpmt": {
      "type": "streamable-http",
      "url": "https://api.agentpmt.com/mcp",
      "headers": {
        "Authorization": "Bearer <AGENTPMT_BEARER_TOKEN>",
        "x-instance-metadata": "{\"client\":\"generic-mcp\",\"platform\":\"remote\"}"
      }
    }
  }
}
```

[View MCP Connection Instructions](/docs/mcp-reference/connection) for more details.

#### How does an external agent use this tool?

- Page URL: https://www.agentpmt.com/faq
- Markdown URL: https://www.agentpmt.com/faq?format=agent-md

After the external agent is connected to an Agent Group that can use this tool, paste this prompt into the agent:

> Use the AgentPMT-Tool-Search-and-Execution tool. First call action 'get\_instructions' so you know how to use the tool search interface. Then call action 'get\_schema' with tool\_id 6ae3e6cf6b8e2f458be7d958 ("Parametric Part Designer"). After reading the schema and any returned instructions, tell me what this tool can do, we are going to be using it

The agent should fetch the tool schema first, collect the required parameters for your request, and then call the tool through AgentPMT.

#### Can I change a part after it is built?

- Page URL: https://www.agentpmt.com/faq#faq-6ae5e8ddb3f999e1dff5a27b
- Markdown URL: https://www.agentpmt.com/faq?format=agent-md#faq-6ae5e8ddb3f999e1dff5a27b
- Tags: Product Specific

Yes. revise\_part changes any parameter by name or replaces the script and creates a new numbered revision that reports what changed. Earlier revisions stay available for measuring, rendering and exporting.

#### Can it check that parts fit together?

- Page URL: https://www.agentpmt.com/faq#faq-6ae5e8ddb3f999e1dff5a27c
- Markdown URL: https://www.agentpmt.com/faq?format=agent-md#faq-6ae5e8ddb3f999e1dff5a27c
- Tags: Product Specific

Yes. Publish several bodies or a cq.Assembly, then use measure\_part to get clearance, interference volume and the minimum gap between bodies, distances between selected faces or edges, cross sections, and mass and center of gravity from a density.

#### Do I need a CAD program or an Onshape account?

- Page URL: https://www.agentpmt.com/faq#faq-6ae5e8ddb3f999e1dff5a278
- Markdown URL: https://www.agentpmt.com/faq?format=agent-md#faq-6ae5e8ddb3f999e1dff5a278
- Tags: Product Specific

No. Parts are built with CadQuery on the OpenCascade kernel inside the tool, and every file is saved to your File Manager. The STEP and BREP exports are exact solids that open in any CAD program.

#### How do I know a generated part has the right dimensions?

- Page URL: https://www.agentpmt.com/faq#faq-6ae5e8ddb3f999e1dff5a279
- Markdown URL: https://www.agentpmt.com/faq?format=agent-md#faq-6ae5e8ddb3f999e1dff5a279
- Tags: Product Specific

Every build, import and revision returns the measured size, volume, center of mass and validity of each body, a hole table, preview images, and pass or fail results for the checks you request, such as size\_x, hole\_count or hole\_diameter. If checks.all\_passed is false, change the failing parameter with revise\_part.

#### How long are files kept, and what does it cost?

- Page URL: https://www.agentpmt.com/faq#faq-6ae5e8deb3f999e1dff5a27f
- Markdown URL: https://www.agentpmt.com/faq?format=agent-md#faq-6ae5e8deb3f999e1dff5a27f
- Tags: Product Specific

Generated files stay in your File Manager for 7 days. build\_part, import\_part and revise\_part cost 5 credits, export\_part costs 3, and measure\_part and render\_part cost 2. list\_templates, get\_part, list\_parts, get\_task and cancel\_task are free.

#### Is it safe to run my own CadQuery script?

- Page URL: https://www.agentpmt.com/faq#faq-6ae5e8ddb3f999e1dff5a27e
- Markdown URL: https://www.agentpmt.com/faq?format=agent-md#faq-6ae5e8ddb3f999e1dff5a27e
- Tags: Product Specific

Scripts run in an isolated worker with no network access, no credentials, and hard memory and time limits. Each worker instance runs a single job and is then discarded. A job can run for up to 10 minutes.

#### What happens when a build takes a while?

- Page URL: https://www.agentpmt.com/faq#faq-6ae5e8ddb3f999e1dff5a27d
- Markdown URL: https://www.agentpmt.com/faq?format=agent-md#faq-6ae5e8ddb3f999e1dff5a27d
- Tags: Product Specific

Results come back directly when the work finishes within about 20 seconds. Longer work returns a task\_id: call get\_task with wait\_seconds 55 until it completes. Tasks survive restarts and wait in a queue when every engine is busy, so nothing needs to be resubmitted, and cancel\_task stops a job.

#### Which file formats can it import and export?

- Page URL: https://www.agentpmt.com/faq#faq-6ae5e8ddb3f999e1dff5a27a
- Markdown URL: https://www.agentpmt.com/faq?format=agent-md#faq-6ae5e8ddb3f999e1dff5a27a
- Tags: Product Specific

It exports STEP, BREP, STL, 3MF, AMF, GLB, glTF, VRML, VTP, DXF cross sections and SVG line drawings. It imports STEP or STP (assemblies keep their body names and colors), BREP, and DXF profiles that you can extrude into solids.

### Dependencies

This product has no public dependency products.