Skip to main content
Glama
KD5RYN

b123d-print-mcp

by KD5RYN

b123d-print

PyPI CI Docs License: MIT

Vibe CAD for 3D printing. Tell your AI assistant what you need, in plain words, with a photo and a few caliper readings. It designs the part, looks at it from every side, checks it for printing problems and hands you a file for your slicer. No CAD skills needed, and it works with any assistant that supports MCP: Claude, Gemini CLI, Cursor, VS Code Copilot, Codex and more (which clients, and how to connect each).

What you can make

Ask the way you would ask a friend who owns calipers and a CAD program. These were designed this way, and printed:

  • "A box for this IR blaster board: the LED pointing out the top, a screw-on lid, two tabs to mount it on the wall." A two-part case, checked against a stand-in of the board so it fits.

  • "An outdoor case for this motion sensor. It should slide off a wall plate and keep the rain out." Dovetail rails, a click-in detent, a drain slot, and a cover that prints without supports.

  • "An adapter plate: 2-gang box behind, 1-gang smart switch in front." Counterbored screw holes, and a wall check added after the first print broke through a 0.05 mm skin no render showed.

Or remix a model you downloaded (STL, 3MF or STEP) and change it:

  • "Here's an L bracket STL I downloaded: turn its two mounting holes into slots and add gussets." The original is loaded as a solid and changed, the checks tell the original's flaws from new ones, and a before/after view shows exactly what moved. (A demo for the docs, not printed yet.)

Before a long print, test the fit with a fit-test template: a thin, quick print cut from the real part.

  • "Make a fit-test template of the mounting face so I can check the hole pattern." The assistant shows you the face in red, asks you to confirm, and gives you a 1.2 mm plate with the part's exact holes: minutes to print instead of hours.

Measuring something big, curved or awkward? Measuring for the AI shows which tool to use, how to photograph it with a scale, and a copy-paste measurement sheet and table of offsets (stations along a datum) that hand the numbers over without ambiguity.

And the everyday things: a spacer, a knob, a bracket, a cable clip, a replacement for a broken part you can measure. Then keep talking to it: "make it 5 mm taller", "add a hole for an M4 screw", "the lid is too tight". Every dimension stays a named number in a short build123d script, so each change is exact, and you get STEP files to keep editing in other CAD if you want.

ESP IR blaster box, assembly with board stand-ins

Section through the LED: base, lid, board and LED stand-ins

Two-part box for an IR transceiver board, with the board stand-ins

Section through the LED: lid cone, board, clearances

Outdoor motion sensor case, arch cover

Wall plate section through the counterbores

Outdoor sensor case: dovetail back plate + support-free cover

Wall plate: section just past the face, where the wall check looks

Remix: the downloaded L bracket and the version with slots and gussets

Remix: the original colored where the remix differs

Remix: a downloaded bracket, before and after

Where the remix differs: red cut, grey added

Documentation: https://kd5ryn.github.io/b123d-print/

Related MCP server: openscad-mcp

Get started in 2 minutes

b123d-print's MCP server is a plug-in that gives your AI assistant CAD tools. It runs on your own computer.

The easy way: paste this into your AI assistant (Claude Code, Claude Desktop, Cursor, Gemini CLI, Codex, …):

Install the b123d-print MCP server for me. It runs with
`uvx --from b123d-print b123d-print-mcp --workspace <folder>`
where <folder> is a folder for my parts, such as ~/parts.
Install uv first if it is missing (https://docs.astral.sh/uv/).
Add the server to your MCP settings, tell me when to restart you,
and after the restart check that its tools (list_parts, new_part,
build_part, ...) are available.

It will probably ask to run a few commands (to install uv and add the server): that is expected.

By hand:

  1. Install uv, which fetches Python and everything else b123d-print needs.

  2. Add the server. Claude Code:

    claude mcp add b123d-print -- uvx --from b123d-print b123d-print-mcp --workspace ~/parts

    Or install the Claude Code plugin (server + skill) in one step:

    /plugin install b123d-print --marketplace KD5RYN/b123d-print

    Claude Desktop (Settings → Developer → Edit Config):

    {
      "mcpServers": {
        "b123d-print": {
          "command": "uvx",
          "args": ["--from", "b123d-print", "b123d-print-mcp", "--workspace", "/Users/you/parts"]
        }
      }
    }

    Cursor, VS Code, Gemini CLI, Codex and others: Connect your MCP client.

  3. Restart the assistant.

Tell it your printer: ask "Set up b123d-print for my printer" (the setup_workspace prompt; b123d-print setup in a terminal): printer, material, export formats, style, then the calibration coupons.

Then ask: "Design a 40 mm round spacer, 10 mm tall, with an M3 hole." The files land in your parts folder under parts/<name>/out/; the file for your slicer is in out/print/ (what to save). The first start downloads a few hundred MB and can take a few minutes (Troubleshooting). The assistant checks its work by looking at its renders, so use a client that passes tool images to the model (Claude Desktop and Claude Code do).

Follow a whole session: your first part, a shelf bracket from install to print, and remix a downloaded STL.

Scope: parts for FDM 3D printing, nothing else. Everything is built around a printed part: print orientation with the bed at Z=0, hole compensation, mating clearance, calibration coupons, and print checks built on sourced FDM design rules. It is not a general CAD framework.

What's in it

  • b123d-print package + CLI — export, 6-view renders, colored multi-part cross-sections, and print checks: overlap between mating parts, overhang and bridges in print orientation, thin features and wall thickness around cuts, holes (round tops that sag), bed-edge fillets, gaps between moving parts, probes ("is the roof closed?").

  • b123d-print-mcp — an MCP server, so it works from Claude Desktop, Claude Code, Gemini CLI, Cursor, VS Code, Codex and other MCP clients. Part scripts are model-written code: they run in a sandbox with a timeout and no network.

  • compare — measure a part against a reference STL, 3MF or STEP: size, volume and surface differences, a 0–100 score, pass/fail, and a deviation view (comparing parts).

  • Remix — start from someone else's STL, 3MF or STEP: import_model makes a mesh a solid (coplanar triangles merged), the checks tell the original's problems from the ones the remix added, and a before/after view shows the change (remixing a part).

  • Fit-test templates — a quick thin print of a face, a slice or a region of the real part (same holes and clearances) to check the hole pattern and the fits before the full print (fit-test templates).

  • Design review — after the print checks pass, the assistant reviews the part for a style you pick (functional, modern, least cost, rugged/outdoor, soft/handheld, structural/load-bearing): rough filament and time estimates, supports, edge treatment, layer steps, water traps, inside corners and walls, and concrete suggestions from sourced design rules. It changes nothing without your OK (design review).

  • The workflow, model-neutral — MCP prompts plus an AGENTS.md any agent can read. The rules come from real prints; one exists because a part broke through a 0.05 mm skin that no render showed.

  • Examples — four parts designed this way and printed, plus calibration coupons for holes, fits, and overhangs and bridges, in src/b123d_print/examples/.

Advanced: run it on another machine

Not needed for most people. To keep the parts on a home server and design from a laptop, use SSH; for many agents sharing one server (eval runs, a team), HTTP with a named token per tool; for the strongest isolation (also on Windows), Docker. Which mode? compares them.

Documentation

Status

0.x — early. The part-script convention may still change. CI tests macOS, Ubuntu and Windows, the built package via uvx, and the Docker image on every push. On Windows the server runs natively for local use, but without an OS sandbox (process isolation and an audit hook only); use WSL2 or Docker for isolation. SSH mode's server side is macOS and Linux only; Windows works as an SSH or HTTP client. Platforms and status.

Credits and license

b123d-print is a thin layer over build123d, Open CASCADE Technology (via OCP), lib3mf, OrcaSlicer's printer data, bd_warehouse and py_gearworks for part scripts, matplotlib, NumPy, the MCP Python SDK and uv. Details and redistribution notes: THIRD_PARTY.md.

MIT © KD5RYN and contributors.

Available Tools

33 tools
before_afterB

For a remix: the original and the remix side by side, and the original colored by how far the remix is from it (compare's deviation view: green = unchanged, red = changed), with compare's score and metrics. The original is what build() loads with import_model, or what the script's original(d) returns. export writes the same two images when it writes PNGs.

NameRequiredDescriptionDefault
nameYes
sizeNonormal
inlineNo
variantNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose output content (two images plus score/metrics) and defines the 'original' semantically via build()/original(d). It does not clarify whether images are returned inline versus written to disk, or any side effects, permissions, or pagination concerns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the output, then defining 'original', then the export relationship – each sentence carries distinct information. It is somewhat jargon-dense ('build() loads with import_model', 'original(d)') but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully explains what is returned (image pair plus compare score/metrics) and clarifies the ambiguous concept of 'the original'. However, four entirely undocumented parameters leave the calling contract incomplete for an agent that must supply them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the four parameters (name, size, inline, variant) have no titles beyond their names and no descriptions. The description never explains what name identifies, what size values mean, what inline controls, or what variant selects, so it fails to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description concretely states what the tool produces – the original and remix images side by side, a deviation-colored original, plus compare's score and metrics – which is more than a name restatement. It implicitly distinguishes itself from the compare sibling by describing it as the visual companion to compare's deviation view. It never uses an explicit verb like 'render' or 'generate', so the action framing is slightly indirect.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The opening 'For a remix' scopes when this applies and the mention of 'export writes the same two images when it writes PNGs' hints at an alternative path, but there is no explicit when-to-use / when-not-to-use guidance versus compare, render_preview, or export. Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

build_partA

Run the part script (sandboxed, with a timeout) and report, per variant and part: bounding box size and min/max (mm), volume (mm^3), solid count, is_valid, the Dims values, and any error with its traceback; and under "timing" each piece's face count and build time, with a hint for a piece that is slow or dense. variant: key from VARIANTS ('standard' = ''). parts: comma-separated piece names from build(): build only those (lazy pieces: the others are never built). Built pieces are cached in out/.cache/, so render_preview, section, check and export reuse them while the script, its Dims and the settings stay the same; fresh=True builds again and replaces the cached pieces. Writes no other files. Ends with "before_printing": the review steps this version still needs, each with its call.

NameRequiredDescriptionDefault
nameYes
freshNo
partsNo
variantNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses sandboxing, timeout behavior, cache location and reuse conditions, fresh rebuild semantics, that no other files are written, per-piece timing hints, and error reporting with tracebacks. This is unusually rich behavioral context for a build tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded with the core action and reporting behavior. It is somewhat run-on and packs many details into long clauses, but nearly every clause provides useful operational context rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex build tool with an output schema, the description covers execution environment, cache behavior, output summary, timing hints, errors, and follow-up review steps. The main gap is that it never explains the required `name` argument, which is important context for invoking the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It explains `variant` (key from VARIANTS, 'standard' = ''), `parts` (comma-separated piece names from build(), lazy pieces skipped), and `fresh` (rebuild and replace cache), but the required `name` parameter is never described.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: run the part script and report per-variant/part geometry, validity, errors, and timing. It also distinguishes itself from render_preview, section, check, and export by explaining cache reuse, though it does not clearly identify the required `name` argument's role in that purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: `parts` limits which pieces are built, lazy pieces are skipped, cached pieces are reused later, and `fresh=True` rebuilds and replaces cache. It also mentions `before_printing` review steps, but does not explicitly compare when to call this versus siblings like `new_part`, `read_part`, or `diagnose_failure`.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

checkA

Run the print checks: validity, overlap between assembly parts (incl. stand-ins), overhangs > 45 deg from vertical in print orientation (bed face ignored) and bridge spans, thin features (walls under one line width fail), round-topped horizontal holes, fillets on bed edges, gaps between parts printed in place, the script's Wall checks (thinnest material around deep cuts) and Probes. The fit between an assembly's pieces (hole alignment, gaps) is a separate tool, check_fit, unless the script lists Mates() in checks(d). Fix every FAIL; report every WARN. On a remote server (HTTP/SSH) the part is not on the user's machine until download_part brings it home. Uses the pieces cached by an earlier build, and each unchanged piece's findings of the per-piece checks; fresh=True builds and checks everything again. A passing result ends with the review steps this version still needs, each with its call.

NameRequiredDescriptionDefault
nameYes
freshNo
variantNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it discloses non-obvious behavior: results are computed from pieces cached by an earlier build plus per-piece findings for unchanged pieces, while fresh=True rebuilds and rechecks everything. It also notes the passing result ends with pending review steps, each with its call. It stops short of saying whether the tool mutates anything (e.g. rebuilding cached pieces on fresh=True) or what permissions/state it requires.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the opening clause, but the first sentence runs several dozen words as an unpunctuated enumeration with nested parentheticals, which is hard to parse for an agent extracting the contract. Most content earns its place; the packaging does not.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-shape detail is not needed, and the description still adds that a passing run appends version-specific review steps. For a high-complexity tool it covers caching, remote state, and sibling routing well; the only real hole is the undocumented `variant` parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for 3 parameters, so the description must compensate. It fully explains `fresh` ('builds and checks everything again') and `name` is self-evident, but `variant` gets no mention anywhere, leaving one parameter's semantics to guesswork.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Run the print checks') and then enumerates exactly which checks run: validity, part overlap, overhangs, bridge spans, thin features, horizontal holes, bed-edge fillets, in-place gaps, Wall checks, Probes. It also names the sibling it is not (check_fit) and the condition that makes fit-checking part of this tool instead (Mates() in checks(d)).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing guidance: use check_fit for assembly fit 'unless the script lists Mates() in checks(d)', fix every FAIL, report every WARN. It also flags the remote-server precondition (the part is not local until download_part brings it home) and when to pass fresh=True.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_fitA

How the pieces of assembly(d) fit together, as placed (stand-ins count as obstacles): interference (pairs that overlap: the volume and where; pairs closer than the clearance without touching: the gap and where; faces resting on each other are contact) and hole alignment (round holes of two pieces on one axis are partners: offset beyond hole_tol mm, default 0.2, fails; their diameters read as screw holes, clearance + pilot / insert / nut, and a pair no single screw explains warns; a hole whose axis runs into solid material of the next piece has no partner). Male/female joint pairs from the script's joints(d) (or a Mates(joints=...) in checks(d)) are intentional fits measured against their own clearance. Stand-ins: labels saying stand-in or dummy, or matching no piece of build(). verbose: list the passing pairs too. One variant, or all. Uses the build cache (fresh=True rebuilds).

NameRequiredDescriptionDefault
nameYes
freshNo
variantNo
verboseNo
hole_tolNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it explains interference categories, contact exceptions, hole alignment rules, default hole_tol 0.2, joint-pair handling, stand-in treatment, verbose output, variant scope, and build-cache behavior. It does not explicitly state read-only/non-destructive side effects, so it falls short of complete behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loads the purpose and every clause carries technical meaning. It could be more readable if the nested parenthetical rules were structured separately, but length is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex geometric check with no annotations, 0% schema coverage, and an output schema, the description supplies substantial detection rules and parameter behavior. It still lacks explicit routing guidance and does not explain the required name argument, leaving minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate; it explains hole_tol's default and meaning, fresh rebuilding, verbose listing passing pairs, and variant as one-or-all. The required name parameter is not explicitly explained, but most parameter semantics are covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific purpose: checking how placed assembly pieces fit together, covering interference and hole alignment. It is clear and detailed, but it does not explicitly differentiate itself from siblings such as check or diagnose_failure.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit statement of when to use this tool versus alternatives, nor when not to use it. The detailed rules imply it is for fit validation, but the agent is left to infer the usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compareA

Compare a part with a reference model: bounding box, volume and surface area differences, surface distances (mean, Hausdorff) after aligning orientation, an F-score, a 0-100 score and pass/fail. reference, candidate: STL, 3MF or STEP files inside the workspace, as paths relative to it (e.g. 'refs/bracket.stl', 'parts/bracket/out/print/bracket.3mf'). thresholds: optional overrides, comma-separated name=value (e.g. 'hausdorff_mm=2,volume_rel=0.05'). image: also return a view of the reference colored by deviation (green = matches, red = off); size: 'normal' or 'small' (~800 px wide); inline=False returns only its file (over HTTP: a link). Remote server (HTTP/SSH): the files stay on the server, as a temporary working copy deleted when unused; bring the part home with download_part (one zip in the parts// layout). Never use ssh, scp or a shell on the server: there is none.

NameRequiredDescriptionDefault
sizeNonormal
imageNo
inlineNo
candidateYes
referenceYes
thresholdsNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does substantial work: it discloses that on HTTP/SSH servers the files stay remote as a temporary working copy deleted when unused, that inline=False returns only the image file (a link over HTTP), and what the image contains (green = matches, red = off). Not stated: whether the operation is read-only/side-effect-free, the response shape, or error behaviour when a file is missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and inputs are front-loaded, and every clause carries information — format list, threshold syntax, image meaning, remote-server caveat. It is a single dense run-on block rather than a structured list, which slightly hurts scanability for six distinct parameters, but there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter tool with no annotations and no output schema, the description is nearly self-sufficient: it names every returned metric and explains the server-side working-copy lifecycle. Gaps are minor — no error conditions, no units for the distance metrics, and no hint at output structure beyond the metric names.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% — the properties have titles only — so the description must supply all meaning, and it does: reference/candidate formats plus path examples, thresholds syntax with a concrete 'hausdorff_mm=2,volume_rel=0.05' sample, image semantics, size values ('normal' or 'small', ~800 px wide), and inline's effect. Every one of the six parameters is explained beyond its title.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Compare a part with a reference model') and enumerates exactly what the comparison yields: bounding box, volume and surface-area deltas, mean/Hausdorff surface distances, F-score, 0-100 score and pass/fail. That is far more specific than the bare name. It stops short of 5 because it never distinguishes itself from plausible siblings such as check, check_fit or design_metrics, which an agent must still disambiguate on its own.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operating context: inputs are workspace-relative STL/3MF/STEP paths with worked examples, thresholds are optional name=value overrides with an example string, and remote-server behaviour is spelled out. It even routes the agent to download_part for retrieving results and warns 'Never use ssh, scp or a shell on the server'. No sibling-comparison exclusions are offered, so it lands at 4 rather than 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

describe_modelA

Inspect an original model before remixing it: format, units (and whether they look wrong), size, volume, triangles and faces before/after merging coplanar triangles, how much is curved (faceted), round holes (diameter, axis, center), repairs needed, the designer/license metadata the file carries, and a suggestion: MODIFY it or REDRAW it. part: the part it is for. file: a name in parts//ref/ (or a workspace path such as 'refs/x.stl'). scale: '' (as the file says), a factor, or the unit the file was drawn in ('inch', 'cm'). image: also a 6-view render (saved as parts//out/images/_original.png).

NameRequiredDescriptionDefault
fileYes
partYes
sizeNonormal
imageNo
scaleNo
inlineNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description does real work: it discloses that a 6-view render is written to parts/<part>/out/images/<file>_original.png (a side effect), and flags that unit analysis can reveal a wrongly-scaled file. It leaves ambiguous whether the before/after coplanar-merge tri count implies actual file mutation, and says nothing about cost/latency for what is clearly a heavyweight geometry analysis.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence is front-loaded and information-dense with little true waste, but the parameter notes are packed into one run-on paragraph rather than separated, making it harder to scan for a specific parameter during invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must define the return shape — it does name the reported measurements but not their structure, and two parameters plus the cost profile are unaddressed. Adequate for a read-style inspection tool, but not fully self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry all parameter meaning. It explains part, file (including workspace-path form 'refs/x.stl'), scale ('' / factor / source unit like 'inch'), and image well, but silently omits two of the six parameters — size and inline — leaving them fully undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("Inspect an original model before remixing it") and then enumerates exactly what is reported: format, units, size, volume, triangle counts, curvature, holes, repairs, license metadata, and a MODIFY/REDRAW recommendation. That is a much narrower job than siblings like measure, check, or diagnose_failure, so an agent can separate them, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"before remixing it" gives clear situational context — this is the reconnaissance step prior to modification/redraw. No negative guidance or explicit routing to alternatives (e.g., when to use measure or check instead) is offered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

design_metricsA

Design numbers for the design review, per printable part: size and proportions, filament (simple estimate, roughly +-20 %) and cost, print time (rough estimate), supports, shallow slopes that show layer steps, edge treatment (sharp / filleted / chamfered shares, distinct radii and chamfer sizes), mirror symmetry, screw sizes, seam corners, water traps, inside corners, hole edge distance and slenderness across the layers (and the thinnest walls for a style that asks); then the suggestions the part's style triggers, each citing its DS-* rule. ALWAYS before export, after check passes; report its suggestions to the user. style: override the part's STYLE (functional, modern, least_cost, rugged, soft, structural, or a style file of the user's: list_parts shows them). up: the direction that points up in use for the water-trap check (+X, -Y, ...; default the script's UP, else +Z). as_json: the full numbers as JSON instead of the text report. Changes nothing.

NameRequiredDescriptionDefault
upNo
nameYes
styleNo
as_jsonNo
variantNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and usefully discloses that it changes nothing, that filament and print-time figures are rough estimates, and that suggestions cite DS-* rules. It does not describe failure behavior if check has not passed, but the read-only and estimation traits are clearly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and run-on, but it front-loads the main purpose and the metric list before moving to workflow and parameter notes. Given the complexity of the computed outputs, most of the length is justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not enumerate return fields, and it does cover the main workflow, metrics, and most optional parameters. The missing explanation of variant is a gap, but overall it is complete enough for this complex tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains style with enumerated values and list_parts reference, explains up as a direction with default behavior, and explains as_json as a report-format switch, but it leaves variant undocumented and treats name only implicitly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: it computes design numbers for a printable part, then enumerates the metrics and style-triggered suggestions it returns. It also distinguishes its place in the workflow by saying it runs after check passes and before export.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states the required sequence: "ALWAYS before export, after check passes," which tells the agent when to call it relative to sibling tools. It does not spell out when not to use it or name a direct alternative, but the workflow context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diagnose_failureA

The deeper look after a failed or broken build (failed results already carry a short DIAGNOSIS): builds one variant piece by piece, each on its own and without the build cache, and for each piece reports the error with its likely cause and specific fixes (where in the script, the piece, the numbers: e.g. the largest fillet radius that works on those edges), or for a piece that built, what makes it unprintable (invalid solid, zero volume, a 2D shape, not on the bed) and, for an invalid one, which faces and edges are bad, tiny edges and sliver faces left by booleans, and whether part.fix() repairs it. Then the assembly. parts: only those pieces. Stops before the time limit and names the pieces it did not get to.

NameRequiredDescriptionDefault
nameYes
partsNo
variantNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does well: it discloses that it rebuilds pieces individually without cache, may be expensive, stops before a time limit, and names pieces it did not reach. It does not clarify whether building variants mutates project state or requires specific permissions, which is a meaningful gap for a build-running tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with the triggering context, but the body is a single tangled, run-on sentence dense with parentheticals, which hurts scannability. Most content earns its place but should be broken into structured sentences or bullets.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex diagnostic tool with three largely undocumented parameters, the description covers behavior, output expectations (error causes, fixes, invalid geometry, fix() results), and time-limit semantics; the existing output schema covers return structure. The main residual gap is parameter semantics and state-mutation clarity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% with three parameters. The description only partially compensates: 'parts: only those pieces' gives some meaning to the parts param, and 'one variant' hints at variant, but name is unexplained and variant/parts formats and constraints are not defined. Partial coverage for an under-documented schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and scope: a deeper diagnosis that rebuilds each piece without the cache and reports errors, causes, and fixes, plus unprintability of built pieces. It distinguishes itself from the 'short DIAGNOSIS' in failed results and implicitly from siblings like check and build_part, though the run-on delivery makes the core purpose slower to grasp than it should be.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'The deeper look after a failed or broken build' clearly establishes the triggering context and notes that failed results already carry a short diagnosis, implying this is for escalation. It does not explicitly name alternatives (e.g., check, build_part) or say when not to use it, leaving some inference about cost/usage tradeoffs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_partA

Bring a whole part home from a remote server, in the same layout a local install writes: parts//.py, parts//out/ (exports, renders, sections) and parts//ref/ (reference models). Over HTTP: ONE signed link (no token needed, expires) to a zip of all of it; run curl -fLo <name>.zip '<link>' and unzip it in the project folder, then check the files are there. Over SSH: the b123d-print pull command that writes the same files. Locally (stdio): says where the files already are. variant: only that variant's out/ files ('standard' = ''); formats: only those out/ files (step, stl, 3mf, png, glb, print, hardware, bom, bom_csv); the script and ref/ always come. Over HTTP it also gives the 3D view links of the views export wrote (in a browser, no token). embed=True also puts the zip (up to 8 MB) into the result (over HTTP and SSH), for clients whose shell has no network (Antigravity/agy) or that can neither fetch URLs nor read resources: unzip it from where the client saved it. Call it as the last step of remote work, before reporting: a part is not done until its files are on the user's machine. Remote server (HTTP/SSH): the files stay on the server, as a temporary working copy deleted when unused; bring the part home with download_part (one zip in the parts// layout). Never use ssh, scp or a shell on the server: there is none.

NameRequiredDescriptionDefault
nameYes
embedNo
formatsNo
variantNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: signed link expiration, no token required, embed zip capped at 8 MB, and the fact that server-side files are a temporary working copy that gets deleted when unused. It also discloses what is always included (script and ref/) regardless of filters, which is behavior an agent cannot get from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the outcome and layout, and nearly every sentence carries operational information. It is dense and mixes transport mechanics (a literal curl invocation) with routing advice, and the closing 'bring the part home with download_part' restates the opening, costing some scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter tool with no annotations and no output schema, the description covers return locations, filtering behavior, embed fallback, and the temporary-copy lifecycle. It stops short of covering failure modes (e.g., part not found, expired link mid-download), which an agent would want before a terminal 'last step' call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and every parameter is compensated: variant is defined ('standard' = ''), formats is enumerated with actual values (step, stl, 3mf, png, glb, print, hardware, bom, bom_csv) even though the schema has no enum, and embed is explained with both its 8 MB limit and its audience (clients with no network or that cannot fetch URLs).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb + resource ('bring a whole part home from a remote server') and immediately states the exact output layout (parts/<name>/<name>.py, out/, ref/). It is clearly distinguishable from siblings like read_part, write_part or export, which operate on data rather than delivering a full file package.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it ('call it as the last step of remote work, before reporting: a part is not done until its files are on the user's machine') and when not to ('Never use ssh, scp or a shell on the server: there is none'). It also names the transport-specific alternatives (curl over HTTP, b123d-print pull over SSH, local stdio) rather than leaving the agent to infer them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

exportA

Export printable parts to parts//out/, sorted: print/ (3MF, STL, print sheet: for the slicer), cad/ (STEP, GLB), images/, docs/ (BOM, view HTML), README.md. Default: every part, all variants. The files must reach the user: on a remote server download_part brings them home. parts: comma-separated part names from build() to build and export only those; variant: one variant. Uses the pieces cached by an earlier build and leaves files already up to date as they are (templates too); fresh=True builds and writes everything again. formats: comma-separated from step (other CAD: Onshape, Fusion, FreeCAD), stl and 3mf (slicers; 3MF keeps units), png (6-view preview + section views), glb (binary glTF, for web and 3D apps), print (the print sheet, [_]print.md: size, filament and time estimates, supports, tip-over, walls and infill, fits and hole compensation, PRINT_NOTES, for the slicer, including declared hardware), hardware (versioned whole-assembly BOM JSON, []hardware.json), bom and bom_csv (the shopping list of that hardware as a Markdown table, []_bom.md, and as CSV, _bom.csv; hardware_list returns it in the result), or 'all'. Omit to use the user's formats setting (default: step, stl, 3mf and png). Ask the user which they want if unclear. view: a 3D view the user can turn in a browser, per variant: 'print' (default: the printable parts on the bed), 'assembly' (assembly(d) with its stand-ins) or 'none'. Over HTTP it is a signed link (no token, expires like the downloads); locally a self-contained HTML file in out/docs/ (works offline). Offer it to the user after an export. Over HTTP (a remote server) each file comes with a download link (no token needed, expires) and a b123d-print://files/ resource link; download_part gets the whole part (script, out/, ref/) in one zip. embed=True also puts files up to 2 MB into the result itself, for clients that can neither fetch URLs nor read resources. Before export, ALWAYS: check passes, design_metrics(name, style=...), suggest_orientation(name) (the "Before printing" block of build_part and check lists what is missing). With the review setting "warn" (default) export says what was skipped, here and on the print sheet; with "required" it refuses until the steps are done. skip_review: only when the user said to export without them, their reason (recorded on the print sheet). Remote server (HTTP/SSH): the files stay on the server, as a temporary working copy deleted when unused; bring the part home with download_part (one zip in the parts// layout). Never use ssh, scp or a shell on the server: there is none.

NameRequiredDescriptionDefault
nameYes
viewNoprint
embedNo
freshNo
partsNo
formatsNo
variantNo
skip_reviewNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and does so thoroughly: it discloses caching, fresh rebuild behavior, review warn/required semantics, skip_review recording, remote temporary working copies, signed expiring links, and embed limits. It also warns never to use ssh, scp, or a shell on the server.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the export destination and default behavior, and most details are useful. It is still long and dense, with many parenthetical clauses packed into run-on sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 8-parameter export tool with no output schema and no annotations, the description is highly complete: it explains outputs, default behavior, remote-server behavior, download links, review prerequisites, and safety constraints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It richly defines almost every parameter (parts, variant, formats, view, embed, fresh, skip_review), though the required name parameter is only implied through parts/<name>/ rather than explicitly defined.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: export printable parts to a defined output directory layout. It distinguishes the operation from sibling download_part by explaining that export writes files, while download_part brings them home on a remote server.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it, what must happen before export (check passes, design_metrics, suggest_orientation), and how review settings affect behavior. It also names download_part as the remote retrieval alternative and instructs the agent to ask the user about unclear formats.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hardware_listA

What to buy: the bought hardware the script declares in hardware(d) (screws, inserts, magnets, bearings), as one Markdown table to show the user: Qty | Item | Specification | Used for | Source/link | Status ("check before ordering" where the specification is not confirmed: ask the user, never guess it). Identical items are merged and summed. Offer it when a part declares hardware. name: one part; parts: comma-separated part names to merge into one list (each may be part:variant); neither: every part in the workspace. variant: the variant (default: the standard one). count: how many assemblies ("for 4 brackets"), which multiplies every quantity. format: 'table' (Markdown) or 'csv' (for a spreadsheet or cart). Reads only hardware(d): builds nothing. The bom and bom_csv export formats write the same list next to the exports. Changes nothing.

NameRequiredDescriptionDefault
nameNo
countNo
partsNo
formatNotable
variantNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it declares the tool read-only ('Reads only hardware(d): builds nothing', 'Changes nothing'), explains that identical items are merged and summed, that `count` multiplies quantities, and how unconfirmed specifications are marked. It also describes the output columns and the 'ask the user, never guess' handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and output shape, and almost every sentence adds needed information. It is slightly dense as a single paragraph, and 'builds nothing' and 'Changes nothing' are mildly redundant, but there is little wasted content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter, read-only listing tool with no annotations, the description covers purpose, scope selection, behavior, parameter meanings, output columns, and the export alternative. An output schema exists, so return-value detail is not required, but the description still provides enough to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description defines every parameter: `name` for one part, `parts` for comma-separated part names (including part:variant syntax), `variant` defaulting to standard, `count` as assembly multiplier, and `format` as table or CSV. This fully compensates for the empty schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: list the bought hardware declared in hardware(d) as a Markdown/CSV table. It clearly distinguishes itself from the `bom`/`bom_csv` export formats, which write the same list beside exports rather than showing it to the user.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to offer it when a part declares hardware, and explains how `name`, `parts`, or neither selects the scope. It also notes the relationship to `bom` and `bom_csv` exports, so the agent can choose between display and file-export workflows.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_edgesA

The edges of a printable part, to pick the ones for a fillet or chamfer by id instead of guessing a selector: stable ids (1 = the longest; changed geometry may renumber), type (line, circle, arc, ellipse, spline), length, start and end (or center and radius), convexity (convex: an outside edge; concave: an inside corner; tangent: a smooth joint such as a fillet's side; seam), the turn between its faces and the two faces it joins (flat faces by their list_faces id, curved ones by type). Filters: face (an id, side or 'x,y,z' as in list_faces: its edges), kind, convexity, near ('x,y,z': edges within radius mm, nearest first); limit caps the list. part: which printable part. highlight: edge ids ('3,4,7', '3-6' or a list): also returns a picture with them in red and selector, a build123d expression (filter_by/group_by/sort_by on part.edges(), one face's edges or convex_edges/concave_edges(part)) that selects exactly those edges, verified on the part; put that in the script, never the ids (they change when the model changes). size: 'normal' or 'small'. Remote server (HTTP/SSH): the files stay on the server, as a temporary working copy deleted when unused; bring the part home with download_part (one zip in the parts// layout). Never use ssh, scp or a shell on the server: there is none.

NameRequiredDescriptionDefault
faceNo
kindNo
nameYes
nearNo
partNo
sizeNonormal
limitNo
inlineNo
radiusNo
variantNo
convexityNo
highlightNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full load and does well: it warns that ids are only stable relative to '1 = the longest' and may renumber on changed geometry, explains the highlight side effect (also returns a picture with edges in red plus a verified selector expression), and discloses the remote-server model (temporary working copy deleted when unused). It never explicitly says the call is read-only/no mutation, which is the main remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the edge-record contents before filters, highlight, and remote behavior, and nearly every clause carries information an agent needs. It is dense and semicolon-heavy rather than cleanly segmented, which slows parsing of the parameter enumeration, but there is little pure filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter tool with no output schema and no annotations, the description covers the return shape (edge fields), the highlight variant's extra returns (image + selector), and the remote file lifecycle. The unexplained `name`, `inline`, and `variant` parameters, plus no mention of the default limit of 200, keep it just short of complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it largely does: kind values (line, circle, arc, ellipse, spline), the four convexity values with meanings, near ('x,y,z' within `radius` mm, nearest first), face formats (id, side, or 'x,y,z'), highlight syntax ('3,4,7', '3-6', or list), limit, part and size are all explained. Three parameters — the required `name`, plus `inline` and `variant` — are never mentioned in the description, leaving a real gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource (list the edges of a printable part) and immediately names the concrete use case (picking edges for a fillet/chamfer by id). It enumerates exactly what each edge record contains (id, type, length, endpoints/center+radius, convexity, adjacent faces), which makes it unambiguously distinct from list_faces and the other geometry siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States when to use it (to select edges by id rather than guessing a selector) and, critically, how to consume the result: 'put that in the script, never the ids (they change when the model changes)'. It also gives hard exclusions for remote operation ('Never use ssh, scp or a shell on the server'). It does not explicitly contrast with list_faces for the face-filtering case, so it is clear but not fully routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_facesA

The flat faces of a printable part, for picking one for a face fit-test template (make_template kind='face'): stable ids (1 = the largest; the same geometry always gets the same ids, changed geometry may renumber), outward normal and side (bottom, top, front, back, left, right), area, center, bounding box, round holes (diameter, center) and other openings; curved faces are only counted. part: which printable part (default: the only one). highlight: a face id or side; also returns a picture of the part with that face in red, to confirm the choice with the user before making the template. size: 'normal' or 'small'. Remote server (HTTP/SSH): the files stay on the server, as a temporary working copy deleted when unused; bring the part home with download_part (one zip in the parts// layout). Never use ssh, scp or a shell on the server: there is none.

NameRequiredDescriptionDefault
nameYes
partNo
sizeNonormal
inlineNo
variantNo
highlightNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With zero annotations the description carries the full burden and does so: id stability rules ('1 = the largest; same geometry always gets the same ids, changed geometry may renumber'), the fact that curved faces are only counted not listed, remote-server file semantics (temporary working copy, download_part zip layout), and a hard constraint against ssh/scp. This is behavior an agent could not infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the resource and its record fields, then parameters, then remote-server caveats — a sensible ordering. It is dense and parenthetical-heavy with a couple of run-on sentences, but nearly every clause carries operational information rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter read tool with no output schema, the description explains the returned face record fields and the remote-file lifecycle, which is the important part. The unexplained name/inline/variant parameters and the unspecified output shape of the highlight image are the remaining gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and it only partly does: part, highlight and size are explained with defaults and accepted values, but name (the sole required parameter), inline and variant get no mention at all. Three of six parameters remain undocumented anywhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('The flat faces of a printable part') and enumerates exactly what each face record contains (ids, normal, side, area, center, bbox, holes). It is clearly distinguishable from sibling list_edges and from make_template, which it explicitly feeds.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the downstream purpose ('for picking one for a face fit-test template (make_template kind='face')') and prescribes the confirmation loop via highlight before making the template. No explicit when-not-to-use or named alternative for someone who actually wanted edges, so short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_partsB

List the part scripts in the workspace, with the settings in effect.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden, and 'List' plus 'settings in effect' does establish a read-only enumeration that returns current-state settings. It does not disclose pagination, result ordering, or handling of an empty workspace, so behavioral context is partial rather than rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with the action front-loaded and no filler. The trailing clause 'with the settings in effect' is vague enough to be the one weak point, but it does convey that output includes current settings.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool takes no arguments and has an output schema, so the description only needs to say what is enumerated and roughly what comes back — both are covered. Missing are any hints about result size, ordering, or relationship to read_part, which keeps it from a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. 'With the settings in effect' adds a small amount of framing about what the enumeration reflects but no parameter-level detail is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb 'List' and resource 'part scripts in the workspace' are both explicit, which separates it from read_part (single) and write_part/new_part (mutation). However, 'part scripts' is slightly ambiguous against the surrounding family of part-tools, and no sibling is named to sharpen the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this versus read_part, list_versions, or describe_model, and no prerequisites or exclusions. The agent must infer that this is the enumeration entry point and that read_part follows for details.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_versionsB

The saved versions, newest first: date, id, message and the Dims values that changed. With part: numbered versions of that part (for restore_version), and what is not saved yet. On a shared (HTTP/SSH) server: the command for the user's own project folder.

NameRequiredDescriptionDefault
partNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose useful behavior: ordering ('newest first'), the fields returned, the existence of unsaved-changes information, and an extra mode on shared HTTP/SSH servers. It omits read-only nature explicitly, list size/limits, and any permission or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Only three sentences with no filler, and the primary behavior is front-loaded. However, the telegraphic fragments ('the Dims values that changed', 'what is not saved yet') trade clarity for brevity and require domain knowledge to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter read tool with an output schema present, the description covers both invocation modes, result ordering, and the shared-server variant. Return-value structure is handled by the output schema, so the remaining gap (pagination/limits, read-only confirmation) is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate for the undocumented 'part' parameter. It does explain the semantic difference between omitting and supplying it ('numbered versions of that part'), which is real added meaning, but it never says what form the value takes (part id, name, or index), leaving the format ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states what the tool surfaces — saved versions with date, id, message and changed Dims values, newest first — and distinguishes the two modes (project-wide vs. a specific part). It also ties itself to restore_version, clarifying its role relative to a sibling, though it never uses an explicit verb like 'list' and relies on the name for that.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: 'with part ... (for restore_version)' hints that this is the discovery step for restoring a specific part, and omitting 'part' yields project-level versions. There is no explicit when-to-use/when-not-to-use statement or named alternative besides the parenthetical reference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

make_templateA

A fit-test template: a quick thin print cut from the real part (same hole compensation and clearances) to check size, hole pattern and mating fits before printing the whole part. kind: 'slice' (plane XY/XZ/YZ at = Z/Y/X: the part between two planes thickness apart, centered on at), 'face' (face: an id from list_faces, a side such as 'bottom', or 'x,y,z' on it: that flat face with its holes as a plate; a side means the largest face facing that way) or 'crop' (center, size: x,y,z in mm: the part inside that box, with a thin base plate where it needs one; base=False: never). thickness: mm (default 1.2). label: engrave ' ' (default), your own text, or false; skipped when there is no room. The template is laid flat (template face down, Z=0) and checked like a part. Writes template.* in formats (default: the formats setting): 3MF/STL in parts//out/print/templates/, STEP in out/cad/; with png also out/images/<...>_where.png, the part with the template's source in red (returned as the image; inline=False: only the file). Confirm the face or region with the user first (list_faces with highlight). Remote server (HTTP/SSH): the files stay on the server, as a temporary working copy deleted when unused; bring the part home with download_part (one zip in the parts// layout). Never use ssh, scp or a shell on the server: there is none.

NameRequiredDescriptionDefault
atNo
baseNo
faceNo
kindYes
nameYes
partNo
sizeNo
labelNo
planeNo
centerNo
inlineNo
formatsNo
variantNo
thicknessNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it states that files are written to specific paths, that PNG output is returned as an image unless inline=False, and that on remote servers files stay as a temporary working copy deleted when unused. It also warns never to use ssh, scp, or a shell. It doesn't cover failure modes or whether overwriting an existing template is possible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded and every clause carries information, with no filler. The structure suffers, though: a single dense paragraph of nested parentheticals makes it hard to scan, especially the kind explanation, which could have been bulleted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 14-parameter tool with no annotations and no output schema, the description is substantially complete: it covers output locations, formats, the PNG side image, remote-server behavior, and the user-confirmation step. Only variant and the role of part remain unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does for most of the 14 parameters: kind's three modes, at, face, plane, center, size, thickness, label, formats, base, and inline all receive meaning. However, variant is never explained and part/name are only indirectly implied, leaving real gaps in a large parameter set.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence defines the artifact precisely: a thin test print from the real part with the same hole compensation, used to check size, holes, and mating fits. It distinguishes itself from siblings by pointing to list_faces for face confirmation and download_part for remote retrieval, though it never quite states a crisp verb+resource like 'Create a fit-test template'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit precondition: confirm the face or region with the user first, using list_faces with highlight. It also explains the remote-server workflow and directs the agent to download_part. It lacks when-not-to-use guidance versus check_fit or other verification siblings, but the relevant alternative is named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

measureB

Precise measurements on the built part, in mm, with the points where they were taken: check fits with numbers instead of guessing from pictures. kind: 'distance' (a, b: piece names from build() or assembly labels, stand-ins included): the smallest gap and its two points, or when they overlap the interference volume, its box and depth. Two assembly labels are measured where assembly(d) puts them (the fit). 'wall' (at: x,y,z on or in the material; direction: optional x,y,z): the thickness along a line through the point (default: into the part along the nearest face's normal), with the gaps and walls beyond it. 'faces' (face, face2: ids or sides from list_faces): the distance between two parallel flat faces (a wall, a slot), or the angle between them, and their closest points. 'hole' (face: a flat face id or side, and/or at: a point at the hole): each round hole's modeled diameter, what it prints at after hole_comp, center, axis, through or blind depth. a: the piece for wall, faces and hole (default: the only one). frame: 'auto' (default), 'print' (as build() returns it) or 'assembly' (as assembly(d) places it); points are in that frame. image: also a picture of the part with what was measured in red. Uses the build cache.

NameRequiredDescriptionDefault
aNo
bNo
atNo
faceNo
kindYes
nameYes
sizeNonormal
face2No
frameNoauto
imageNo
inlineNo
variantNo
directionNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses useful details such as default frame behavior, optional image output, use of the build cache, and what each measurement kind returns, but it does not state whether the operation is read-only, whether it can fail, or what happens with stale cached geometry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded and organized by measurement kind. Each section provides actionable detail, though some sentences are run-on and relatively hard to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 13-parameter measurement tool with no annotations and no output schema, the description covers the core measurement modes and many inputs well. It remains incomplete regarding several parameters and does not describe failure behavior or output shape beyond what each kind measures.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate across 13 parameters. It explains the most important ones well: kind values, a, b, at, direction, face, face2, frame, image, and defaults for a. However, it omits meaningful explanation of name, size, inline, and variant, leaving several parameters undocumented in both places.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: 'Precise measurements on the built part, in mm, with the points where they were taken.' It adds a useful motivation ('check fits with numbers instead of guessing from pictures') and enumerates measurement kinds, but it does not explicitly contrast itself with sibling tools like check_fit or check.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied through the enumerated kinds and their intended inputs, e.g. face ids from list_faces and piece names from build() or assembly labels. However, it gives no explicit when-not-to-use guidance or direct comparison to alternatives such as check_fit, leaving the agent to infer the boundaries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

new_partA

Create parts//.py from the template (Dims dataclass, build(d), VARIANTS, views, checks). name: lower_snake_case. example: copy a bundled example instead (see list_parts), e.g. 'hole_coupon' to calibrate hole compensation. Returns a short confirmation; the template is the b123d-print://template resource (or read_part), show_code=True returns the new file's code here. Usually the next step is write_part with the whole script. If you haven't, call read_guide first; confirm the dimensions with the user before writing the script.

NameRequiredDescriptionDefault
nameYes
exampleNo
show_codeNo
descriptionNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose the return value ('short confirmation'), the show_code side effect, and the template backing resource. It omits what happens if the target file already exists (overwrite vs. error) and any permission or safety notes, which is a real gap for a file-creating mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads what gets created and its location, then layers usage and workflow notes. Some parentheticals and trailing sentences (read_guide, confirm dimensions) make it slightly dense, but every sentence conveys actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, workflow-integrated creation tool it covers the template contents, naming, example mode, code return, and next steps. Remaining gaps are overwrite/error behavior and the unexplained description parameter; an output schema exists, so return-value detail is not required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It explains name (lower_snake_case, used in the path), example (copy a bundled example such as 'hole_coupon', discoverable via list_parts), and show_code (returns the new file's code). The fourth parameter, description, is never mentioned, leaving one of four undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with the exact target path ('parts/<name>/<name>.py') and enumerates the template contents (Dims dataclass, build(d), VARIANTS, views, checks). This is clearly distinguishable from write_part (the follow-up step) and from example-copying behavior, which it also names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly covers when to use this tool versus the bundled-example alternative ('example: copy a bundled example instead (see list_parts)'), the required naming convention, the prerequisite ('call read_guide first'), the user-confirmation step, and the typical next tool ('write_part'). Little is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

paramsA

The part's named dimensions, read from the script without running it: each Dims field with its type, default as written, value (when the default is a literal), the comment saying where it came from, and its line; the derived values (@property) and the fields they use; and each variant's overrides in VARIANTS. Change one with set_params, not a whole rewrite.

NameRequiredDescriptionDefault
nameYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and discloses that the script is read without execution, which is important safety context. It also describes the returned structure in detail, though it does not mention error behavior if the part or script is missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core read operation and then details the returned contents efficiently. It is dense with semicolon-separated details but contains no obvious filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only introspection tool with one parameter and an output schema, the description is largely complete: it explains what is read, that the script is not executed, what is returned, and how to modify values instead. The main omission is clarifying the name parameter's exact role.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema contains one parameter, name, with 0% description coverage. The description does not explicitly explain that name identifies the part, nor does it give format or lookup expectations, so it does not compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific read operation: it exposes a part's named dimensions from the script without running it, enumerating Dims fields, derived values, and variant overrides. It distinguishes the tool from set_params by directing changes to that sibling, though it does not explicitly distinguish it from read_part.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear usage context by saying the script is read without being run, and it explicitly routes modification to set_params rather than a whole rewrite. It does not explicitly state when to prefer this tool over read_part, but the read-only inspection purpose is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_guideA

The workflow and print rules (the b123d-print://guide resource). Call it once before the first part in a session: many clients never load that resource. essentials=True: only the short checklist of the rules most often skipped.

NameRequiredDescriptionDefault
essentialsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does reasonably well: it discloses that the call is a one-time-per-session read of a static ruleset, and that the payload is a workflow/print-rules document. Return shape need not be explained since an output schema exists. It does not state whether the guide is cached, versioned, or fixed for the session, which would round this out.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each doing work: what it is, when to call it plus rationale, and what the flag does. The parenthetical resource reference is front-loaded well. Minor redundancy between the resource mention and the 'many clients never load that resource' aside.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with an output schema, this covers the essentials: what the content is, when to fetch it, and what the flag narrows. The only gap is that it never says whether the content changes during a session, which matters for the 'call it once' instruction.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must define the lone parameter, and it does: essentials=True yields only the short checklist of rules most often skipped. The default/false behavior (full guide) is only implied, not stated, which keeps it below a 5 for a single undocumented parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the exact resource being fetched — the workflow and print rules — and ties it to the b123d-print://guide resource, so the agent knows precisely what comes back. It lacks an explicit verb ('retrieve'/'read'), and there is no sibling that overlaps in purpose, so no differentiation statement is needed. Clear but one step short of a model verb+resource statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a concrete trigger ('Call it once before the first part in a session') and a rationale (many clients never load the resource), which tells the agent both when and why. It also positions the underlying resource as the alternative for clients that do load resources. No explicit 'when not to use' beyond the implied 'once', but the timing guidance is unusually actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_partC

Return the current code of a part script.

NameRequiredDescriptionDefault
nameYes

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It only says it returns 'current code'; it does not mention permissions, side effects, error behavior for missing parts, or what 'current' means relative to versions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted words. However, its minimal structure provides little beyond the core statement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (one required parameter), and an output schema exists so return values need not be described. Still, with no annotations and zero schema parameter coverage, the description leaves important invocation details unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the only parameter ('name') is not described in the schema. The description vaguely implies the parameter identifies a part script, but adds no format, constraints, or usage details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Return') and resource ('current code of a part script'), making the action clear. It does not explicitly differentiate itself from siblings like write_part or list_parts, but the purpose is still understandable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use read_part versus alternatives such as list_parts, describe_model, or write_part. The description only implies a read operation without stating selection criteria or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recipeA

Tested build123d recipes for common printable features, with printing notes and sources: teardrop holes, counterbores and countersinks, nut traps, magnet pockets, snap arms (with strain sizing), living hinges, print-in-place hinges, lids with a lip, text, bed-edge chamfers, zip-tie and cable slots, ribs and gussets. name: '' lists them; a recipe (or one of its function names) gives its code, an example and the notes. Use one before improvising the feature; part scripts import them: from b123d_print.recipes import snap_arm.

NameRequiredDescriptionDefault
nameNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the lookup nature, what is returned, the listing behavior, and the import path used by part scripts. It does not explicitly state side-effect/read-only behavior or error handling for unknown names, which keeps it from full transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and coverage, then usage semantics, then import guidance. The feature list is long but directly supports discovery and every part of the description has a clear function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter lookup tool with an output schema, the description supplies the essential context: what it contains, how to list versus retrieve, what retrieval returns, and why to use it. No critical calling information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does: it explains that name '' lists recipes and that a recipe name or one of its function names retrieves details. That adds substantial meaning beyond the bare string parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource: tested build123d recipes for common printable features, with printing notes and sources. It names concrete covered features and distinguishes the tool's role as a recipe/example lookup rather than a general guide or part reader.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit calling behavior: empty name lists recipes; a recipe name or function name returns code, an example, and notes. It also gives a clear when-to-use instruction: use one before improvising the feature, and notes that part scripts import them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_previewA

Render six views (iso, top, front, right, iso from below, bottom) as a PNG image. parts: comma-separated part names from build() (several are laid out side by side; only those are built), 'assembly' (assembled position with stand-ins), or omit: the assembly if the script has one, else every printable part side by side. One variant (default: the first). size: 'normal' or 'small' (~800 px wide, cheaper). inline=False returns only the file (over HTTP: its download link), not the image itself. Uses the pieces cached by an earlier build; fresh=True builds them again. Remote server (HTTP/SSH): the files stay on the server, as a temporary working copy deleted when unused; bring the part home with download_part (one zip in the parts// layout). Never use ssh, scp or a shell on the server: there is none.

NameRequiredDescriptionDefault
nameYes
sizeNonormal
freshNo
partsNo
inlineNo
variantNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly: it discloses caching/reuse of build pieces, fresh rebuild behavior, inline vs file-only return, temporary server working copies deleted when unused, and the absence of shell access.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded, followed by parameter guidance and remote-server warnings. Despite the length, every sentence adds operational value and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter tool with no output schema and no annotations, the description covers return behavior and remote-server constraints well. It is nearly complete, though the required name parameter remains unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It explains parts, size, inline, fresh, and variant well, but the required name parameter is not explicitly described, leaving one semantic gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and output: render six named views as a PNG image. It clearly distinguishes this from sibling tools by referencing build() output, download_part, and remote-server behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance for parts, omission behavior, size choice, inline mode, fresh rebuilding, and remote-server workflow. It also names download_part as the alternative for retrieving files from the server.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restore_versionA

Bring a part (script, ref/, MEASURE.md) back to a saved version: a number from list_versions(part), or a commit id. It is saved as a NEW version, so nothing is lost: no reset, no deleted history, files added later are kept. Refused while the part has changes not saved yet (offer save_version first). Ask the user before restoring; then build_part and check. On a shared (HTTP/SSH) server: the commands for the user's project folder (version = the commit id), then write_part to put the restored script back on the server.

NameRequiredDescriptionDefault
partYes
versionYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral burden and does so: it discloses that the restore is non-destructive (saved as a NEW version, no reset, no deleted history, later-added files kept) and states a refusal condition for dirty state. This is exactly the mutation-safety context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose and non-destructive guarantee are front-loaded, and every sentence carries useful information about workflow or safety. It is dense and long, but no sentence is wasted; slightly tighter phrasing would help.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and the description covers purpose, safety, prerequisites, and the multi-step workflow including the server case. Nothing essential to correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate: it explains 'version' can be a number from list_versions(part) or a commit id, which is real added meaning. 'part' is only implied by the examples (script, ref/, MEASURE.md) rather than defined, leaving a small gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Bring a part back to a saved version') and enumerates what a part is (script, ref/, MEASURE.md). It distinguishes itself from siblings by naming list_versions as the version source and save_version as the pre-step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit prerequisites and sequencing: refuse while unsaved changes exist, offer save_version first, ask the user before restoring, then build_part and check. Even the shared-server workflow routes the agent to write_part, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_setupA

Save the user's first-run answers (the setup_workspace prompt): printer (a name from use_printer's search, or a nickname), material, formats ("3mf,png"), default style; hole_comp=0 records that the slicer corrects holes (the default way); a nonzero, MEASURED hole_comp / hole_comp_h is an opt-in that builds the correction into every file; calibration: other coupon results, e.g. {"clearance": 0.18, "max_bridge": 15}. With a printer, measured values are stored for it and the material. Written where use_printer writes. A value already set there is kept and listed as a conflict: ask the user, then call again with overwrite=True. Empty arguments change nothing. move_flat=True (after asking the user) moves measured values set for every printer of a workspace under the active printer.

NameRequiredDescriptionDefault
styleNo
formatsNo
printerNo
materialNo
hole_compNo
move_flatNo
overwriteNo
calibrationNo
hole_comp_hNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it states where data is written ('where use_printer writes'), what happens on existing values (kept and reported as a conflict, retry with overwrite=True), the no-op semantics of empty arguments, and the workspace-wide side effect of move_flat. That is an unusually complete behavioral disclosure for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Information density is high with essentially no filler, and the printer/material/formats group is front-loaded ahead of the conditional rules. The semicolon-chained run-on structure and mid-sentence capitalization ('MEASURED') make it harder to parse than it needs to be for nine parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter mutation tool with zero annotations, the description covers storage location, conflict/overwrite behavior, idempotency of empty calls, and the move_flat side effect; an output schema exists so return values need not be described. Nothing an agent needs to call this safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 9 parameters, so the description must compensate entirely, and it does: formats gets a literal example ('3mf,png'), calibration gets a concrete dict example, hole_comp is explained as the slicer-corrects-holes sentinel vs. the opt-in measured value, and hole_comp_h shares that rule. overwrite and move_flat are tied to their triggering workflows rather than left as bare booleans.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource: 'Save the user's first-run answers (the setup_workspace prompt)'. It also implicitly distinguishes itself from use_printer by clarifying that the printer value comes from use_printer's search rather than being created here. Slightly less than 5 because 'setup_workspace prompt' is jargon a fresh agent may not recognize, and the tool's true scope (config persistence) has to be inferred from the parameter list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit procedural rules: empty arguments change nothing, conflicts must be surfaced to the user before retrying with overwrite=True, and move_flat should only follow asking the user. It also points at use_printer as the source of printer names. No explicit 'use tool X instead of this' routing, which keeps it from a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_versionA

Save a version of the project in its version history (git, on the user's machine): each part's script, its ref/ folder, MEASURE.md and the .py files beside it, and b123d-print.toml; never out/. Only when the user said yes: after a change that built and passed its checks, OFFER "Save this version? (: )", never save on your own. message: what changed, in the user's words ("arm 115 -> 130 mm"); part: only that part (default: all). The result says what was saved and the changed Dims values. start=True first makes the project folder a git repository with a .gitignore: only after the user agreed to keep a version history. On a shared (HTTP/SSH) server it runs nothing and returns the commands for the user's own project folder.

NameRequiredDescriptionDefault
partNo
startNo
messageYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it names the side effect (writes to a git repo in the user's project folder), the exact file scope saved and excluded, the required user confirmation, what the result reports back ('what was saved and the changed Dims values'), and the shared HTTP/SSH server behavior where nothing runs and commands are returned instead.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense and front-loaded — file scope, then trigger conditions, then parameters, then the server fallback — with essentially no filler. The semicolon-chained fragments make it slightly harder to scan than it could be, keeping it just short of top marks.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, and the description still usefully says the result reports what was saved plus changed Dims values. Combined with the file-scope list, confirmation gating and the remote-server fallback, an agent has everything needed to invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must explain all three parameters and does: message is 'what changed, in the user's words' with a concrete example format, part is 'only that part (default: all)', and start performs one-time repo initialization with a .gitignore under a stated condition. Each parameter gets meaning beyond its type and default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Save a version of the project in its version history') and enumerates exactly what is captured: each part's script, ref/ folder, MEASURE.md, adjacent .py files and b123d-print.toml, explicitly excluding out/. It is clearly separable from siblings list_versions and restore_version.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit preconditions and exclusion rule: only after the user says yes, only after a change that built and passed its checks, and it tells the agent to OFFER 'Save this version? ...' rather than calling on its own. It also gates start=True on the user having agreed to a version history, so both when-to-use and when-not are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sectionA

Cross-section as a PNG image, each part in its own color. plane: 'XY' (at = Z height), 'XZ' (at = Y) or 'YZ' (at = X), in mm. parts: default the assembly if the script has one (shows fit and clearances), else all printable parts; or comma-separated names (only those are built). size: 'normal' or 'small' (~800 px wide). inline=False returns only the file (over HTTP: its download link), not the image itself. Uses the pieces cached by an earlier build; fresh=True builds them again. Remote server (HTTP/SSH): the files stay on the server, as a temporary working copy deleted when unused; bring the part home with download_part (one zip in the parts// layout). Never use ssh, scp or a shell on the server: there is none.

NameRequiredDescriptionDefault
atYes
nameYes
sizeNonormal
freshNo
partsNo
planeYes
inlineNo
variantNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and discloses important behavior: inline=False returns only a file or HTTP download link, remote files are temporary working copies, and fresh=True rebuilds cached pieces. It also clearly warns not to use ssh, scp, or a shell on the server, though it does not describe permissions or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded with the core purpose and key parameter behavior. The remote-server caveat and download_part guidance are relevant, though the text is somewhat run-on and could be more scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with no annotations, no output schema, and 0% schema description coverage, the description covers most operational behavior including remote file handling, caching, and inline output. It is not fully complete because name and variant are unexplained, but the overall coverage is strong enough for correct invocation in most cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does explain plane, at, parts, size, inline, and fresh. However, it leaves the required name parameter and the optional variant parameter undocumented, which is a meaningful gap for an 8-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool produces a cross-section PNG image with each part in its own color, which is a specific resource and output. It does not explicitly distinguish itself from sibling tools such as render_preview, but the cross-section focus makes its purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides useful context for when parts default to the assembly versus all printable parts, and explains caching and fresh builds. However, it does not explicitly say when to use this tool versus alternatives like render_preview or before_after, so usage guidance is implied rather than fully spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_paramsA

Change Dims values in the script in place, leaving every other character of the file as it was: values {"FIELD": new value, ...} replaces each field's default (only literal defaults: a default computed by an expression such as hole_comp(file) is refused with the reason; so are unknown fields, derived @property values and values of the wrong type). variant: change (or add) that variant's override in VARIANTS instead of the default. rebuild (default true): build before and after (the build cache makes "before" quick) and report what changed per piece: size and volume; parts: only those pieces. Saved like write_part (size limit, must compile). If the new build fails, the result has the diagnosis and the call to undo it.

NameRequiredDescriptionDefault
nameYes
partsNo
valuesYes
rebuildNo
variantNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses refusals (expression-computed defaults, unknown fields, derived @property values, wrong types), the variant override path, default rebuild plus build-cache behavior, the size limit and compile requirement inherited from write_part, and that a failed build returns a diagnosis with an undo call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and the minimal-diff guarantee, then constraints, then variant and rebuild behavior. Dense but every clause adds information; the nested parentheticals make the middle heavier than ideal but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with an output schema, the description covers safety constraints, failure handling, and call semantics sufficiently. The remaining gap is the role of `name` and the exact meaning of `parts`, which the schema does not supply either.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains values (field→new value map, literal defaults only), variant (override location), and rebuild (default true, build before and after) — but never explains `name` and mentions `parts` only obliquely via 'per piece'/'only those pieces'. Three of five parameters are covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb and resource: change Dims values in the script in place, with a minimal-diff guarantee. That distinguishes it from write_part (whole-file write), params (read) and build_part (build only). 'Dims' is domain jargon, but the operation itself is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies usage through contrast — use variant to change an override instead of the default, and rebuild=false to skip building — but never states when to pick set_params over params, write_part, or edit-and-rebuild via build_part. The agent must infer the routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

suggest_orientationA

Rank the ways to put the part on the bed, so it does not print upside down or on a thin edge: the six axis-aligned orientations and the large flat faces of its convex hull, each scored on supports (area and grams under overhangs past max_overhang, bridges apart), bed contact, height and print time (rough estimates), bridges, tip-over risk (as the check) and, with a load or the structural style, whether the load runs along the layers (DS-T1). Returns a ranked table with the Rot(x, y, z) to apply in build(d) and how. ALWAYS before export (a part already flat on the bed: it says so in a second). piece: one printable part (default: each). load: the bending or tension direction as build(d) returns the part ('X', 'along Y', 'XZ', '1,0,1'). image: also render the top choice (of the first part). Changes nothing. Remote server (HTTP/SSH): the files stay on the server, as a temporary working copy deleted when unused; bring the part home with download_part (one zip in the parts// layout). Never use ssh, scp or a shell on the server: there is none.

NameRequiredDescriptionDefault
loadNo
nameYes
sizeNonormal
imageNo
pieceNo
inlineNo
variantNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does so: 'Changes nothing' declares read-only, it states the return shape (a ranked table with Rot(x, y, z) plus how), discloses that remote-server files are a temporary working copy deleted when unused, and forbids ssh/scp. Missing: cost or runtime expectations beyond the throwaway 'in a second' remark, and any note on accuracy limits of the 'rough estimates'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, but the body is a run-on, telegraphic enumeration with parentheses and semicolons that reads like compressed notes rather than prose. Remote-server operational guidance is appended to a scoring description where it is only loosely related, costing the reader parse time for the value delivered.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter, no-annotation, no-output-schema tool, the description covers return shape, safety profile and remote file handling well, but leaves three parameters undefined and never clarifies the relationship between name, piece and variant. An agent could call it, but not confidently for multi-piece or variant cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate and only partly does: it explains load with concrete format examples ('X', 'along Y', 'XZ', '1,0,1'), piece's default ('one printable part (default: each)'), and image's side effect. The size, variant and inline parameters receive no mention anywhere, leaving three of seven undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a concrete verb and resource: 'Rank the ways to put the part on the bed', and enumerates the candidate set (six axis-aligned orientations plus convex-hull faces). It separates itself from siblings by naming build(d), export and download_part, though the mid-sentence enumeration of scoring criteria makes the core purpose harder to extract than it should be.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit workflow rule ('ALWAYS before export') and a conditional trigger for the structural option ('with a load or the structural style'), plus a stated no-op case (a part already flat on the bed). It does not say when to skip it in favour of siblings like check or compare, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trace_outlineA

Trace a flat object in a scan or photo (parts//ref/, from upload_reference) into a 2D outline in mm for a part script: the largest object's outline and its holes, simplified to tolerance mm (few points: dense polylines build slowly), or with smooth=True through-points for a periodic spline. Scale, one of: dpi (a flatbed scan; omit everything to read it from the file), grid (cell size in mm of a grid or cutting mat under the object), reference ('card' = a credit card 85.60 x 53.98 mm beside the object, or 'L,S' mm of another rectangle), or points ('x1,y1,x2,y2' pixels, origin top left) with distance (mm between them). pick: 'x,y' pixel inside the object to trace when it is not the largest. threshold (0..1) and invert (object lighter than the background) override the automatic threshold. Writes out/docs/_outline.json (the points), out/docs/_outline.py (a snippet with OUTLINE, OUTLINE_HOLES and a face function) and out/images/_trace.png (the outline on the image: show it to the user to confirm). A scan is accurate to about a pixel; a photo only as far as it is square-on, flat and undistorted: check a known dimension before trusting it. Remote server (HTTP/SSH): the files stay on the server, as a temporary working copy deleted when unused; bring the part home with download_part (one zip in the parts// layout). Never use ssh, scp or a shell on the server: there is none.

NameRequiredDescriptionDefault
dpiNo
fileYes
gridNo
partYes
pickNo
inlineNo
invertNo
pointsNo
smoothNo
distanceNo
referenceNo
thresholdNo
toleranceNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations the description carries the full burden and does so: it names the three written artefacts (json, py snippet, png), discloses accuracy limits (about a pixel for scans, photo only if square-on/flat), and explains remote-server behavior (temporary working copy deleted when unused, use download_part, no ssh/scp/shell). That is behavior beyond anything structured.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and output are front-loaded, then scale modes, then outputs, then remote caveats. Dense but nearly every sentence carries information; the middle section is a long run-on that packs several parameters per clause, which slows parsing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter tool with no annotations and no output schema, the description covers inputs, generated files, accuracy caveats and remote file handling. The main gap is the unexplained `inline` flag (default true), which likely governs whether the result is returned to the agent, and no statement of the immediate return value.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, and the description compensates by defining most parameters: dpi, grid (cell size mm), reference formats, points syntax and origin, distance, pick 'x,y', threshold range 0..1, invert direction, tolerance in mm, smooth. Only `inline` (and to a lesser degree `part`/`file` beyond path shape) is left unexplained, so it falls just short of complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+output: tracing a flat object in a scan/photo into a 2D outline in mm for a part script, with the source path pattern parts/<part>/ref/<file>. This clearly separates it from siblings such as measure, render_preview or upload_reference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit conditional selection rules: omit everything for dpi from file, use grid for a mat, reference 'card' or 'L,S', points+distance for pixel calibration, pick when the object is not the largest, threshold/invert to override automatic threshold. Also states the precondition (from upload_reference) and a verification step (check a known dimension before trusting).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_referenceA

Get an original model (STL, 3MF or STEP) onto the server, into parts//ref/, to remix it, or a scan or photo (PNG, JPEG, TIFF, BMP) to trace with trace_outline (the part folder may not exist yet). With data_base64 (the whole file, base64) it is stored now, up to 50 MB; that is only practical for small files, since the model has to write out every byte. Without it, the result says how the USER copies the file: over HTTP a signed upload link for curl -fT <file> '<link>' (no token needed, expires), over SSH the b123d-print push command, locally the folder to copy it into. Then describe_model.

NameRequiredDescriptionDefault
partYes
filenameYes
overwriteNo
data_base64No

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the 50 MB cap, that base64 is only practical for small files because every byte is written out, that the HTTPS link needs no token but expires, and that it returns an SSH push command or a local folder otherwise. The one behavioral trait not covered is what the 'overwrite' flag does when the target file already exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the destination and file types before the operational details, and every sentence adds information. The prose is somewhat dense and parenthesis-heavy, but nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers both the inline-data path and the out-of-band copy paths in enough detail for an agent to act and to relay instructions to the user; the output schema handles return structure. The missing piece is overwrite semantics for an existing reference file.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It explains 'part' and 'filename' implicitly through the path template and covers 'data_base64' thoroughly (whole file, base64, 50 MB limit), but the 'overwrite' parameter is never mentioned, leaving one of four params undocumented anywhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (upload) plus the exact destination ('parts/<part>/ref/<filename>') and the two artifact classes it handles (STL/3MF/STEP models vs PNG/JPEG/TIFF/BMP scans). It also distinguishes itself from siblings by naming trace_outline as the consumer of image uploads and describe_model as the follow-up step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for each mode: upload a model to remix it, upload an image to trace it with trace_outline, and notes the part folder may not exist yet. It routes the agent to the next step (describe_model) but does not explicitly exclude sibling write paths like write_part or save_version.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

use_printerA

Optional printer profile (default is generic mode). search: find printer names ("bambu a1", "prusa mk4"). name: make it active (saved in the user's config, or over HTTP and SSH in this workspace's b123d-print.toml; "generic" clears it); a nickname given before works too. nickname: only for two printers of the same model, e.g. name='bambu_lab_p2s_0_4_nozzle', nickname='p2s-garage': each nickname keeps its own calibration. material: pla, petg, asa, abs, tpu or the user's own. Only change the printer when the user asks for it.

NameRequiredDescriptionDefault
nameNo
searchNo
materialNo
nicknameNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, but the description discloses config persistence (saved in user config or b123d-print.toml), clearing behavior ('generic' clears it), nickname calibration isolation, and a safety guardrail. Missing explicit permission requirements or reversal info, but strong for a config tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but informative; front-loads the optional/default context. Could be improved with bullet points for parameters, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values needn't be explained. The description covers all parameters, persistence semantics, and a usage guardrail, making it complete for this config tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, yet the description fully explains each of the four parameters: search finds names, name activates and persists, nickname disambiguates same-model printers, material lists options. Adds substantial meaning beyond the bare string schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States it sets an optional printer profile (default generic mode) and explains making a printer active. The action is clear and distinguishable from unrelated siblings, but no alternative tool is named (none exists).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Says to only change the printer when the user asks, and describes search vs name usage. No explicit alternatives are mentioned, but the optional/default caveat provides clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

write_partA

Replace the whole part script with code (create the part with new_part first). The script must define build(d) (+ Dims, VARIANTS). If you haven't, call read_guide first; confirm the dimensions with the user before writing the script. Then call build_part.

NameRequiredDescriptionDefault
codeYes
nameYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and does disclose that this replaces the entire part script and requires a specific `build(d)` + `Dims`/`VARIANTS` contract. It also states prerequisite tools, but it does not describe what happens to an existing script, whether it is recoverable, or any overwrite/versioning implications. The destructive nature is implied strongly by 'Replace the whole part script' but not fully elaborated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences, front-loads the core action, then provides prerequisites and follow-up. Every sentence contributes without repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation tool with no annotations, it covers the core workflow, script contract, and adjacent tools well. Missing details about the `name` parameter and overwrite/recovery behavior keep it from being fully complete, but the presence of an output schema reduces the need to document return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for both parameters. It explains `code` in useful detail, including the required `build(d)` contract, but it never explains what the required `name` parameter represents or how it relates to the part being written. Half of the parameters remain semantically undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: replacing the whole part script with `code`. It clearly distinguishes this tool from `new_part`, which creates the part, and `build_part`, which is the next step after writing. An agent can identify the tool's core action without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit sequencing: call `new_part` first, call `read_guide` if needed, confirm dimensions with the user, write the script, then call `build_part`. It states prerequisites and the follow-up action, leaving little ambiguity about when this tool belongs in a workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.3.15
    • Changedexport1 field changed
      • addedInput schema / properties / skip_review
        Added value: +{
        +  "default": "",
        +  "title": "Skip Review",
        +  "type": "string"
        +}
  2. 33 tool updatesv0.3.12
    • First observedbefore_after
    • First observedbuild_part
    • First observedcheck
    • First observedcheck_fit
    • First observedcompare
    • First observeddescribe_model
    • First observeddesign_metrics
    • First observeddiagnose_failure
    • First observeddownload_part
    • First observedexport
    • First observedhardware_list
    • First observedlist_edges
    • First observedlist_faces
    • First observedlist_parts
    • First observedlist_versions
    • First observedmake_template
    • First observedmeasure
    • First observednew_part
    • First observedparams
    • First observedread_guide
    • First observedread_part
    • First observedrecipe
    • First observedrender_preview
    • First observedrestore_version
    • First observedsave_setup
    • First observedsave_version
    • First observedsection
    • First observedset_params
    • First observedsuggest_orientation
    • First observedtrace_outline
    • First observedupload_reference
    • First observeduse_printer
    • First observedwrite_part

TDQS

A3.5/5.0

Scored across 33 tools

Disambiguation4/5

Most tools have clearly distinct purposes within the CAD/printing workflow: part authoring, building, checking, measuring, export, versioning, and remixing are separated. A few pairs are related and could be confused—check vs. check_fit vs. measure, design_metrics vs. measure, compare vs. before_after, and export vs. download_part—but the descriptions usually make the boundaries clear.

Naming Consistency3/5

The set is mostly snake_case, but it mixes verb_noun names (list_faces, build_part, save_version) with bare nouns (section, check, params, export, recipe), and hardware_list reverses the usual list_* order. The conventions are still readable, but not predictably uniform across the server.

Tool Count2/5

33 tools is heavy for a single MCP server, even one covering a broad CAD-to-printing workflow. Several specialized operations (render_preview, section, measure, compare, before_after, make_template, hardware_list, trace_outline) may be justified individually, but the surface feels over-expanded and could be consolidated or grouped.

Completeness4/5

The surface covers the full lifecycle remarkably well: setup, guide, part creation/editing, builds, checks, fit checks, measurements, previews, export, versioning, reference upload, comparison, and remix workflows. Minor gaps remain, such as no delete/rename part operation and no direct slicer/print-job control, but agents can work around these.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables Claude to create 3D-printable CAD models using build123d, with tools for modeling, modification, analysis, and publishing to platforms like Thingiverse and GitHub.
    14
    Creative Commons Attribution Non Commercial No Derivatives 4.0 International
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables LLMs to create and manipulate 3D models using OpenSCAD through MCP tools for code-based modeling, preview, and export.
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables agents to create and manipulate 3D CAD models using natural language via MCP, with git-based versioning and manufacturing output generation.
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to design, modify, and verify exact B-rep 3D CAD models by running build123d scripts on an OpenCascade kernel, with live three.js preview, collision and FDM printability checks, text-based spatial perception, user notes/sketch annotations, version history, and one-click export to OrcaSlicer.
    1
    MIT