Skip to main content
Glama

AnkusDrive

A CLI + MCP server that drives FreeCAD through its Python API so LLMs (and humans at a terminal) can design mechanical parts and run FEM simulations without clicking through the GUI.

Why

FreeCAD exposes almost everything it does through a Python API — create documents, build sketches, extrude solids, mesh them, run CalculiX/Elmer FEM solves, read back stress/displacement fields. But that API lives inside FreeCAD's embedded Python (freecadcmd), which is awkward to call from anywhere else. AnkusDrive wraps it behind two surfaces:

  • CLI — one-shot commands (ankusdrive run script.py, ankusdrive box --w 10 --d 20 --h 5 -o part.FCStd) for scripts, CI, and quick iteration.

  • MCP server — 280+ structured tools (new_document, add_primitive, boolean_op, pad, add_gear, fem_new_analysis, fem_run, fem_results) so an LLM agent can model, inspect, and simulate iteratively. Beyond core CAD/FEM this now spans a broad simulation surface (thermal, CFD/CHT, EM, acoustics, FSI, injection molding, granular/DEM, optics, multibody) and a design-control layer (item/part numbers, recipes, variant families, lifecycle/revision, ECO change orders, versioned interfaces).

  • Multi-agent orchestration — a host-side reference layer that lets a team of agents partition one product into components, build them in parallel, and merge the pieces back together with the joints actually fitting (see Multi-agent design).

Related MCP server: FreeCAD MCP Server

Target environment

  • FreeCAD 1.1.x. The freecadcmd binary is auto-discovered per-OS (macOS .app bundle, Linux /usr/bin etc., Windows C:\Program Files\FreeCAD 1.1\bin\freecadcmd.exe — version-globbed); override via $ANKUSDRIVE_FREECADCMD or rely on PATH. Run ankusdrive doctor to see exactly what resolved.

  • Bundled Python, ccx (CalculiX), and gmsh already ship inside every FreeCAD install — the macOS .app, the Linux package, and the Windows bin\ — so core CAD + structural FEM work on all three with no extra install.

  • Host-side rendering needs Pillow and numpy; both are installed by AnkusDrive as regular pip deps.

  • One optional exception: drawing PDF/SVG export (export_drawing) renders inside FreeCAD's bundled Python, so it needs reportlab + svglib installed there — see Drawing export (PDF/SVG). DXF export and everything else leave FreeCAD's Python untouched.

Setup

AnkusDrive is a pip-installable package; FreeCAD itself is the only thing you install separately. The host-side dependencies (mcp, Pillow, numpy) come along with the install. freecadcmd is launched as a subprocess and uses its own bundled Python — AnkusDrive doesn't touch it.

# 1. Install FreeCAD 1.1.x from https://www.freecad.org/
#    (macOS: drag to /Applications; Linux: distro package or AppImage;
#     Windows: run the installer — default C:\Program Files\FreeCAD 1.1)

# 2. Install AnkusDrive. Pick one:
pipx install ankusdrive                                       # from PyPI — isolated app, `ankusdrive` on PATH
pip install ankusdrive                                        # or into an env you manage yourself
# unreleased main, or for development from a clone:
pipx install git+https://github.com/gchen19/AnkusDrive.git
git clone https://github.com/gchen19/AnkusDrive.git && cd AnkusDrive
python3 -m venv .venv && .venv/bin/pip install -e .         # `.venv/bin/ankusdrive`

# 3. Smoke-test that the worker can reach FreeCAD, and see the full setup report
ankusdrive ping        # → ping=pong freecad=1.1.1
ankusdrive doctor      # per-item FreeCAD + solver checklist with the exact fix each

On Windows, don't follow the block above by hand — there is one scripted path that does all of it including the MCP registration: Windows quickstart (PowerShell).

AnkusDrive is published on PyPI at pypi.org/project/ankusdrive; the distribution roadmap beyond it (marketplace listings, hosted transport) is tracked in epic #303; the original phase plan is kept as a design record at docs/archive/PUBLISHING_PLAN.md.

macOS quickstart — solvers in a container

FreeCAD, CalculiX, SU2, PrusaSlicer and every pip-wheel family run natively on a Mac; the block above is all you need for those. What has no practical macOS build is the Linux solver stack — OpenFOAM, Elmer, YADE, openEMS, Bempp, preCICE, openInjMoldSim. Those run in a container, and AnkusDrive stays on the host and reaches into it. The image is multi-arch, so on Apple Silicon it runs native, not emulated.

# 1. A container engine: Docker Desktop, OrbStack, colima or podman.

# 2. Pull the solver image (0.88 GB on Apple Silicon, 1.15 GB on Intel).
docker pull ghcr.io/gchen19/ankusdrive-solvers:latest

# 3. Check it is ours before running your geometry through it (see below).
bash scripts/verify-container-image.sh

# 4. Point AnkusDrive at the container substrate.
export ANKUSDRIVE_SUBSTRATE=container
#    optional: ANKUSDRIVE_CONTAINER_ENGINE=podman|nerdctl   (default docker)
#    optional: ANKUSDRIVE_CONTAINER=<name>                  (default ankusdrive-solvers)

# 5. Create the container. $TMPDIR must be mounted at the SAME path inside, because a
#    case directory has to mean the same thing on both sides. On macOS $TMPDIR is a
#    per-user /var/folders/... path — mount THAT, not /tmp.
docker run -d --name ankusdrive-solvers \
  --user "$(id -u):$(id -g)" -e HOME=/tmp \
  --network none --cap-drop ALL --security-opt no-new-privileges \
  --read-only --tmpfs /tmp:rw,exec,size=2g \
  -v "$TMPDIR:$TMPDIR" \
  ghcr.io/gchen19/ankusdrive-solvers sleep infinity

# 6. Export the in-container paths for the OpenFOAM-backed families. The image
#    publishes them; YADE, Elmer, openEMS and Bempp need no export — AnkusDrive finds
#    them by asking the container.
docker exec ankusdrive-solvers env | grep -E \
  '^ANKUSDRIVE_(OPENFOAM_PATH|OPENFOAM_BASHRC|FSI_OPENFOAM_BASHRC|CCX_PRECICE|PRECICE_LIB|OPENFOAM_ADAPTER_LIB|OPENINJMOLDSIM|OPENINJMOLDSIM_BASHRC)='

# 7. Confirm.
ankusdrive doctor                  # each family: ready via <solver> (in container)
ankusdrive doctor --verify-image   # …and that the image is signed by this repo

The run flags are least privilege, and each is there because the solvers genuinely do not need what it removes — verified by running the live solver suites with them on. --network none in particular: nothing in a mesh is a reason to reach the internet.

Don't copy the image's ANKUSDRIVE_FREECADCMD or ANKUSDRIVE_CALCULIX_PATH — those name paths inside the container, while FreeCAD and ccx run on your Mac.

A config.toml written for a native install is the one trap here: its absolute paths are read as in-container paths. ankusdrive doctor now catches that and says so.

The alternative substrate on macOS is a Multipass VM, which you provision yourself — docs/MACOS.md has the full per-solver reality on a Mac, and docs/CONTAINER_SUBSTRATE.md the container path in depth.

The solver images, and checking they are ours

image

what it is

size

ghcr.io/gchen19/ankusdrive-solvers

what you want: solvers and their runtime libraries, nothing else

1.15 GB amd64 / 0.88 GB arm64

ghcr.io/gchen19/ankusdrive-heavy

the CI image — also carries FreeCAD, the driver venv and every build toolchain, because the whole test suite runs inside it

5.3 GB / 4.5 GB

Both are public, multi-arch (linux/amd64 + linux/arm64, each built natively) and tagged latest plus sha-<commit>.

Every published manifest is signed through Sigstore with a short-lived GitHub OIDC identity — no key to store or leak — and carries provenance naming the repository, workflow and commit that built it, plus a CycloneDX SBOM of what is inside:

bash scripts/verify-container-image.sh                       # the slim image, :latest
bash scripts/verify-container-image.sh ghcr.io/gchen19/ankusdrive-solvers@sha256:<digest>

Needs the GitHub CLI (gh ≥ 2.49, authenticated). Verify a digest and then run that digest: verifying :latest today and pulling :latest next week are two different images. ankusdrive doctor prints the digest the running container was made from, and --verify-image checks it.

There are three answers, and only one is alarming: verified; unsigned (an image you built yourself, or one published before signing existed — silence it with ANKUSDRIVE_ALLOW_UNVERIFIED_IMAGE=1); and mismatch, an image carrying provenance from somewhere else, which no setting silences. Verification never blocks a solve.

Building your own — a subset, or with your own changes — takes minutes, because nothing is compiled (the prebuilt solver trees are copied):

tools/build_solver_image.sh --solvers "openfoam fsi" -t my-solvers:dev   # 0.69 GB

Windows quickstart (PowerShell)

Windows is a first-class target (core CAD + CalculiX FEM run natively against a stock FreeCAD 1.1 install), and the whole core install is one script — venv, pinned dependencies, doctor, and the MCP registration line with resolved absolute paths:

# 1. Install FreeCAD 1.1.x from https://www.freecad.org/ (default C:\Program Files\FreeCAD 1.1).
#    Nothing needs to go on PATH — AnkusDrive globs the versioned install dir itself.

# 2. Clone and run the core installer. Windows PowerShell 5.1 is enough; no admin needed.
git clone https://github.com/gchen19/AnkusDrive.git
cd AnkusDrive
powershell -ExecutionPolicy Bypass -File scripts\install-core.ps1

That creates .venv, installs AnkusDrive with the pins that matter (notably mcp<2 — mcp 2.x installs cleanly and then breaks ankusdrive mcp), verifies the resolved mcp/numpy/Pillow, runs ankusdrive doctor + ankusdrive ping, completes a real MCP stdio handshake, and finally prints your registration block. Useful switches: -Python 'C:\Program Files\Python313\python.exe' to pick an interpreter, -Extras mbd,fluids for the pip-wheel solver families, -Persist to write the FreeCAD path into %APPDATA%\ankusdrive\config.toml (MCP hosts launch with a minimal environment, so a $env: set in your terminal will not reach them).

3. Register it with your MCP host. The script prints these with your real paths filled in — a GUI host doesn't inherit your shell PATH, so the absolute path matters:

# Claude Code
claude mcp add ankusdrive -- C:\Users\you\AnkusDrive\.venv\Scripts\ankusdrive.exe mcp

# Claude Desktop: %APPDATA%\Claude\claude_desktop_config.json
#   { "mcpServers": { "ankusdrive": {
#       "command": "C:\\Users\\you\\AnkusDrive\\.venv\\Scripts\\ankusdrive.exe",
#       "args": ["mcp"] } } }

Then restart the host; you should see the ankusdrive__* tools appear.

Supported Python: 3.10 – 3.14 (3.14 verified end-to-end on Windows 11 — pip install, MCP stdio handshake, and ankusdrive ping → freecad=1.1.1). The script checks your interpreter before pip runs, so a too-new CPython says so instead of failing inside the resolver.

Optional solvers (SU2, Elmer, PrusaSlicer, WSL-backed OpenFOAM) come afterwards via scripts\install-solvers.ps1. For the Linux-only solvers (OpenFOAM, FSI, injection molding, YADE, openEMS, Bempp), run ankusdrive container setup --install-engine once WSL is installed. It runs them from the prebuilt image with Docker inside WSL (how). Full per-solver reality, the test suite, and the WSL2 route: docs/WINDOWS.md.

Ubuntu 24.04+ / containers (apt has no FreeCAD)

FreeCAD was dropped from Ubuntu 24.04's universe repo, so apt install freecad finds no candidate there, and upstream's snap/flatpak both fail in a container or sandboxed agent environment (no snapd session, no FUSE). The path that works everywhere is the official AppImage, extracted:

scripts/install-freecad-appimage.sh          # or: scripts/install-solvers.sh freecad

It downloads the pinned release AppImage, checks its SHA-256, unpacks it with --appimage-extract (a userspace squashfs unpack — no FUSE, no root, no snapd, which is why it works in a container), symlinks freecadcmd, freecad, ccx and gmsh into /usr/local/bin, and then live-verifies the result with ankusdrive ping plus a real CalculiX solve (ankusdrive fem cantilever). Without a writable /opt it installs to ~/.local/opt/freecad instead; --prefix / --bindir override both, --appimage FILE reuses a download you already have.

The symlink step is optional: AnkusDrive also probes /opt/freecad/squashfs-root/usr/bin (and ~/.local/opt/freecad*/…) directly, so a hand-extracted AppImage in either prefix is auto-discovered. ccx and gmsh ride along inside the AppImage, so structural FEM works off this one download.

Telling AnkusDrive where FreeCAD lives

AnkusDrive auto-discovers freecadcmd in this order: $ANKUSDRIVE_FREECADCMD, then shutil.which(...) on PATH (trying freecadcmd, FreeCADCmd, and freecad.cmd), then a per-OS list of standard install locations:

OS

Auto-discovered locations (newest version wins)

macOS

/Applications/FreeCAD.app/Contents/Resources/bin/freecadcmd

Linux

/usr/bin, /usr/local/bin, /snap/bin/freecad.cmd, extracted AppImage under /opt/freecad*/squashfs-root/usr/bin or ~/.local/opt/freecad*/…, ~/.local/bin

Windows

C:\Program Files\FreeCAD *\bin\freecadcmd.exe (version-globbed), C:\Program Files (x86)\…, %LOCALAPPDATA%\Programs\FreeCAD *\bin\…

So a stock installer on any of the three needs no configuration. For a non-default install, point AnkusDrive at the binary directly:

export ANKUSDRIVE_FREECADCMD=/path/to/freecadcmd            # macOS/Linux
$env:ANKUSDRIVE_FREECADCMD = "D:\Apps\FreeCAD\bin\freecadcmd.exe"   # Windows

ankusdrive doctor prints which of the three layers (env / PATH / auto) actually resolved FreeCAD, plus every candidate it checked — the fastest way to debug a "FreeCAD not found" on a new box.

Drawing export (PDF/SVG)

export_drawing builds 2-D mechanical drawings (multi-view PDF/SVG/DXF with dimensions) entirely headless. DXF uses FreeCAD's own writer and needs nothing extra. PDF and SVG are composed and rasterised with reportlab + svglib, and because that runs inside the worker — FreeCAD's bundled Python, not the host venv — the two packages must be installed into FreeCAD's Python:

# Resolve FreeCAD's bundled Python from freecadcmd itself (portable across the
# macOS .app, a Linux distro package, and an extracted AppImage). freecadcmd
# prints a startup banner after the script output, so match a marker line
# rather than taking the last line:
printf 'import sys; print("DPREFIX="+sys.prefix)\n' > /tmp/_fcprefix.py
FREECAD_PREFIX="$(freecadcmd /tmp/_fcprefix.py 2>/dev/null | sed -n 's/^DPREFIX=//p')"
FREECAD_PY="$FREECAD_PREFIX/bin/python"      # some builds: $FREECAD_PREFIX/bin/python3

# Pin svglib<1.6 — newer svglib pulls rlPyCairo -> pycairo, a native build we
# don't use (our drawings are line art, no gradients).
"$FREECAD_PY" -m pip install reportlab "svglib<1.6"

# Verify:
"$FREECAD_PY" -c "import reportlab, svglib; print('drawing export ready')"

Without this, export_drawing still produces .dxf; .pdf/.svg raise a clear ModuleNotFoundError. FreeCAD already bundles Pillow (reportlab needs it), so no separate install is required.

Wiring it into an MCP host

The MCP server speaks stdio. Point your host at the ankusdrive binary and let it run the mcp subcommand.

Claude Desktop — add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "ankusdrive": {
      "command": "ankusdrive",
      "args": ["mcp"]
    }
  }
}

If ankusdrive isn't on the host process's PATH, use an absolute path — e.g. /Users/<you>/.local/bin/ankusdrive (pipx default) or /absolute/path/to/AnkusDrive/.venv/bin/ankusdrive (clone+venv).

Claude Desktop, one click — download ankusdrive-<version>.mcpb from the latest release and open it. Claude Desktop sets up its Python environment with uv, so no pipx step is needed — FreeCAD 1.1 still is. The install dialog has one optional field, the FreeCAD command path, for a FreeCAD that auto-discovery cannot find.

Claude Code — register once:

claude mcp add ankusdrive -- ankusdrive mcp

Other hosts (Cursor, Continue, custom MCP clients) — same shape: stdio transport, command = ankusdrive, args = ["mcp"].

After restarting the host, you should see 280+ ankusdrive__* tools become available. If startup hangs or the host reports a closed connection, run ankusdrive ping directly — that exercises the same worker boot path with cleaner error messages.

Tool families (toolsets). Every tool definition takes up the client's context, and all 283 come to roughly 114k tokens. Tools are grouped into families you can switch on and off: core (always on), drawings, fem, components, sheet_metal, assembly, intent, manufacturing, hand_calcs, simulation, plm, rendering.

  • pip / pipx / uvx / clone: every family is on unless you set ANKUSDRIVE_TOOLSETS, e.g. ANKUSDRIVE_TOOLSETS=drawings,fem,simulation, or toolsets = "..." in config.toml.

  • Claude Desktop extension: core, drawings and fem are on by default (~31k tokens); turn others on in the extension's settings.

setup_status lists the families that are off and exactly how to enable each one.

run_script executes Python the agent writes, with full access to your files and processes. It's controlled by ANKUSDRIVE_ALLOW_RUN_SCRIPT (env, or allow_run_script in config.toml):

  • pip / pipx / uvx / clone: allowed unless set to false.

  • Claude Desktop extension: off by default; turn it on in the extension's settings.

When it's off, the tool isn't offered at all, and setup_status says how to enable it.

Simulation solvers & review-video demos

The base install (FreeCAD + pip install ankusdrive) covers geometry, the analytic oracles, and the MCP surface. The heavy simulation families each shell out to an external solver, discovered at runtime by ankusdrive/solvers.py ($ANKUSDRIVE_<SOLVER>_PATH → PATH → standard install dirs). A family whose solver is absent degrades to a clean {ok: false, reason, install} dict instead of crashing — check what currently resolves with ankusdrive doctor (cross-platform, no server boot needed), the solve_capabilities MCP tool, or the install script's list. The install script installs the pip-wheel solvers and provisions the native ones — scripts/install-solvers.sh on Linux/macOS (apt/conda + source builds), and scripts/install-solvers.ps1 on Windows (pip extras + portable SU2/Elmer/PrusaSlicer downloads; CalculiX auto-detected from FreeCAD's bundle).

Persistent config: every ANKUSDRIVE_* path can instead live in ~/.config/ankusdrive/config.toml (%APPDATA%\ankusdrive\config.toml on Windows; ANKUSDRIVE_CONFIG overrides): freecadcmd = "..." at top level, one lowercased key per solver var under [solvers] (su2_path, elmer_path, openfoam_bashrc, ...). Env vars still win when set; the file is the layer that survives an MCP host's minimal launch environment. ankusdrive doctor reports the file and which layer resolved each value.

Where a solve's files go: every built-in solve writes its deck — a .sif plus mesh, an OpenFOAM case tree, a .inp, a sliced .gcode — into its own directory under <system temp>/ankusdrive-cases, and reports that directory as case_dir. They are kept, because a result names them and a second tool is handed them (a warpage solve consumes the cooling case a fill solve wrote), and they are reaped oldest-first once the root passes 64 directories or 4 GB — never touching one written within the last hour, so a running solve cannot be pulled out from under itself. solve_capabilities reports the root and the live numbers under cases. Tune with ANKUSDRIVE_CASE_ROOT, ANKUSDRIVE_CASE_KEEP, ANKUSDRIVE_CASE_MAX_GB, ANKUSDRIVE_CASE_GRACE_S, or turn reaping off with ANKUSDRIVE_KEEP_SCRATCH=1. A case_dir you supply is never touched, wherever it lives.

Every solve result also carries deck — a manifest of what the solver was handed, taken the moment its first step launched, before it wrote any output into the same directory: {digest, count, bytes, files: {path: hash}}. A session_transcript compares it with s.deck(...) ahead of that solve's checks, so a replayed number that drifted arrives already explained — ~ case.sif printed right above the failing check means the problem changed; deck matches the recording means it did not, and the solver or the environment did. CalculiX FEM results carry their .inp the same way.

Platform note: the solver discovery layer is fully cross-platform (per-OS install dirs, Windows PATHEXT/.exe, env overrides), so ankusdrive doctor gives an honest report on macOS/Linux/Windows. The pip-wheel families (MBD, topology, optics, fluids) install identically everywhere. The native-binary families differ by OS — CalculiX ships inside every FreeCAD install; SU2 and PrusaSlicer have good Windows/macOS binaries; Elmer has a portable Windows zip but no macOS binaries; the OpenFOAM-backed families (CFD, FSI, injection molding) — plus YADE, openEMS and Bempp — rely on a Linux shell + linker glue. On macOS they run through the signed solver container, native on Apple Silicon and with no source builds: see macOS quickstart. On Windows they run through WSL. See docs/WINDOWS.md and docs/MACOS.md for the full per-solver reality and setup on each OS.

The review-video demos under scratch/ turn a solver result into a GIF a human can watch — the real exported geometry in motion with the matching oracle overlaid on the frame (written to artifacts/). Each needs its family's solver plus matplotlib, and the CFD one needs meshio (on top of the base numpy/Pillow):

pip install matplotlib meshio        # frame rendering + reading OpenFOAM's VTK output

Review-video demo (scratch/…)

Solver it drives

Install

dog_clutch_cad_sim.py — rigid-body contact via p.vhacd

PyBullet (pip wheel)

pip install 'ankusdrive[mbd]'

meshing_gears_video.py — MBD gear train

PyBullet (pip wheel)

pip install 'ankusdrive[mbd]'

modal_shape_video.py — FEM modal shapes

CalculiX ccx (FreeCAD FEM)

apt install calculix-ccx (Linux); FreeCAD finds ccx on PATH

thermal_field_video.py — transient thermal field

Elmer

apt install elmerfem-csc; ensure ElmerSolver on PATH (or set ANKUSDRIVE_ELMER_PATH)

cfd_field_video.py — CFD field (lid-driven cavity)

OpenFOAM + meshio

OpenFOAM via apt/conda, then source <install>/etc/bashrc (or set ANKUSDRIVE_OPENFOAM_BASHRC); pip install meshio

All of them also use FreeCAD for the geometry/meshing, so run each with the same interpreter that launches the worker — e.g. .venv/bin/python3 scratch/cfd_field_video.py.

Optics

Two optics engines sit behind the MCP surface, in two licensing/runtime lanes:

Lane

Tools

Engine

Install

Sequential — lens design + optimization

optics_lens_design, optics_lens_optimize, optics_raytrace

optiland / rayoptics (MIT/BSD, in-process)

pip install 'ankusdrive[optics]' — or scripts/install-solvers.sh optics

Non-sequential — tracing through STL solids

optics_solid_trace

KrakenOS (GPL-3.0, out-of-process only)

pip install 'ankusdrive[optics_gpl]' — or scripts/install-solvers.sh optics_gpl

The sequential engines import in-process, so install the optics extra into the same interpreter that launches the worker (like the other wheels). The non-sequential engine is GPL-3.0 and is therefore never imported by AnkusDrive — it runs in a separate subprocess (ankusdrive/optics_gpl_runner.py), the same arm's-length boundary used for the GPL Elmer/OpenFOAM binaries. The worker locates a Python that can import KrakenOS automatically (from where the wheel is installed); override with ANKUSDRIVE_OPTICS_GPL_PYTHON=/path/to/python. Because of that isolation the GPL extra is opt-in: the no-argument install-solvers.sh run installs only the permissive extras and prints how to add optics_gpl. Rendered examples for both lanes (lens layout, spot diagram, optimization, prism TIR, and a ball-lens spherical-aberration study) live in examples/optics_gallery/ — regenerate with .venv/bin/python examples/optics_gallery.py (and …_3d.py, optics_ball_lens.py), or bootstrap everything in one shot (installs both lanes, then renders every figure):

scripts/install-solvers.sh --optics-gallery

Architecture sketch

 ┌────────────┐      ┌────────────┐      ┌──────────────────────┐
 │  MCP host  │ ───► │ AnkusDrive   │ ───► │  freecadcmd worker   │
 │  (Claude)  │      │ (Python)   │ IPC  │  (long-lived Python) │
 └────────────┘      └────────────┘      └──────────────────────┘
       ▲                    ▲                        │
       │                    │                        ▼
       └── CLI user ────────┘               .FCStd / .inp / .vtk

Key decision: long-lived worker with JSON-over-stdin/stdout, not subprocess-per-call. FreeCAD startup is ~1–2s; re-paying that per tool call is unacceptable for an interactive agent. The worker is a small Python loop launched under freecadcmd, reading commands, dispatching to handlers, returning structured results (including object IDs so follow-up calls can reference created geometry).

FreeCAD API surface we care about

Notes gathered from the scripting docs and the FEM Python tutorial:

Core (App):

  • App.newDocument(name) / App.ActiveDocument / doc.recompute() / doc.save(path)

  • doc.addObject("Part::Box", "name") — typed object creation; properties set after (box.Height = 5)

  • doc.supportedTypes() for introspection; obj.TypeId, obj.isDerivedFrom("Part::Feature")

Modeling:

  • Part — makeBox, makeCylinder, makeSphere, boolean cut/common/fuse, fillets, lofts (OpenCASCADE under the hood)

  • Draft — 2D primitives, move, arrays

  • Sketcher + PartDesign — parametric sketch-driven solids (most "real" mechanical design happens here)

  • FreeCAD.Vector, Placement for positioning

FEM (ObjectsFem + femtools):

  • ObjectsFem.makeAnalysis(doc, "Analysis") — container

  • makeSolverCalculixCcxTools / makeSolverElmer — solver objects with tunables (GeometricalNonlinearity, ThermoMechSteadyState, …)

  • makeMaterialSolid — assign YoungsModulus, PoissonRatio, Density

  • Constraints: makeConstraintFixed, makeConstraintForce, makeConstraintPressure, makeConstraintDisplacement, contact/tie/spring, thermal

  • Mesh: makeMeshGmsh + femmesh.gmshtools.GmshTools(...).create_mesh() (or Netgen)

  • Run: femtools.ccxtools.FemToolsCcx().run()

  • Results: iterate analysis.Group for Fem::FemResultObject; read .DisplacementVectors, stress fields

Headless invocation:

  • freecadcmd script.py — runs script then exits

  • freecadcmd with no args — interactive Python REPL (what the worker will drive)

  • --console, -M <moddir>, -P <pypath>, --pass <args>, FreeCAD.ConfigGet(...) for env info

  • FreeCADGui is not available headless — keep design logic in App/Part/Fem only

How an agent reaches FreeCAD: three layers

AnkusDrive exposes FreeCAD through three layers, each with a different audience and a different cost-of-use. Knowing which layer a feature lives in tells you how to invoke it.

Layer 1 — typed MCP tools (the agent surface)

280+ first-class MCP tools span the core mechanical-design surface, a broad engineering-analysis / simulation surface, and a design-control (PLM) layer. They have validated parameters, structured returns, and stable handles for chaining. This is the happy path — what an agent uses for things people do every day.

Domain

What's covered

Document lifecycle

new_document, open_document, save_document, list_documents, set_active_document, close_document, restart_worker

Geometry primitives

add_primitive (box/cyl/sphere), boolean_op, export_shape (STEP/IGES/BREP/STL)

Selection (stable refs)

list_faces, list_edges, query_faces, resolve_face, resolve_edge, register_handle, verify_feature

PartDesign

make_body, make_datum_plane, make_sketch, add_sketch_geometry, add_sketch_constraint, add_sketch_external, close_sketch, pad, pocket, revolve, hole, loft, sweep, helix, partdesign_fillet, partdesign_chamfer, linear_pattern, polar_pattern, mirrored, thickness, draft

Direct modeling & feature ops

fillet_edges, chamfer_edges, shell_solid, add_rib, engrave_text, oring_groove, transform, scale_shape, copy_shape

Parametric components

add_gear, add_rack, add_sprocket, add_pulley, add_spring, add_fastener, add_bearing, add_thread, list_thread_options

Metrology & inspection

measure_distance, measure_angle, bounding_box, check_shape, section_view, min_clearance, envelope_check, interference_check

Generic property access

get_object, set_property

Functional intent & invariants

annotate_face, list_face_roles, classify_face_sides, check_airtight_path, declare_intent, verify_intent

Performance contracts

declare_performance, verify_performance — a quantitative spec ("Cd ≤ 0.30 at 30 m/s", "Δp ≤ 50 Pa", "first mode ≥ 200 Hz") persisted on the part and re-proved after every edit, with a three-state verdict: a measurement whose uncertainty band straddles the limit is indeterminate (escalate), never a pass. The contract is consulted at the gates (#261): merge_assembly, substitutability_check and component_contract_check read the last recorded verdict, so an unmet spec blocks a merge and an unverified one is reported as its own outcome rather than passing silently

Design-space studies (DOE)

study_submit — sweep recipe/tool parameters over a full grid or a Latin hypercube and keep the WHOLE search as a table, not just the last point. A response is any AnkusDrive tool + a metric path (including a whole verify_performance verdict, so points stay comparable across fidelity tiers); screening responses evaluate inline, solver responses fan out concurrently behind one collector job. Sampling is deterministic from seed, so re-submitting a crashed or widened study re-runs only the new points and reports the rest as cache hits

Optimize to a spec

optimize_submit — vary bounded parameters until every constraint passes, then report whether it was proven. A bounded Nelder-Mead (derivative-free; there is no adjoint through a CFD solve) over the same objective/constraint mapping the contract layer uses, with a screen→solver fidelity ladder. Two rules come from the contract layer: an indeterminate constraint is a measurement problem, not a failed step (it neither attracts nor repels the search), and convergence is not proof — a margin narrower than its own uncertainty band is reported unproven, however tidily the simplex converged

Assembly & interfaces

make_assembly, add_part, list_assembly_parts, merge_assembly, publish_interface, interface_align_check, assembly_lock, assembly_lock_check, bom_extract

Drawings (TechDraw, headless)

make_drawing_page, add_projection_group, add_section_view, add_thumbnail, add_dimension, add_annotation, add_feature_note, add_gdt_callout (feature control frames), set_title_block, fit_page, export_drawing (PDF/SVG/DXF), plus completeness/legibility gates drawing_gate, drawing_legibility

Inspection (first-article)

balloon_drawing (revision-stable balloon numbering), inspection_plan (characteristic list with a measurement method per row, by the gauge-maker's 10:1 rule), fai_report (AS9102-Form-3-shaped CSV/SVG/PDF — not a certified submission); drawing_gate(require_ballooned=True) makes a ballooned print a release requirement

Release packages (vendor / RFQ)

release_package — the one-call deliverable bundle for an item at a revision: STEP + drawings (PDF/SVG/DXF) + recursive BOM + inspection package + a blake2b-checksummed manifest. Gated before anything is written: the item must be in a releasable lifecycle state (or draft=True, which watermarks every artifact PRELIMINARY), drawing_gate must pass for every included page, and the title block's part number / revision / material must match the items registry — a mismatch is a failure with a naming diff, never a silent fix. Byte-reproducible (the same revision re-releases to identical checksums), stamps the ECO into the manifest and the print, and rfq=True adds quantity breaks + the cost_estimate rollup while dropping internal-only artifacts

Off-the-shelf parts (buyability)

catalog_search (what standard components exist, in which sizes and stocked lengths), catalog_nearest (snap a wanted size to a real one — asked for an M4×13 it answers 12 and 16), catalog_check, standard_part_designate (canonical designations: ISO 4762 M4×12 A2, 608-2RS, AS568-214 NBR70, stamped on the part at creation), designation_check, bom_extract(orderable=True) (per-line stocked / not_stocked with alternatives)

Visual feedback

render_view, render_views (8 preset views, multi-view sheets), render_photoreal / render_photoreal_submit (Blender studio scene with per-part appearance for whole assemblies, or the FreeCAD Render add-on renderers; renderer="auto"), render_capabilities

FEM (FreeCAD/CalculiX/Elmer)

fem_new_analysis, fem_set_solver, fem_set_material, fem_set_nonlinear_material, fem_add_constraint (fixed/force/pressure/displacement/temperature/heatflux/initial_temperature), contact_setup, fem_mesh, fem_mesh_refinement, fem_modal, fem_buckling, fem_run, fem_run_submit (the same CalculiX solve off the MCP channel; results readers accept its job_id), fem_results, fem_result_probe (stress/disp/temp at a point or face), fem_modal_results, fem_buckling_results, fem_thermal_results, plus the legacy fem_cantilever_demo

Engineering oracles & hand-calcs

machine elements (gear_rating, bearing_life, belt_drive, spring_check, bolted_joint_check, press_fit_stress, seal_check), structural (beam_modal, beam_buckling, plate_check, hertz_contact, elastica_deflection, plastic_collapse, random_vibration, harmonic_response), durability (fatigue_check, fracture_check, creep_flag, wear_estimate), thermal (thermal_lumped, thermal_transient_1d, thermal_composite_wall, h_estimate), tolerance/GD&T (tolerance_stackup, fit_check, fit_class, gdt_check)

Simulation families (external solvers, async)

screens + full solves that shell out to OpenFOAM/Elmer/CalculiX/openEMS/YADE/KrakenOS, most via a submit→poll job pattern: thermal/CHT (cht_channel_submit, cht_graetz_submit, thermal_transient_submit, thermal_radiation_submit), CFD (cfd_pipe_flow, cfd_body_drag, cfd_internal_flow_submit, cfd_external_flow_submit — including the virtual wind tunnel: hand it a solid and get Cd/Cl/Cm from an integrated force, gated against the sphere drag curve; every steady solve carries a trust block (convergence, checkMesh, measured y+) and cfd_mesh_independence_submit/grid_convergence put a Richardson/GCI error band on geometry with no analytic twin), EM (em_skin_depth, em_dc_resistance, em_field, em_conduction_submit, em_induction_submit, em_fullwave_submit), acoustics (acoustic_screen, acoustic_fem_submit, acoustic_radiation_submit), FSI (fsi_*), molding (molding_screen, molding_fill_submit, molding_warpage_submit), drop/impact (drop_impact, bar_impact, impact_dynamics_submit — the meshed part flown into a rigid floor, flat / edge / corner, gated against the exact St-Venant bar), granular/DEM (granular_screen, dem_pack_submit, dem_flow_submit), optics (optics_lens_design, optics_lens_optimize, optics_raytrace, optics_solid_trace), multibody (mechanism_kinematics, mechanism_simulate_submit), topology (topology_optimize_submit, topology_to_solid)

Async jobs

job_status, job_result, job_list — poll/collect any *_submit long-running solve; solve_capabilities reports which solvers currently resolve

Materials & fluids

material_list, material_get, material_select, fluid_props — mechanical-property / molding / CoolProp thermophysical corpora behind a typed lookup

Sheet metal

sheet_base (base flange), sheet_flange / sheet_tab / sheet_hem (bends placed by stable edge tag), sheet_unfold (K-factor flat pattern + per-bend allowance/deduction, with the K in force and its source echoed into every result), sheet_refold (round-trip verification against the folded solid), sheet_flat_export (layered DXF — CUT / BEND_UP / BEND_DOWN, the file a laser/brake shop quotes from), sheet_check (min bend radius by material, min flange, hole-to-bend, refold collision)

Manufacturing & Design-for-X

dfm_check (also runs the sheet-metal press-brake rules when handed a sheet part), dfa_check, moldability_check, optics_moldability_check, pack_check, cost_estimate, slice_estimate, slice_gcode_submit, laminate_properties, drop_impact

CNC (machinability + machining time)

cnc_machinability_check (setups from the tool-approach census, undercuts, tool L/D, sharp/small internal corners, thin walls — pure geometry, no CAM engine), cnc_time_estimate (material-removal-rate model: removed volume / MRR plus finishing area, ±50 % against the flat table's ±100 %; feeds cost_estimate(machine_time_hr=…))

Tolerance ↔ cost

tolerance_cost_check (per-dimension IT grade, the cheapest process that holds it naturally, a relative cost index, and a flag when a dimension is tighter than the declared process can hold without a secondary operation), suggest_loosening (the loosest tolerance that works — greedy loosening, every step re-verified against tolerance_stackup's cpk); cost_estimate(tolerance_class=…) puts the same curve in the rollup

Design control / PLM

items & part numbers (items_new, items_validate, items_resolve, items_check_manifest), recipes (recipe, recipe_list, recipe_schema, recipe_validate), feature templates (feature_instantiate, feature_list, feature_schema, feature_validate), variant families (family_materialize, family_validate), lifecycle/revision (lifecycle_transition, lifecycle_editable, lifecycle_classify_change, lifecycle_apply_change), change control (eco_create, eco_validate, change_impact, where_used, baseline_create, baseline_verify), interface registry + substitutability (get_interface, substitutability_check), projects (scaffold_project, project_validate, project_check_references, project_resolve_manifest)

Operations

transaction_open, transaction_commit, transaction_abort

Session transcripts

session_transcript: the session so far as a Python script that regenerates it (model, drawings, simulations) through these same tools. Handles are variables, job polls are one s.wait(job), measured results are s.check() lines that stop a drifted replay, and paths are relative to WORKDIR. It is also the analysis provenance record: every hand-calc and solve is kept and checked whole, run_script carries its SHA-256, and a PROVENANCE block names AnkusDrive / FreeCAD / platform / substrate plus every solver the session reached — path, substrate and probed version. Read-only: it returns the script as text. Tool calls are kept in server memory unless you opt into the durable journal: ANKUSDRIVE_JOURNAL_DIR appends every call to a per-session JSONL file, and journal_export / ankusdrive journal export turn a past session back into the same record (PRIVACY.md)

All tools return JSON; geometry-creating tools return a handle (e.g. pad_1) that subsequent calls reference. The heavy simulation families return a {ok: false, reason, install} dict (rather than crashing) when their solver isn't installed — see Simulation solvers.

Layer 2 — generic property reflection

For the long tail of "I just need to tweak this one property" without a dedicated tool:

  • get_object(handle) — dump every entry in obj.PropertiesList with Quantities → float (mm/deg), Vectors → list, Placements → dict.

  • set_property(handle, name, value) — set any single property by name.

Use this when a typed tool exists for the object kind but doesn't expose the exact property you need (e.g. Refine on a Pad, Sections ordering on a Loft, internal tunables on a CCX solver).

Layer 3 — run_script (the universal escape hatch)

For features that have no first-class MCP tool at all — e.g. Path workbench (CAM toolpaths), Surface workbench, Arch/BIM, Spreadsheet, TechDraw dimensions, contact/spring FEM constraints, B-spline sketcher operations, expression-engine bindings, anything in a workbench AnkusDrive doesn't wrap.

run_script(code='''
import Path
job = Path.Job.Create("Job", [_resolve("pad_1")])
__result__ = {"job_name": job.Name}
''')

Inside the script, the worker pre-injects: App / FreeCAD, Part, ObjectsFem, plus _register(prefix, obj) / _resolve(handle) / _handles so scripts can register new objects into the same handle registry that typed tools use. Set __result__ = ... to a JSON-serializable value to return data; print statements go to /dev/null.

The escape hatch costs more (the agent has to write FreeCAD Python) but makes the entire FreeCAD API reachable. The Phase 2 plan's "After Phase 2" section calls out which run_script patterns deserve promotion to typed tools — that's how the surface grows over time.

Regenerating a session

session_transcript() returns the session so far as a script:

with Session() as s:
    r2 = s.add_primitive(kind='box', w=40.0, d=20.0, h=5.0)
    box_1 = r2['handle']
    r3 = s.add_primitive(kind='cylinder', h=5.0, r=3.0)
    cylinder_1 = r3['handle']
    r4 = s.boolean_op(op='cut', base=box_1, tool=cylinder_1)
    s.check(r4, 'volume', 3964.657082647114)
    s.save_document(path=str(WORKDIR / 'bracket.FCStd'))

Save it and run python transcript.py [WORKDIR] to rebuild the session in a fresh worker. ankusdrive.replay.Session calls the same functions the MCP server serves, so a transcript can call no tool the server doesn't have. run_script stays behind its switch, and a missing solver stops the run at that step. Each s.check() stops the run at the first result that differs from the recording. The script's header lists what it can't reproduce: failed calls, run_script code, and files the session read, which you copy into WORKDIR first.

Auditing an analysis

The same tool answers the other question a transcript is for: what exactly produced this number? A simulation session exports with its derivation intact — the closed-form estimates are not dropped as "inspection", every number an analysis or a solve reported becomes an s.check(), and the verdict fields become s.expect(), so a replay that reaches a different solver or falls back to a different correlation stops there rather than returning a plausible figure:

PROVENANCE = {'env': {'ankusdrive': '0.5.5', 'freecad': {'version': '1.1.0'},
                      'substrate': 'container', ...},
              'solvers': {'elmer': {'version': '26.2', 'via': 'container',
                                    'path': '/usr/bin/ElmerSolver', ...}}}

with Session() as s:
    s.provenance(PROVENANCE)                     # prints every difference from the recording

    r1 = s.h_estimate(geometry='vertical_plate', characteristic_mm=100.0, t_surface_c=200.0)
    s.check(r1, 'h_total_w_m2k', 8.4111, rel=0.001)
    s.expect(r1, 'correlation', 'churchill_chu_vertical_plate')

    r2 = s.thermal_transient_submit(half_thickness_mm=1.5, h_conv=8.0, duration_s=600.0, ...)
    r5 = s.wait(r2['job_id'])
    s.check(r5, ('result', 't_center_c'), 45.49120518934, rel=0.001)
    s.expect(r5, ('result', 'solver'), 'elmer')

s.provenance() re-resolves the whole environment on the replaying machine and prints what moved: a different Elmer version, a solver that relocated when the substrate changed, a FreeCAD that is not the one that built the model. A replay on a different solver is not a failure — it is the finding. Solver paths under $HOME are collapsed to ~/…, so the record says which install without saying who. session_transcript also returns the record as provenance for attaching to a report; pass provenance=False to skip it and the version probes it runs.

Keeping the record: the durable journal

A transcript lives as long as the server does. For analysis that feeds a design decision, turn on the durable journal — it is off by default, and one setting enables it:

export ANKUSDRIVE_JOURNAL_DIR=~/ankusdrive-journal     # or journal_dir = "..." in config.toml

Every tool call is then appended to session-<start>-<pid>-<id>.jsonl in that directory: a header with the environment (AnkusDrive / Python / platform / substrate), the FreeCAD each worker booted, and one line per call — arguments whole (run_script code verbatim with its SHA-256), the trimmed result, the solver each solve resolved to, and result_digest, a SHA-256 over the full result, so a result the journal had to trim is still pinned. Writes are best-effort: a journal that cannot be written logs a warning and never fails or changes a tool call.

After the server has exited, the file turns back into what session_transcript would have returned — replay script, recorded environment, ordered call ledger with digests:

ankusdrive journal list
ankusdrive journal export latest -o transcript.py      # --json for the whole record

or, from an agent, journal_export(session="latest") (omit session to list).

Retention is stated, not left to the OS: at most 50 session files and 512 MB (ANKUSDRIVE_JOURNAL_KEEP, ANKUSDRIVE_JOURNAL_MAX_MB), oldest first, never the live session's file or one written in the last hour (ANKUSDRIVE_JOURNAL_GRACE_S); one session past 64 MB (ANKUSDRIVE_JOURNAL_FILE_MAX_MB) keeps arguments and digests but drops result bodies. ANKUSDRIVE_JOURNAL_REDACT=1 hashes paths and names (document names, labels, title-block fields) in arguments, results and errors — never run_script code or handles. The trade-off: a redacted journal is auditable by digest, but the script it exports is not runnable.

To make the record travel with the model, save with save_document(path, attach_provenance=True) (off by default). The document then carries the same record — replay script, environment and solver identities, ledger with each result's SHA-256 — in its Meta map, which survives FreeCAD re-saving the file. It covers the calls that built that document: the saving workspace's current worker, from the new_document / open_document that produced it, while it was the active document, successful calls only. ANKUSDRIVE_JOURNAL_REDACT applies to it too. A save without the flag removes an earlier record. Read it back without FreeCAD:

ankusdrive journal export bracket.FCStd -o transcript.py   # --json for the whole record

What the CLI is (and isn't)

The CLI is not the agent surface — it's a human-debugging + transport tool. Seven subcommands:

Command

Purpose

ankusdrive ping / version

Health check — boot a worker, prove FreeCAD is reachable

ankusdrive box / cylinder

Single-shot primitive → .FCStd (manual smoke tests)

ankusdrive export <in.FCStd> -o <out.step>

Headless format conversion

ankusdrive run <script.py>

Execute arbitrary FreeCAD Python in a live worker (set __result__ to return JSON)

ankusdrive mcp

Start the MCP server over stdio — this is how an MCP host launches AnkusDrive

ankusdrive fem cantilever

Run the built-in canned demo

ankusdrive journal list / export <session|latest|file>

Read the opt-in durable journal: list past sessions, export one as a replay script + provenance record

Agents do not invoke the CLI. They speak MCP via stdio after the host has launched ankusdrive mcp. The CLI's job is (a) to start that server and (b) to give a human a way to poke at the worker without writing an MCP client.

Decision rule

Need

Use

Standard CAD/FEM operation

First-class MCP tool (Layer 1)

Tool exists but I need property X

get_object / set_property (Layer 2)

Workbench / API not wrapped at all

run_script (Layer 3)

Smoke test from a shell, or stand up MCP

CLI

Multi-agent design

The roadmap above is about deepening what one agent can do. The orchestration/ layer is about many agents sharing the work: split a product into components and subassemblies, build those in parallel (each agent cold, seeing only its own contract slice), then merge the whole back up with the joints actually fitting. The design is written up in docs/MULTI_AGENT.md; it targets partition + merge, not shared co-editing of one live document (a single worker = one App.ActiveDocument, so concurrent mutation is a non-goal for now).

Concurrent agents on one MCP server — workspaces. FastMCP runs sync tools in a thread pool, so a host can have several tool calls in flight at once. The server keeps a pool of named workspaces, each its own freecadcmd process with its own App.ActiveDocument and handle registry. Each concurrent agent claims its own workspace with use_workspace(name) at the start of its session; handles and documents do not cross workspaces. A client that never calls use_workspace sees the historical single-worker behavior byte-for-byte (everything routes to the default workspace). Worker.call() is internally serialized so two threads can never interleave the stdin/stdout protocol on one process. The pool is capped (ANKUSDRIVE_MAX_WORKSPACES, default 4) and idle workspaces are reaped (ANKUSDRIVE_WORKSPACE_IDLE_S, default 900s) so abandoned sessions don't leak processes; list_workspaces / close_workspace manage it.

The split of responsibilities is deliberate:

  • AnkusDrive ships the thin, tool-agnostic primitives that make a merge verifiable — publish_interface (declare a component's mating frames), merge_assembly (combine component files into one assembly), and the gates that decide whether a merge is sound: interface_align_check (do published frames line up?), interference_check (do solids collide?), envelope_check (does it fit its bounding budget?), plus an assembly_lock / assembly_lock_check contract lockfile. These are real MCP tools usable by any host.

  • orchestration/ is the host-side reference coordinator — explicitly not part of the ankusdrive package. Given a free-text brief it decomposes it into a validated manifest, fans out one builder agent per component, merge_assemblys them, reads the gates, and on failure renegotiates — re-dispatching only the components implicated by the failing gate — up to a round budget. It runs against a real Anthropic client or a scripted stub (ScriptedClient) for free dry runs; the merge and gates are real worker calls either way. Any host (Claude, another tool, a human) can use it, replace it, or ignore it — the only contract that matters is the manifest + the component files on disk.

How well partition+merge holds up is measured by a dedicated eval ladder (tests/test_multiagent_m1.py / _m2.py, runnable in CI) with hard-oracle merge gates and a single-agent baseline — see tests/MULTI_AGENT_EVAL.md. Early experiments have partition performing at or above the single-agent baseline on the harder toys.

Designs, not just parts — the design-control layer

Multi-agent orchestration partitions one product across a team. A separate axis makes a design (not just a part) something you can parameterize, vary, and evolve under control — the mechanisms a PLM/PDM workflow expects, mapped onto AnkusDrive's deterministic, headless, git-diffable grain. The keystone insight: the build recipe is the feature tree; the parameters are its inputs; regeneration is re-running the recipe — so AnkusDrive gets parametric regen and family tables without a live in-file expression engine. The full scoping and rationale is in docs/DESIGN_HIERARCHY.md; the agent-facing judgment lives in the design-modularly skill.

  • Parametric hierarchy — recipes (recipe, recipe_validate) are named, declared-input build templates (AnkusDrive's PowerCopy/UDF and its intra-part parametric model); a relations DAG drives driven dimensions from master parameters by formula (pitch_d = module * teeth, arithmetic only — no iterative solve, no double-driving); feature templates (feature_instantiate) graft reusable features onto reference geometry by name; the typed units layer rejects dimensionally-wrong inputs at the door ("5 N" for a length is an error, not a silent mis-scale).

  • Variant families — family_materialize expands a row × column design table into a set of variants deterministically, running the recipe per row and allocating part numbers in table order.

  • Identity & lifecycle — items (items_new) give a part a stable part-number identity decoupled from its file path; a lifecycle state machine (lifecycle_transition: in_work → in_review → released → obsolete) enforces released-immutability, and a Form/Fit/Function predicate decides revision bump vs. new part number on a change.

  • Change control — ECOs (eco_create) are first-class change records; where_used / change_impact compute blast radius over the dependency graph before you commit; baseline_create / baseline_verify pin reproducible snapshots.

  • Versioned interfaces — an interface-type registry (get_interface, nema17_face@1-style named/versioned types) plus a Liskov substitutability_check gate enforce Form/Fit/Function compatibility as code, so a swapped part is verified to actually mate.

  • Projects — scaffold_project + project_validate / project_check_references promote the multi-agent directory convention to a first-class project.json (manifest-of-manifests) with a master/skeleton single-source-of-truth slot and reference-integrity guards.

Like the merge gates, these are thin, deterministic, mostly FreeCAD-free primitives — the logic layers import and test without launching a worker.

Status

Phase 3 closed 2026-05-10 (v0.3.0). The core mechanical-design surface from Phase 2 (2026-04-25) is intact; Phase 3 layered intent-encoding APIs on top of it. Since then the tool surface has grown from ~100 to 280+ tools across several waves: a command-tier expansion (parametric components + direct feature ops + metrology), the multi-agent orchestration layer, a broad engineering-analysis + external-solver simulation surface (thermal/CFD/CHT/ EM/acoustics/FSI/molding/granular/optics/multibody), and a design-control (PLM) layer (items, recipes, variant families, lifecycle, ECO/change, versioned interfaces, projects).

  • Worker + transport — long-lived freecadcmd worker, newline-JSON over stdio with stdio hygiene (FreeCAD C++ chatter redirected off the protocol fd).

  • CLI — ping, version, box, cylinder, export, run, mcp, fem cantilever, plus top-level --version.

  • MCP server — FastMCP over stdio, 280+ typed tools across document lifecycle, primitives, selection (face/edge tags), full PartDesign (sketcher + pad/pocket/revolve/hole/loft/sweep/helix/fillet/chamfer/pattern/mirror/thickness/draft), direct-modeling feature ops, parametric components, metrology/inspection, generic property reflection, mass properties, assembly + interface gates, TechDraw (incl. headless PDF/SVG/DXF export, dimensions, gates), multi-view + photoreal rendering, FEM (static + modal + buckling + thermal + nonlinear + result-probe), the engineering-analysis oracles and external-solver simulation families (sync + async *_submit/job_*), the materials/fluids corpora, Design-for-X / manufacturing checks, the design-control (PLM) layer, and transactions.

  • Command tiers 1–3 — 21 new tools: parametric components (add_gear, add_rack, add_sprocket, add_pulley, add_spring, add_fastener, add_bearing, add_thread), direct feature ops (fillet_edges, chamfer_edges, shell_solid, add_rib, engrave_text, oring_groove, transform, scale_shape, copy_shape), and metrology/inspection (measure_distance, measure_angle, bounding_box, check_shape, section_view, min_clearance).

  • Multi-agent orchestration — AnkusDrive ships the thin merge primitives + gates (publish_interface, merge_assembly, interface_align_check, envelope_check, assembly_lock/_check); the host-side reference coordinator (orchestration/) decomposes a brief, fans out per-component builders, merges, gates, and renegotiates. See Multi-agent design and docs/MULTI_AGENT.md.

  • Phase 3 intent-encoding additions — direction='into_body'|'away_from_body' and through='wall'|'body' on pocket/hole (ray-cast wall depth handles hollow shells correctly); intended_for='print'|'machine'|'drawing' on hole drives ModelThread; verify_feature diffs actual-vs-expected volume change to catch silent failures; visibility hygiene at save hides consumed inputs; register_handle + run_script auto_register close the escape-hatch one-way trapdoor; list_thread_options surfaces the coupled ThreadType/ThreadSize enums dynamically; revolve has an OCCT pre-check that flags axis-coincident edges with an actionable error.

  • Selection layer — list_faces / list_edges / query_faces / resolve_* produce stable geometric tags that survive edits; FEM constraints take tags directly.

  • Rendering — host-side software rasterizer (ankusdrive/render.py) with per-pixel z-buffer (render_view / render_views return PNGs as MCP ImageContent), plus photoreal render_photoreal via the FreeCAD Render addon + an external renderer (POV-Ray / LuxCore / Appleseed / Cycles / OSPRay / PBRT). Support matrix, install, and limitations: docs/RENDERING.md.

  • Simulation surface — engineering-analysis oracles (machine elements, structural, durability, thermal, tolerance/GD&T) plus external-solver families that shell out to OpenFOAM / Elmer / CalculiX / openEMS / YADE / KrakenOS, discovered at runtime by ankusdrive/solvers.py and degrading cleanly when absent. Long solves use an async submit→poll job pattern (*_submit + job_status/job_result/job_list). Catalog and result schemas: docs/SIMULATION_TOOLS.md; proof harness: docs/SIMULATION_EXAMPLES.md. Materials/fluids back these via material_* and fluid_props (mechanical-property / molding / CoolProp corpora).

  • Design-control (PLM) layer — recipes + a relations DAG (parametric regen), feature templates, variant families from a design table, item/part-number identity, a lifecycle/revision state machine, ECO change records with where-used/impact + baselines, a versioned interface registry + Liskov substitutability gate, and project containers with reference-integrity guards. Scoping + rationale: docs/DESIGN_HIERARCHY.md. See Designs, not just parts.

  • Tests — ~980 test functions across ~90 files (worker / MCP / CLI / render / determinism / edit stability / negative paths / perf / multi-agent / simulation families / molding / PLM layer), runnable via tests/run_all.sh (Linux/macOS) or tests/run_all.ps1 (Windows — single-interpreter, skips the Linux-only solver families; see docs/WINDOWS.md). Reliability harness (Layer A classification, B diff-detection, C agent-loop closure) is gated behind RUN_RELIABILITY=1; see tests/RELIABILITY.md.

See docs/ROADMAP.md for the Phase 1/2 per-slice record — a changelog of how the surface above was built, frozen at the close of Phase 2. Open work (FEM contact/spring/tie refinements, feature_tree introspection, deeper external-solver integrations) lives on the issue tracker, not in that file.

The committed showcase — every GIF, render, drawing and exported solid the docs point at, with the script that regenerates each one — is indexed in artifacts/README.md.

Open questions

  • Error model: FreeCAD raises plain Python exceptions from C++; worker catches and serializes them, but stack context across the JSON boundary is still lossy.

  • Async / concurrency: multi-doc shipped (list_documents / set_active_document / close_document), and every long-running solve — CalculiX included, via fem_run_submit — can run off the channel through the *_submit + job_* pattern. The synchronous fem_run remains for small solves. One worker still means one main thread: a job's FreeCAD-side steps (writing the solver input, importing results) run on it, between requests.

Privacy Policy

AnkusDrive runs entirely on your computer and collects nothing: no telemetry, no analytics, no accounts, and no network requests from its own code. It reads and writes only the files you point it at, plus its config file and temp working directories. Your MCP host (e.g. Claude Desktop) sends tool inputs and results to its AI model provider under the host's own policy. The full policy, including exactly what is stored where, is in PRIVACY.md.

Evaluating the Claude Desktop extension? The reviewer guide covers installation, a setup check, and three example prompts with expected results.

License

Licensed under the Apache License, Version 2.0. Contributions submitted to this project are licensed under the same terms (Apache 2.0 §5: inbound = outbound), which means contributors retain copyright but grant the project — and everyone downstream — a perpetual, irrevocable license to use their work, including a patent grant. The intent is to keep the project welcoming to contributors while ensuring nobody can later re-proprietize what they contributed.

The code is Apache-2.0; the name is not. Apache-2.0 §6 grants no trademark rights, so the AnkusDrive word mark and the brand assets in logo/ are covered separately — see TRADEMARKS.md for what you may do without asking (referring to the project, compatibility claims, redistribution, packaging, and forking all qualify) and NOTICE for the attribution a redistributor must carry.

References

Available Tools

286 tools
acoustic_fem_submitAcoustic FEM SubmitA
Destructive

Acoustic FEM via Elmer HelmholtzSolve (SIMULATION_NEXT Tier B1), asynchronous — the higher-order twin of acoustic_screen, gated against its exact closed forms. Requires ElmerSolver; when absent this returns {ok:false, reason, install} rather than raising.

kind='duct': a closed duct driven p=1 at x=0, rigid at x=L, at f = kL·c/(2πL) (keep kl off the quarter-wave resonances) — the rigid-end pressure has the exact oracle 1/cos(kL), so p_end_ratio ≈ 1 machine-tight. kind='cavity': a rigid lx_m × ly_m cavity excited by a corner Wave Flux source, swept ±span_pct% around the exact (mode_nx, mode_ny) eigenfrequency in n_steps Scanning steps; the in-phase corner-probe response flips sign through resonance, and the 1/A zero-crossing gives f_solved_hz with mode_ratio ≈ 1 (<0.1%). Also accepts a prepared case_dir.

Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for duct {ok, p_end_re, p_end_exact, p_end_ratio (≈1), p_mean_ratio, frequency_hz, case_dir} | cavity {ok, f_solved_hz, f_exact_hz, mode_ratio (≈1), mode, case_dir}.

ParametersJSON Schema
NameRequiredDescriptionDefault
klNo
nxNo
nyNo
sifNocase.sif
kindNoduct
lx_mNo
ly_mNo
c_m_sNo
mode_nxNo
mode_nyNo
n_stepsNo
case_dirNo
length_mNo
span_pctNo
n_elementsNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare destructiveHint=true, readOnlyHint=false, and openWorldHint=false. The description adds crucial behavioral context beyond that: the asynchronous nature ('job_id, status, cache_hit'), the dependency on ElmerSolver, the fact that it returns a degradation dict or job ID, and the exact return structure for both duct and cavity types. No contradictions with annotations.

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 relatively long, but it is well-structured with distinct sections for duct and cavity modes, and every sentence adds substantive information about physics, parameters, or returns. It is appropriately front-loaded with the purpose and the sibling relationship, and the length is justified by the tool's complexity. A 4 reflects that it is not overly concise but each part earns its place.

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 tool with 15 parameters, no output schema, and no required params, the description covers the two analysis modes, the physics, the return formats, the dependency on ElmerSolver, and the async behavior. It is fairly complete, though it omits explicit explanations for a few parameters (nx, ny, sif, n_elements, length_m) and the degradation dict is only mentioned without detail. Still, it provides enough context for an agent to understand the tool's purpose and likely usage.

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?

With 0% schema description coverage, the description carries the full burden of explaining the 15 parameters. It gives meaningful semantic context for many key ones (kl, mode_nx, mode_ny, span_pct, n_steps, case_dir, lx_m, ly_m) through physics descriptions and formulas. However, it does not explicitly explain every parameter (e.g., nx, ny, sif, length_m, n_elements), leaving minor gaps, so a 4 is appropriate rather than 5.

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 action (submit acoustic FEM) with two explicit modes (duct and cavity), and immediately distinguishes itself from the sibling acoustic_screen as 'the higher-order twin'. It clearly communicates the resource being acted upon and the physics being solved, making it distinguishable without opening any 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?

Explicitly names the alternative `acoustic_screen` and frames itself as the higher-order, more accurate FEM version, implying when each should be chosen. It also states the precondition `Requires ElmerSolver` and the graceful fallback when absent, which guides the agent about environment requirements and expected behavior.

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

acoustic_radiation_submitAcoustic Radiation SubmitA

Exterior-acoustics boundary-element solve on Bempp, asynchronous (OFF the MCP channel) — the real-field twin of the analytic monopole_sphere / rigid_sphere_scattering oracles. Bempp is MIT but needs meshio>=4 (clashing with solidspy's meshio==3 in the shared venv), so it is run ONLY out-of-process via ankusdrive/bempp_runner.py under a dedicated .venv-bempp; degrades to {ok:false, reason, install} when no bempp venv resolves.

problem='radiation' (default): a pulsating (monopole) sphere of radius a_m, uniform surface velocity u_amp at freq_hz, into air (rho,c), mesh size h (fraction of a). The result's radiated_power_w / farfield_pressure_x_r vs the monopole_sphere oracle (ratio≈1) IS the gate. problem='scattering': a rigid sphere insonified by a unit plane wave; sweep ka_list, report the far-field form function at theta_deg angles (h_per_wl elements/wavelength) — gated against the rigid_sphere_scattering Mie oracle. problem='mesh_solve': a radiation solve on a REAL FreeCAD model (handle), tessellated to a surface mesh here and fed to the BEM engine (scale_to_m mm→m, linear_deflection mesh tolerance).

Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result for {ok, ka, radiated_power_w, farfield_pressure_x_r, surface_pressure_abs_mean, n_elements, wall_s} (radiation/mesh_solve) or {results:[{ka, form_function_abs{}, backscatter_abs, n_elements}]} (scattering).

ParametersJSON Schema
NameRequiredDescriptionDefault
cNo
hNo
a_mNo
r_mNo
rhoNo
modelNo
u_ampNo
freq_hzNo
ka_listNo
problemNoradiation
timeoutNo
h_per_wlNo
theta_degNo
scale_to_mNo
linear_deflectionNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations only provide readOnlyHint=false and destructiveHint=false, so the description carries the burden of explaining async out-of-process behavior, dependency conflicts, and degradation on missing venv. It does not fully disclose what happens to stale jobs, cache behavior, or potential resource consumption, but it covers the key operational facts.

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 information-rich, but it is fairly long and packs many details into a single paragraph without clear structure. It front-loads the core purpose and async caveat, though the parenthetical details about meshio and venv could be more compact. Overall, every sentence adds value, so it earns a 4 rather than a 5 for structure.

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 description covers the three modes, the gating oracles, return shapes, degradation behavior, and the relationship to acoustic_fem_submit. However, there is no output schema and the description doesn't explicitly explain how the returned job_id should be polled or what timeout means in the async context. For a 15-parameter asynchronous tool with no output schema, it is close but not fully 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. It explains many parameters in context: a_m, u_amp, freq_hz, rho, c, h, ka_list, theta_deg, h_per_wl, model, scale_to_m, linear_deflection, problem. It still leaves timeout and some optional fields' exact ranges unexplained, but the major usage semantics are covered.

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 clearly states that this tool performs an exterior-acoustics boundary-element solve on Bempp, covering three problem modes (radiation, scattering, mesh_solve), and contrasts itself with analytic oracles and the acoustic_fem_submit sibling. It is specific about the resource and the operation.

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 explains when to use this tool: for exterior-acoustics BEM problems, and explicitly says it is the twin of monopole_sphere and rigid_sphere_scattering analytic oracles, with gating criteria. It also warns when it should not be used or when it degrades to a failure dict due to missing Bempp venv, which effectively guides an agent away from relying on it in unsupported environments.

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

acoustic_screenAcoustic ScreenA
Read-only

Closed-form acoustics screen (NO solver). kind: 'cavity_modes' (lx/ly/lz_mm -> the lowest n_modes rigid-cavity eigenfrequencies f=(c/2)·√(Σ(n/L)²) with [nx,ny,nz] indices — exact, and the future oracle for the planned Elmer HelmholtzSolve FEM) | 'helmholtz' (neck_area_mm2 + neck_length_mm + cavity_volume_mm3 -> resonance with flanged end correction — ±10 %) | 'mass_law' (frequency_hz + surface_density_kg_m2 -> limp-wall TL = 20·log₁₀(f·m″)−47 dB — ±3 dB) | 'duct_cutoff' (duct_width_mm or duct_diameter_mm -> first cross-mode; plane waves only below — exact). Sound speed from air at t_ambient_c unless c_m_s given. Fidelity is labeled per kind; escalate to the Elmer acoustic_fem_submit solve (Tier B1) when the margin is within ~2× the band.

Returns {kind, c_m_s, fidelity, band_pct, band_db, valid_range_ok, warnings, escalate_to} plus per kind: {modes:[{f_hz,n}], f_fundamental_hz} | {f_resonance_hz, neck_radius_mm, l_eff_mm} | {tl_db, fm_product} | {f_cutoff_hz, geometry}.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes
c_m_sNo
lx_mmNo
ly_mmNo
lz_mmNo
n_modesNo
t_ambient_cNo
frequency_hzNo
duct_width_mmNo
neck_area_mm2No
neck_length_mmNo
duct_diameter_mmNo
cavity_volume_mm3No
surface_density_kg_m2No

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the read-only annotation by revealing exact formulas, accuracy tolerances (±10 %, ±3 dB), sound-speed dependency, return fields, and the `escalate_to` signal. It also distinguishes exact vs approximate branches. No contradiction with annotations.

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 information-rich, but delivered as one long pipe-separated block; the front-loaded 'NO solver' is helpful. It could benefit from clearer per-kind bullets or a summary sentence, but every clause adds necessary behavior.

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 14-parameter tool with no output schema and no enum annotations, the description fully covers accepted kinds, required parameter combinations, return shape, and escalation route. An agent has enough to call it correctly without opening schemas.

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?

With 0% schema coverage and no enums, the description carries the full burden of documenting 14 parameters. It maps each `kind` to exactly the required params (e.g., `lx_mm`/`ly_mm`/`lz_mm` for cavity_modes, `neck_area_mm2`+`neck_length_mm`+`cavity_volume_mm3` for helmholtz) and explains `t_ambient_c` vs `c_m_s`. This is comprehensive compensation.

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 opens by declaring a specific function—closed-form acoustic screening—and explicitly says it is NOT a solver. It enumerates each `kind` with its formula and application, which cleanly distinguishes it from the solver sibling `acoustic_fem_submit` and other acoustics tools.

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 provides a clear decision rule: use this closed-form screen for estimates, and escalate to Elmer `acoustic_fem_submit` when margins are within ~2× the fidelity band. It does not enumerate comparisons to every acoustic sibling (e.g., `waveguide_cutoff`), so guidance is strong but not exhaustive.

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

add_annotationAdd AnnotationA

Add a free text annotation to a drawing page at page position (x, y) in mm (origin bottom-left, +Y up, matching TechDraw view placement). Returns {handle, name, text}.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
nameNoNote
pageYes
textYes

TDQS

A3.6/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint: false, destructiveHint: false), the description adds meaningful behavioral context: it specifies the coordinate system (origin bottom-left, +Y up, mm) and the exact return value ({handle, name, text}). This helps the agent understand the side-effect of creation and the expected output without contradicting the annotation flags.

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?

Two tightly packed sentences: the first states the core action and positional context, the second lists the return fields. No filler words, and the most decision-relevant information (the spatial behavior) is front-loaded.

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 simple mutation with five parameterstons and no output schema, the description covers the key facets: what is added (free text), where (page position with mm), and what is returned. It lacks details about potential side effects or page identification nuances, but those are likely implicit in the CAD context. Given the tool's simplicity, this is sufficiently complete.

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?

With 0% schema description coverage, the description must compensate. It explains x and y as page coordinates in mm with a defined origin and orientation, and implies text is free form. However, it leaves 'page' and 'name' semantics implicit (though their roles are somewhat predictable). The description partially fills the gap but not fully.

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 the action and resource: 'Add a free text annotation to a drawing page.' The phrase 'free text annotation' distinguishes it from dimension, feature note, GDT callout, and other annotation siblings. It doesn't name an alternative explicitly, but the specificity of 'free text' plus the coordinate placement details makes the purpose unambiguous.

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 guidance on when to use this tool versus the many similar annotation tools in the sibling list (e.g., add_dimension, add_feature_note, add_gdt_callout, annotate_face). The only implicit hint is the phrase 'free text annotation,' but no conditions, exclusions, or alternatives are mentioned. An agent would have to infer usage from the name and description alone.

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

add_bearingAdd BearingA

Add a deep-groove ball bearing as an assembly envelope solid: an annular ring (outer-diameter cylinder minus bore cylinder) of the given width, axis along +Z. Balls/races are not modeled — this is the fit envelope a coordinator needs to size the shaft, the housing bore, and the shoulder spacing.

Specify dimensions ONE of two ways:

  • designation: a standard metric series code, looked up in a built-in table. Known: "608", "623", "624", "625", "626", "688", "6000", "6200", "6800", "6900". (e.g. "608" -> bore 8, OD 22, width 7 mm.)

  • bore + outer_diameter + width: explicit dims in mm (all three required). Explicit values override a designation's table values when both are given.

bore: inner-bore diameter mm (sizes the shaft). outer_diameter: OD mm (sizes the housing bore). width: axial length mm (shoulder spacing). placement: optional [x, y, z] mm translation of the bearing's near face.

seals: open (default) | RS | 2RS | RZ | 2RZ | Z | 2Z. It changes no geometry — the envelope is identical — but it IS part of the orderable identity: 608, 608-2Z and 608-2RS are three different purchases with different drag, speed limits and prices. It is folded into the canonical designation stamped on the part ("608-2RS").

A bearing built from raw bore/OD/width with NO designation is a dimensional envelope, not a purchasable part, and is deliberately left undesignated rather than given a made-up catalog number.

Raises ValueError if the designation is unknown and dims are incomplete, or if outer_diameter <= bore.

Returns {handle, name, designation, bore, outer_diameter, width, volume, orderable, catalog}. handle starts "bearing_". designation is None when built from explicit dims; orderable is the designation card, whose own designation carries the seal suffix; catalog is the off-the-shelf verdict (stocked or not, None for an undesignated envelope).

ParametersJSON Schema
NameRequiredDescriptionDefault
boreNo
nameNoBearing
sealsNoopen
widthNo
placementNo
designationNo
outer_diameterNo

TDQS

A4.6/5.0
Behavior5/5

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

The description goes well beyond the annotations by detailing error conditions ('Raises ValueError if the designation is unknown... or if outer_diameter <= bore'), the return payload with field meanings (handle, designation, orderable, catalog), and the semantic distinction between an orderable designation and a raw dimensional envelope. It also clarifies that seal variants do not change geometry but are part of the orderable identity, which is non-obvious behavior. No contradiction with the readOnlyHint=false annotation.

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 purpose and geometry, then organizes the two specification modes, seal semantics, and error/return behavior in a logical flow. While it is long (about 300 words), each section carries necessary semantic detail and no filler. It could be more scannable with bullets, but the paragraph structure is coherent.

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?

Given the tool has no output schema and the annotations are minimal, the description compensates by explaining the full return contract: the returned handle prefix, the None designation for explicit-dimension envelopes, and the orderable/catalog semantics. It also covers coordinate orientation, placement, and error cases. The only missing context is the 'name' parameter, which is a minor defaulted field.

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?

With 0% schema coverage, the description must explain all parameters and largely does: bore, outer_diameter, width, designation, seals, and placement each receive explicit meaning and application (e.g., 'bore: inner-bore diameter mm (sizes the shaft)'). It even provides a known-designation list and an example mapping. The only omitted parameter is 'name', which is a generic defaulted string, so the gap is minor.

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 opens with a specific verb and resource: 'Add a deep-groove ball bearing as an assembly *envelope* solid'. It clarifies the geometric nature (annular ring, axis along +Z, balls/races not modeled) and distinguishes it from other mechanical component adders like add_gear or add_pulley. The mention of the coordinator's sizing needs further specifies its role.

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 description states the intended use case: 'the fit envelope a coordinator needs to size the shaft, the housing bore, and the shoulder spacing.' It also explains the two mutually exclusive input modes (designation vs explicit dims) and when explicit values override table values. However, it does not name sibling alternatives or explicitly say when not to use this tool.

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

add_dimensionAdd DimensionA

Add dimension(s) to a drawing page.

Modes (pick one):

  • auto=True: overall horizontal + vertical extent dimensions for every part-view (or only those named in views, by name or projection code).

  • view + edge=: dimension the true length of a model edge, projected into that view. The printed value is the real measured length, not the foreshortened projection.

  • view + kind='diameter'|'radius' + edge=: a ⌀/R dimension of a hole or arc.

  • view + kind='angle' + face=: the half-angle (or, by default, the 2× included angle) of a conical face — the curved angle a machinist sets for a chamfer cone / countersink / taper (issue #108). Pass half_angle=True to call out the half-angle instead.

  • view + from_point/to_point ([x,y,z] model points): dimension between two 3D points. view: a view handle, object name, or projection code ('Front', 'Top', ...). kind: 'aligned' (default) | 'horizontal' | 'vertical' | 'diameter' | 'radius' | 'angle'. tolerance: optional, rendered next to the value (a machinist needs it to make the part to size): {"sym": 0.1} for ±0.1, {"plus": .., "minus": ..} for an asymmetric tolerance, or {"fit": "H7"} / {"fit": "H7/g6"} to look up ISO 286 hole-side limits at the dimension's basic size. Returns {dimensions: [{handle, name, type, value}, ...]} — value is the true measured size of each dimension created.

ParametersJSON Schema
NameRequiredDescriptionDefault
autoNo
edgeNo
faceNo
kindNoaligned
pageYes
viewNo
viewsNo
to_pointNo
toleranceNo
from_pointNo
half_angleNo

TDQS

A4.4/5.0
Behavior4/5

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

The description discloses the return shape, that the printed value is the true measured length (not foreshortened), and how tolerances are rendered. Annotations already flag the tool as non-read-only and non-destructive; the description adds useful behavioral specifics without contradicting them, though it does not detail document-level side effects like save/undo.

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 long but well-structured: a one-line purpose, bulleted modes, a parameter key, and a return-value note. It is front-loaded with the core purpose and each section earns its place, though a few details (e.g., 'issue #108', the machinist aside) are minor extras.

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 an 11-parameter tool with no output schema and no schema param descriptions, this is highly complete: it covers modes, tolerance semantics, view resolution, and the return value. It omits an explicit treatment of the required page parameter and error/edge cases, but those are minor given the overall clarity.

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%, so the description carries the full weight, and it does: it explains every mode, the allowed kind values, tolerance JSON formats, point arrays, views naming, and half_angle. The only required parameter, page, is implied by the opening sentence; all other parameters receive explicit semantic meaning beyond the bare schema.

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 opens with a specific verb and resource ('Add dimension(s) to a drawing page') and then enumerates five distinct modes, making the tool's purpose unmistakable. It is clearly differentiated from sibling annotation/note/GDT tools by its focus on measurements and dimension objects.

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 'Modes (pick one)' section acts as an internal decision tree, telling the agent exactly when to use auto vs. view+edge vs. view+face vs. from/to points. It does not explicitly name sibling alternatives or exclusions, but the context is clear and actionable.

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

add_fastenerAdd FastenerA

Add a standard ISO metric fastener (screw / bolt / nut / washer) as a solid.

kind: one of "socket_head_cap_screw", "hex_bolt", "hex_nut", "washer".

  • socket_head_cap_screw: cylindrical head with a cosmetic hex socket + plain shank (threads not modeled).

  • hex_bolt: hex head (across-flats) + plain shank.

  • hex_nut: hex prism with an axial clearance hole.

  • washer: flat annular ring. size: ISO designation, one of "M3","M4","M5","M6","M8","M10","M12". length: shank length in mm. REQUIRED for socket_head_cap_screw and hex_bolt; ignored for nut/washer. grade: optional material / property class AS ORDERED — ISO 898-1 for steel screws ("8.8", "12.9"), ISO 898-2 for nuts ("8", "10"), ISO 3506 for stainless ("A2", "A4-80"). It changes no geometry. What it changes is the ORDERABLE designation stamped on the part: with it you get "ISO 4762 M4×12 A2", which a buyer can quote; without it the designation comes back complete=False saying nobody has chosen between class 8.8 steel and A2 stainless yet. An unrecognised grade is a loud error, never a guess. placement: optional [x, y, z] mm translation of the fastener origin (head top sits at z=0, shank runs in -z for screws/bolts). name: optional object name (default derived from kind).

All dimensions are in mm. Threads are cosmetic (the shank is a plain cylinder of the major diameter).

Returns {handle, name, kind, size, major_diameter, pitch, volume, designation, orderable} plus, by kind: screws/bolts add {length, head_diameter, head_height, model_thread:false}; nut adds {head_diameter (wrench across-flats), head_height}; washer adds {head_diameter (outer diameter), head_height (thickness)}. Mating numbers: drill a through-hole of major_diameter (+ clearance) for the shank; head_diameter sizes a counterbore. designation is the canonical orderable identity ("ISO 4762 M4×12 A2") and orderable its full card. catalog is the off-the-shelf verdict computed at creation time — code stocked, or not_stocked naming the lengths either side. A length nobody stocks is a FINDING, not a refusal: the solid is still built, so you can decide whether to move the stack-up or accept a special.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes
nameNo
sizeYes
gradeNo
lengthNo
placementNo

TDQS

A4.8/5.0
Behavior5/5

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

The description adds substantial behavioral detail beyond the minimal annotations: threads are cosmetic, grade changes only the orderable designation, unrecognized grades are loud errors, non-stocked lengths still produce a solid, and return fields vary by kind. This gives the agent an accurate model of side effects and edge cases.

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 long but every sentence carries essential information, and it is well-structured with per-kind bullets and a grouped return list. It remains readable despite its density because the information is organized and front-loaded.

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?

There is no output schema, so the description must explain return values and edge cases, and it does so thoroughly: per-kind extra fields, mating hole guidance, designation/orderable semantics, and catalog findings. An agent has enough context to call 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?

With 0% schema description coverage and no enums, the description fully compensates by documenting every parameter: the kind values, valid ISO sizes, length requirements, grade semantics and standards, placement coordinate system, and name default. This is far richer than the bare input schema.

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 verb and resource: 'Add a standard ISO metric fastener (screw / bolt / nut / washer) as a solid.' It clearly enumerates the four kinds and gives enough detail to distinguish the tool from sibling add_* tools like add_bearing or add_gear.

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 description gives strong context for when to use the tool: adding standard ISO metric fasteners as solids, with detailed per-kind behavior. However, it does not explicitly mention alternatives or exclusions, leaving some of the when/not-when guidance implicit.

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

add_feature_noteAdd Feature NoteA

Attach an explicit manufacturing NOTE that satisfies a curved/periodic feature the drawing_gate enumerates (issue #108) — the 'per CAD model / profile table' coverage for geometry a single number can't capture (a freeform/BSpline wall's profile, a tooth pattern's full parameter set) or a documented cone angle. feature is the enumerated feature id (e.g. 'FREEFORM1', 'PAT1', 'CONE1', from drawing_gate's enumerated_features); text defaults to a sensible callout. The gate reads the note back as coverage. Returns {handle, name, feature, text}.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
kindNofeature
nameNoFeatureNote
pageYes
textNo
featureYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already signal this is not read-only and not destructive, so the description's main job is to add context beyond that. It does: it explains that text defaults to a sensible callout, that drawing_gate reads the note back as coverage, and that the tool returns a specific object shape. This meaningfully clarifies the tool's effect.

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: the core purpose appears first, followed by useful examples and the return shape. The parenthetical issue reference adds some noise, but overall every sentence contributes meaningful selection or invocation guidance.

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?

Given the tool has 7 parameters and no output schema, the description covers the key external dependency (drawing_gate's enumerated_features), the return value, and the default text behavior. It is slightly incomplete around what 'page' refers to and where x/y place the note, but it is sufficient for an agent familiar with drawing-page tools to invoke it 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 description coverage is 0%, so the description must compensate. It does explain the most important parameter, 'feature', with enumerated examples and its source, and it clarifies that 'text' defaults to a callout. However, required parameter 'page' is left unexplained, and x/y, kind, and name receive no semantic guidance beyond schema defaults.

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 action ('Attach an explicit manufacturing NOTE') and resource, and ties it to a concrete purpose: satisfying curved/periodic feature coverage that drawing_gate enumerates. It distinguishes itself from generic annotation tools by explaining that it handles geometry a single number cannot capture.

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 description clearly indicates when to use the tool: for freeform/BSpline profiles, tooth patterns, and cone angles that need per-CAD-model or profile-table coverage. It does not explicitly name alternative sibling tools or say 'use X instead', but the contrast with 'geometry a single number can't capture' implies the boundary against simple dimension/annotation tools.

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

add_gdt_calloutAdd GD&T CalloutA

Place a GD&T feature control frame on a drawing page.

Declaring geometric tolerance ON THE DRAWING (rather than only checking a measurement with gdt_check) is what makes it inspectable: the frame renders as a real compartmented symbol, and inspection_plan / fai_report read it back as a characteristic with its own balloon and measurement method.

control: an ASME Y14.5 geometric characteristic — the same vocabulary gdt_check accepts: flatness, straightness, circularity, cylindricity, profile_line, profile_surface, perpendicularity, parallelism, angularity, position, concentricity, runout, total_runout. zone: tolerance zone in mm (rendered with a Ø for the diametral controls — position, concentricity, circularity, cylindricity). datums: the ordered datum reference frame, e.g. ["A", "B", "C"]. A control with datums is CMM work; a datum-free form control is surface-plate work, and the inspection plan picks the instrument accordingly. feature: optionally the enumerated feature id (drawing_gate's enumerated_features) the frame controls. mmc_bonus: material-condition bonus tolerance carried into inspection, mm. modifier: free text printed in the tolerance compartment (e.g. "Ⓜ"). x / y: page position in mm (origin bottom-left, +Y up, like add_annotation).

Returns {handle, name, control, zone, datums, text}.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
nameNoFcf
pageYes
viewNo
zoneYes
datumsNo
controlYes
featureNo
modifierNo
mmc_bonusNo

TDQS

A4.3/5.0
Behavior5/5

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

Annotations provide only readOnlyHint/openWorldHint/destructiveHint flags, so the description carries the full disclosure burden. It reveals that the frame renders as a real compartmented symbol, that diametral controls render with a Ø, that inspection_plan/fai_report read the callout back as a characteristic, and that datums change the selected inspection instrument. This goes well beyond what annotations or schema provide.

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 lengthy but organized: purpose first, then a clarifying contrast, then a scannable parameter list, then the return shape. Every section adds useful information, though the CMM/surface-plate explanation is slightly beyond what is strictly needed to invoke the tool correctly.

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?

Given the 11 parameters, no output schema, and zero schema coverage, the description covers most invocation needs: parameter meanings, coordinate origin, return fields, and downstream inspection behavior. It is not fully complete because the required page parameter remains unexplained and optional view/name semantics are absent.

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?

With 0% schema description coverage, the description compensates substantially: it documents control values, zone units, datums format, feature source, mmc_bonus, modifier, and x/y coordinate conventions. However, the required page parameter is never defined, and view and name receive no semantic guidance, leaving a meaningful gap for a required argument.

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 opens with a concrete verb-resource pair, 'Place a GD&T feature control frame on a drawing page,' and explains what the result is: a real compartmented symbol readable by inspection tooling. It explicitly distinguishes itself from gdt_check by framing this as declaring tolerance on the drawing rather than only checking a measurement.

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 description explicitly states when to use this tool instead of gdt_check: declaring the tolerance on the drawing is what makes it inspectable by inspection_plan and fai_report. It also adds useful downstream context about datum-based controls being CMM work versus datum-free form controls being surface-plate work, though it does not enumerate exclusions against other annotation tools such as add_annotation or add_dimension.

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

add_gearAdd GearA

Add an involute spur gear (FreeCAD's core involute generator), extruded to a solid.

teeth: tooth count (>= 3). module: mm (pitch diameter = module * teeth). height: extrusion thickness mm. pressure_angle: deg (default 20). external: True for an external gear; False for an internal/ring tooth profile. placement: optional [x, y, z] mm translation. Returns {handle, name, volume, pitch_radius, tip_radius, root_radius, teeth, module, external}. Two external gears MESH when their axes are spaced (pitch_radius_a + pitch_radius_b) apart; phase one by half a tooth to avoid tooth-on-tooth interference.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoGear
teethYes
heightNo
moduleYes
externalNo
placementNo
pressure_angleNo

TDQS

A4.6/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses that the result is extruded to a solid, lists the exact return fields, and explains meshing behavior for external gears (spacing equal to pitch_radius_a + pitch_radius_b plus half-tooth phasing). This adds meaningful behavioral context beyond what annotations convey.

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 compact and efficiently structured: it opens with the core purpose, then systematically lists each parameter, followed by the return fields and a practical meshing note. Every sentence provides essential information without redundancy or filler.

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?

Given 7 parameters, no output schema, and minimal annotations, this description gives the agent everything needed to call the tool correctly: parameter meanings, formulas, defaults, return values, and even inter-gear spacing guidance. Nothing critical is missing for successful invocation.

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?

With 0% schema description coverage, the description fully compensates by explaining teeth (minimum 3), module with the pitch diameter formula, height as extrusion thickness, pressure_angle with default, external as an internal/ring toggle, and placement as an optional translation. It omits only the trivial 'name' parameter which has a 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?

The description clearly states the tool's function: 'Add an involute spur gear (FreeCAD's core involute generator), extruded to a solid.' It uses a specific verb and resource, and mentions the FreeCAD generator, which differentiates it from sibling tools like add_rack, add_sprocket, and add_pulley.

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 description provides comprehensive parameter semantics and a pitch diameter formula, making the usage context clear. However, it does not explicitly mention alternatives or when not to use this tool, leaving the agent to infer from sibling names. This is a clear context without exclusions, but not fully explicit about alternative selection.

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

add_partAdd PartB

Add a part to an assembly via App::Link.

source is one of: {"handle": ""} — link an in-doc body {"path": "/path/to/part.FCStd"} — link first body / subassembly {"path": "/path/to/part.FCStd", "object": "X"} — link named object placement: [x, y, z] or {position: [...], axis: [...], angle_deg: ...}. mate: place by aligning this part's published interface frame to an already-placed parent's, instead of (or after) a raw placement: {"child_iface": "", "parent": "<link-name|handle>", "parent_iface": ""}. Frames come from publish_interface.

ParametersJSON Schema
NameRequiredDescriptionDefault
mateNo
nameNoPart
sourceYes
assemblyYes
placementNo

TDQS

B3.1/5.0
Behavior2/5

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

Annotations indicate readOnlyHint=false (so it's a write operation) and destructiveHint=false, but the description adds little behavioral context. It mentions the App::Link mechanism and references publish_interface for frames, which gives some insight into the linking behavior, but it does not disclose side effects like modification of the active assembly, error behavior when the source is invalid, or whether the operation is reversible. For a mutation tool with minimal annotation coverage, this is a significant 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?

The description is efficiently structured with a clear main sentence followed by bullet-like enumerations for source, placement, and mate. It avoids redundant phrasing and packs useful detail into a compact format. Length is appropriate for the complexity of the parameters, though the missing assembly/name explanations prevent a 5.

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

Completeness2/5

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

Without an output schema, the description should ensure callers know how to invoke the tool correctly. It covers the complex parameters in depth but leaves 'assembly' and 'name' semantically undefined, and it does not mention prerequisites (e.g., an open assembly or how to obtain a handle). The reference to publish_interface implies prior knowledge. Given the nested structures and required parameters, the description is incomplete for an agent to reliably use it without additional context.

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 all parameter meaning must come from the description. The description thoroughly explains 'source' (three formats), 'placement' (array or object), and 'mate' (structure and purpose), but it omits explanations for 'assembly' and 'name.' 'name' has a default but no semantic detail, and 'assembly' is a required string with no description of what it refers to (e.g., assembly handle, path, or ID). Thus it partially compensates for the missing schema but leaves gaps.

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 action ('Add a part to an assembly via App::Link') with a clear resource and method. It goes beyond a tautology by explaining the linking mechanism and differentiating from other add_* tools (e.g., add_primitive, add_gear) which create new geometry rather than link existing sources. The purpose 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 Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives or when not to use it. It explains how to specify sources and mates but never mentions conditions like 'if you need to reference an existing body or external file, use add_part.' There is no reference to siblings or exclusions, leaving the agent to infer usage from the name.

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

add_primitiveAdd PrimitiveA

Add a primitive to the active document.

kind: 'box' (uses w, d, h), 'cylinder' (uses r, h), or 'sphere' (uses r). placement: optional [x, y, z] mm translation. name: optional human-facing name. It sets the object's LABEL — what list_objects, bom_extract and the drawing/manifest layers display — and leaves the internal FreeCAD Name alone, since handles and register_handle key off Name and it must stay unique and stable. Omit it and the label stays the type default ('Box' / 'Cylinder' / 'Sphere'), which BOM and designation checks read as an unnamed generic solid. Returns {handle, name, label, volume}: name is FreeCAD's internal id and label is the display name (equal to name when you passed none). The handle (e.g. 'box_1') is how you reference this object in subsequent boolean_op calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
dNo
hNo
rNo
wNo
kindYes
nameNo
placementNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnly=false, destructive=false), the description discloses important behaviors: the difference between FreeCAD's internal Name and the display label, the effect on list_objects, bom_extract, and drawing/manifest layers, the default-label behavior treated as an unnamed generic solid by BOM/designation checks, and the returned handle's role in later boolean_op calls.

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 its one-sentence purpose, followed by dense parameter explanations and a return-value contract. The longer name/label discussion is justified because it prevents a subtle misuse around FreeCAD Name stability and BOM labeling, with no redundant restatement of schema defaults.

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 seven parameters, no enums, and no output schema, the description is complete: it defines the kind vocabulary, per-kind dimension usage, placement units/format, naming semantics and downstream consequences, and the exact return shape including how the handle is used in subsequent boolean_op calls.

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%, so the description must compensate, and it does. It explains the kind values, which parameters each kind uses (box uses w/d/h, cylinder uses r/h, sphere uses r), that placement is an optional [x, y, z] mm translation, and the precise meaning and side effects of the name 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 action and resource: 'Add a primitive to the active document,' then enumerates the exact supported primitive kinds (box, cylinder, sphere). This clearly distinguishes add_primitive from the many add_* sibling tools such as add_gear, add_bearing, or add_fastener.

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 operational context: it targets the active document, supports optional placement and naming, and tells which dimension parameters apply to each kind. It does not explicitly name alternatives or state when not to use it, but the kind enumeration effectively scopes selection and no exclusions are necessary.

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

add_projection_groupAdd Projection GroupB

Add a multi-view projection group of body to a drawing page. views: list of FreeCAD view codes ('Front', 'Top', 'Right', 'Left', 'Bottom', 'Rear', 'FrontTopLeft', etc.). Default: ['Front', 'Top', 'Right'].

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
nameNoProjGroup
pageYes
viewsNo

TDQS

B3.2/5.0
Behavior3/5

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

Annotations indicate the operation is not read-only and not destructive, which aligns with the 'add' action. The description adds useful detail about the views parameter and the concept of a multi-view projection group, but it does not disclose potential side effects, dependencies (e.g., needing an existing page), or failure modes. This is acceptable given the simple nature of the operation, but it is not overly transparent.

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 concise (two short sentences) and front-loads the core purpose. It avoids unnecessary verbosity, though the views list could be formatted more cleanly. Overall, it is efficient and earns its place.

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

Completeness2/5

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

Given the schema provides no parameter descriptions, the tool description should explain all parameters and any required context. It only partially covers `views` and `body`, omitting `page` and `name`, and does not mention return values or prerequisites. This is a significant gap for a tool that requires two mandatory parameters and likely needs an existing drawing page.

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?

With 0% schema description coverage, the description must compensate, but it only explains the `views` parameter (with example codes) and implicitly mentions `body`. It does not explain `page` or `name`, leaving their roles ambiguous beyond what the schema names indicate. This is insufficient for a 4-parameter tool with no schema-level 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?

The description clearly states the action ('add'), the resource ('a multi-view projection group of `body`'), and the destination ('to a drawing page'). This distinguishes it from sibling tools like add_section_view or add_dimension, making its purpose unambiguous.

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?

The description offers no guidance on when to use this tool versus alternatives such as add_section_view or render_view. It does not mention prerequisites or contexts where this tool is preferred, leaving the agent to infer usage from the name and brief description.

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

add_pulleyAdd PulleyA

Add a timing-belt (or V) pulley as a static solid. Axis is +Z; toothed belt face spans z in [0, width].

teeth: tooth count (>= 6). belt_pitch: belt tooth pitch mm/tooth (e.g. 2.0 for GT2, 3.0 for GT3/HTD-3M); pitch diameter PD = belt_pitch * teeth / pi. width: belt-face length mm. flanged: True adds two thin guide discs (radius PD/2 + 2*belt_pitch) at each end to retain the belt. height: optional mm; OVERRIDES width when given (default height = width). placement: optional [x, y, z] mm translation of the axis base. name: object label.

Returns {handle, name, volume, pitch_diameter, belt_pitch, teeth, width, flanged}. pitch_diameter (mm) is the mating number: the centre distance to a mating pulley plus the required belt length derive from the two pitch diameters and the same belt_pitch.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoPulley
teethYes
widthYes
heightNo
flangedNo
placementNo
belt_pitchYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false. The description adds useful behavioral detail beyond those annotations: the +Z axis orientation, the z-span of the toothed belt face, the flange construction rule, the height-overrides-width behavior, and the exact return dictionary. It does not spell out the side effect on the active document, but the 'add' verb plus the non-read-only annotation make that clear.

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 long but every sentence carries necessary information: formulas, defaults, geometry orientation, and return values. It is front-loaded with the core purpose and then systematically covers each parameter in order, with no filler or repetition.

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?

Given 0% schema coverage and no output schema, the definition is nearly complete: it includes all parameter semantics, units, geometry behavior, and return fields. The only minor gap is that 'V pulley' is mentioned but no parameter or formula is provided for V-groove geometry, leaving that variant underspecified; the timing-belt path is fully covered.

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%, so the description must fully document all 7 parameters, and it does. It explains teeth count minimum, belt_pitch units and pitch-diameter formula, width meaning, flange geometry, height override semantics, placement translation, and the name label. This far exceeds the minimum and gives the agent everything needed to call the tool correctly.

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 opens with a specific action and resource: 'Add a timing-belt (or V) pulley as a static solid.' It clearly identifies the tool's purpose and distinguishes it from sibling add_gear, add_sprocket, and add_bearing tools by focusing on pulley-specific concepts like belt_pitch, teeth, and flanged retainers.

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 description provides clear context for when to use the tool: when a timing-belt or V pulley is needed as a static solid, including mating geometry through pitch_diameter. It does not explicitly name alternative tools or give when-not conditions, but the purpose is specific enough that an agent can select it correctly without opening other schemas.

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

add_rackAdd RackA

Add a linear gear rack (a spur gear's straight counterpart) as a solid.

A rack is a gear of infinite radius: straight-flanked teeth on a rail. Standard full-depth tooth form (addendum = module, dedendum = 1.25module, tooth height = 2.25module, flanks at pressure_angle from vertical).

teeth: number of teeth (>= 1). module: mm (sets tooth size; circular pitch = module * pi). height: extrusion thickness mm along +Y (the rack's face width; default 6). width: mm, rail base-band thickness below the tooth root line (default 10). pressure_angle: deg, flank angle from vertical (default 20; 0 < pa < 45). placement: optional [x, y, z] mm translation of the rack origin. name: object label (default "Rack").

The profile lies in the XZ plane: root line at z=0, base band from z=-width to z=0, teeth from z=0 to z=2.25*module, extruded along +Y by height.

Returns {handle, name, volume (mm^3), pitch (mm/tooth = modulepi), module, teeth, tooth_height (2.25module mm), length (teethmodulepi mm)}. A spur gear MESHES with this rack when their pitch values match (gear module*pi == rack pitch); length sizes the rail for the travel.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoRack
teethYes
widthNo
heightNo
moduleYes
placementNo
pressure_angleNo

TDQS

A4.5/5.0
Behavior4/5

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

With sparse annotations (only readOnlyHint false, destructiveHint false), the description carries the burden of explaining side effects)Skip it: it details the resulting solid's geometry, orientation, plane, defaults, and return values. It does not explicitly state document-level effects, but 'Add ... as a solid' plus the annotations convey the mutation safely.

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 organized with a clear intro, a geometry paragraph, a parameter list, and a return/usage section. Some redundancy exists (e.g., tooth_height appears both in the profile description and the return list), but every piece earns its place for a parametric entity of this complexity.

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?

Despite no output schema, the description enumerates return fields with formulas likely needed for downstream checks. It covers geometry, defaults, constraints, placement, and mating behavior with a spur gear, leaving no critical gap for invoking 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?

Input schema has 0% description coverage, so the description fully compensates by explaining every parameter: teeth, module, height, width, pressure_angle, placement, and name, along with units, defaults, constraints, and formulas. This is exactly the semantic depth needed for correct invocation.

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 ('Add'), resource ('linear gear rack'), and a clarifying definition ('a spur gear's straight counterpart'), which immediately distinguishes it from the sibling add_gear. The dental geometry and context make the tool's 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 Guidelines4/5

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

The description provides clear application context: it explains how a rack meshes with a spur gear and the significance of matching pitch and length. It stops short of explicitly naming when to prefer this over add_gear, but the 'straight counterpart' framing makes the selection context unambiguous.

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

add_ribAdd RibA

Add a reinforcing rib/web inside a PartDesign Body by thickening an OPEN sketch profile into a wall that fuses with the body's surrounding material.

Args: body: handle of the PartDesign Body (from make_body) to add the rib to. sketch: handle of a sketch holding an OPEN spine (a single line, arc, or connected polyline) that defines where the rib runs. Must NOT be a closed loop. The sketch's attachment plane sets the rib's orientation. thickness: rib wall thickness in mm (> 0). midplane: if True (default) the wall is centered on the spine, growing thickness/2 to each side; if False it grows from one side. reversed: flip the extrusion sense (use if the rib lands on the wrong side of its sketch plane). name: object label.

Returns a dict: {handle (starts 'rib_'), name, volume (the whole Body's Shape.Volume in mm^3 after the rib — strictly greater than before the rib, since a rib only adds material), thickness}.

Fallback behaviour the caller should know: FreeCAD's native PartDesign::Rib type is unavailable in AnkusDrive's headless runtime, so the rib is built as an equivalent midplane PartDesign::Pad — the open spine is offset by +/-thickness/2 into a closed footprint and padded across the body so it reaches the surrounding walls. For the usual straight or smoothly-curved spine this matches a Rib; very intricate spines may differ from the native tool. Raises ValueError if the profile is closed/empty/degenerate or thickness <= 0, and RuntimeError if the rib adds no material (spine does not span between walls).

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
nameNoRib
sketchYes
midplaneNo
reversedNo
thicknessYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, the description discloses that the operation mutates the body by adding material, returns the whole body's volume after the rib (strictly greater than before), and details the fallback implementation: native PartDesign::Rib is unavailable, so it builds an equivalent midplane PartDesign::Pad, which may differ for intricate spines. It also lists exact error conditions (ValueError and RuntimeError). This is exceptionally rich behavioral disclosure.

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 a one-sentence summary, then clearly labeled Args, Returns, and Fallback sections. Although long, every section earns its place: parameter meanings, return shape, fallback behavior, and error cases are all operationally relevant. The structure makes the length navigable rather than bloated.

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 mutating CAD operation with no output schema and no schema descriptions, the description is complete. It covers all six parameters, the return dict structure, the fallback implementation, and error conditions. It even explains why volume is strictly greater. Nothing needed to invoke it correctly 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?

The input schema has 0% description coverage, so the description must fully document parameters. It does: body, sketch, thickness, midplane, reversed, and name each have prose explanations, including constraints (thickness > 0, sketch must be open, midplane centering, reversed purpose). This completely compensates for the schema 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 description opens with a precise verb phrase: 'Add a reinforcing rib/web inside a PartDesign Body by thickening an OPEN sketch profile into a wall that fuses with the body's surrounding material.' This clearly states the operation, the resource (PartDesign Body), and the key distinction from siblings: the input must be an OPEN sketch profile. It fully explains what the tool does and makes it distinguishable from pad/pocket/extrude alternatives.

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 description states the intended use case (adding a reinforcing rib/web) and gives critical preconditions: the sketch must be an open spine, not a closed loop, and the attachment plane sets orientation. It also provides fallback context explaining when the native Rib is unavailable. However, it does not explicitly name alternatives or say 'use pad/pocket for closed profiles,' so when-not-to-use guidance is only implied.

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

add_section_viewAdd Section ViewA

Add a cross-section view when the part has internal features the outline / hidden-line views convey ambiguously — a counterbore, a blind hole/bore, or a pocket. The need is judged automatically from the real solid (the same feature enumeration the manufacturability gate uses); the cut runs lengthwise through such a feature so its bore profile and depth read directly, and the view is placed in clear space beside the existing views.

auto (default True): add the section ONLY if the part actually has hidden internal geometry; otherwise return {added: False, recommended: False}. Set auto=False to force a section regardless. process: 'auto' (default) | 'prismatic' | 'turned' — how features are enumerated.

Returns {added, recommended, reasons, feature_ids, view?, normal?, origin?}. (drawing_gate also reports section_recommended so you can decide in advance.)

ParametersJSON Schema
NameRequiredDescriptionDefault
autoNo
nameNoSection
pageYes
symbolNoA
processNoauto

TDQS

A3.9/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false, so the description carries the burden. It explains that the view is added conditionally when auto=True, that the cut runs lengthwise through a feature, and the return structure. It does not contradict annotations; it enriches them with conditional behavior and output details.

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 logically structured: purpose and condition first, then parameter semantics, then return format. It is dense but without filler. The auto explanation is given in a dedicated paragraph, which is useful. It is slightly long but every sentence adds value, so it earns a 4.

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?

Given the tool's role in a drawing workflow, the description covers the core decision (when to add), the key parameters, the return shape, and a related tool (drawing_gate) for pre-decision. It does not mention prerequisites like an existing drawing page, but those may be inferred from the page parameter. Overall it is sufficiently complete for an agent to invoke 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 description coverage is 0%, so the description must compensate. It explains the auto and process parameters meaningfully, including their effect on behavior. However, it does not describe 'page', 'name', or 'symbol', though these are mostly self-evident. This partial coverage leaves some parameters undocumented, so the description does not fully compensate for the schema's silence.

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 ('Add'), resource ('cross-section view'), and a triggering condition ('when the part has internal features... convey ambiguously — a counterbore, a blind hole/bore, or a pocket'). It is clear and actionable. It does not explicitly differentiate from the sibling 'section_view', but the conditional trigger helps distinguish it from a generic section tool.

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 tells when to use the tool (when internal features are ambiguous) and describes the auto parameter that only adds the section if hidden geometry exists, otherwise returns a recommendation flag. It also references drawing_gate as a pre-check for section_recommended, giving a decision path. It does not name alternative tools, so it's not fully explicit on when not to use it, but the context is strong.

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

add_sketch_constraintAdd Sketch ConstraintB

Add a constraint to a sketch.

type: Coincident, Horizontal, Vertical, Distance, DistanceX, DistanceY, Radius, Diameter, Equal, Parallel, Perpendicular, Tangent, Block, Symmetric, Angle. refs: list of [geom_idx, vertex_role] pairs. vertex_role: 0=edge, 1=start, 2=end, 3=center. value: numeric value (mm or radians) for dimensional constraints.

ParametersJSON Schema
NameRequiredDescriptionDefault
refsYes
typeYes
valueNo
sketchYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already indicate this is not read-only (readOnlyHint=false), and the description confirms the mutating 'Add' behavior without contradicting annotations. However, it adds no deeper behavioral context such as whether the constraint is resolved immediately, whether existing constraints are replaced, or what side effects may occur. The non-destructive nature is clear enough for a simple add operation.

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 compact and well-structured: a one-line purpose followed by a concise parameter legend. Every line conveys useful information without filler, and the most important parameters are front-loaded.

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 description gives enough to attempt a call, but it omits important operational details: which constraint types require value, how many refs each constraint type expects, and how the sketch parameter identifies a sketch. For a medium-complexity CAD mutation with no output schema and no schema-level descriptions, this is adequate but has clear 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, and it largely does: it enumerates valid constraint types, explains refs as [geom_idx, vertex_role] pairs with numeric role meanings, and clarifies that value is for dimensional constraints in mm or radians. It does not describe the sketch parameter, but the other three parameters are significantly clarified beyond the bare 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?

The description opens with a clear verb and resource: 'Add a constraint to a sketch.' The listed constraint types and refs format make the tool's purpose concrete. It does not explicitly distinguish itself from sibling tools like add_sketch_geometry, but the action and target are unambiguous.

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?

The description gives no guidance on when to use this tool versus alternatives, nor does it mention prerequisites such as having an active sketch or existing geometry. The intended context is only implied by the name and first sentence, so an agent gets little help choosing it correctly among the many sketch-related siblings.

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

add_sketch_externalAdd Sketch ExternalA

Project an external edge/face/vertex into a sketch as construction geometry.

ref: {handle, edge: tag|'EdgeN'} (or face/vertex variant; or {handle, tag} where tag is e_/f_ prefixed). The projected element gets a negative geom index so subsequent constraints can reference it. Use this to make a sketch that stays anchored to upstream geometry (e.g. a hole 5mm from a tagged edge that survives pad-length edits).

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes
sketchYes

TDQS

A4.4/5.0
Behavior4/5

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

Beyond the readOnly/destructive annotations, the description discloses a non-obvious behavior: the projected element gets a negative geom index so subsequent constraints can reference it. It also clarifies that the result is construction geometry anchored to upstream geometry, which is exactly the kind of behavioral context annotations do not provide.

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 dense and front-loaded: a one-line definition, a compact grammar for ref, a behavior note about negative geometry indices, and a motivating use case. Every sentence contributes information, and there is no filler or repetition of schema fields.

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 tool with a nested object and no output schema, the description covers the essential input grammar, the result behavior, and why the user would want this. It omits prerequisites such as whether the sketch must be open, but the core invocation information is present and usable.

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?

With 0% schema description coverage, the description compensates well by detailing the ref parameter syntax: {handle, edge: tag|'EdgeN'}, the face/vertex variant, and {handle, tag} with e_/f_ prefixes. The sketch parameter is not described, but its name is self-explanatory, and the difficult parameter is covered thoroughly.

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 begins with a specific verb and resource: 'Project an external edge/face/vertex into a sketch as construction geometry.' This clearly distinguishes the tool from siblings like add_sketch_geometry and add_sketch_constraint, and the phrase 'construction geometry' adds precise scope.

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 description gives an explicit use case: 'Use this to make a sketch that stays anchored to upstream geometry' with a concrete example of a hole 5mm from a tagged edge surviving pad-length edits. It does not name alternatives or state when not to use it, but the intended context is clear.

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

add_sketch_geometryAdd Sketch GeometryA

Append geometric primitives to a sketch.

items is a list of dicts:

  • {type: 'line', start: [x,y], end: [x,y], construction?: bool}

  • {type: 'circle', center: [x,y], radius: float}

  • {type: 'arc', center: [x,y], radius, start_angle, end_angle} (radians)

  • {type: 'point', pos: [x,y]} Returns {indices: [...]} — Sketcher-assigned indices for use in constraints.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYes
sketchYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only say the call is not read-only and not destructive; the description adds that it appends geometry and returns Sketcher-assigned indices for use in constraints. It also discloses that arc angles are in radians and that 'construction' is optional on lines, which are useful behavioral details beyond the structured fields.

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 compact and front-loaded: one sentence states the purpose, a bullet list defines the item variants, and a final line documents the return value. Every element adds information needed to call the tool, with no filler or redundancy.

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 tool with no output schema and an empty items schema, the description provides the missing contract: item structures, units for arc angles, and the return shape. It doesn't explain how to identify a sketch, and it doesn't mention failure conditions or interaction with add_sketch_constraint beyond the returned indices, but those are minor gaps given the simple parameter set.

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?

With 0% schema description coverage, the input schema provides no meaning for either parameter. The description compensates well for 'items' by specifying each accepted dict shape and field, but it leaves the 'sketch' string parameter undocumented, assuming the agent will infer it is a sketch identifier.

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 opens with a specific verb-resource pair ('Append geometric primitives to a sketch') and then enumerates the exact primitive types (line, circle, arc, point). This makes it distinguishable from siblings such as add_sketch_constraint and add_sketch_external without needing to inspect their schemas.

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 purpose statement implies the tool is for adding primitives to a sketch, but it never says when not to use it or names alternatives like add_sketch_constraint. For an agent choosing among many CAD tools, the usage context is clear only by inference from the tool name and sibling list.

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

add_springAdd SpringA

Add a helical compression spring: a round wire swept along a cylindrical helix.

All lengths in mm; angles n/a. wire_diameter: wire (stock) diameter d, mm. outer_diameter: spring outer diameter OD, mm (must be > wire_diameter). free_length: uncompressed overall length along the axis, mm. coils: number of turns (active coils), may be fractional. kind: 'compression' (only supported mode in v1; end coils are not squared yet). placement: optional [x, y, z] mm translation of the spring's base.

Geometry: mean coil diameter D = outer_diameter - wire_diameter; coil pitch = free_length / coils. Spring rate is computed for STEEL (shear modulus G = 79.3 GPa) as k = Gd^4 / (8D^3*coils), reported in N/mm.

Returns {handle, name, volume (mm^3), mean_diameter (mm), free_length (mm), coils, kind, solid_height (mm, = coils*wire_diameter, the fully-compressed block height), spring_rate_n_per_mm (N/mm)}. Use free_length, solid_height and spring_rate_n_per_mm to spec the spring into a mechanism (available travel = free_length - solid_height; force = spring_rate_n_per_mm * deflection).

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNocompression
nameNoSpring
coilsYes
placementNo
free_lengthYes
wire_diameterYes
outer_diameterYes

TDQS

A4.6/5.0
Behavior5/5

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

The description goes well beyond the sparse annotations by disclosing key limitations: only 'compression' is supported, end coils are not squared yet, and spring rate assumes steel with a fixed shear modulus. It also explains exactly what the tool computes and returns, giving the agent solid behavioral expectations.

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 long but tightly organized into definition, parameter details, geometry formulas, and return values. Every sentence carries distinct technical value, and the core purpose is front-loaded.

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 no output schema, the description thoroughly documents the return object and explains how to use derived values like free_length, solid_height, and spring_rate_n_per_mm. All input constraints and behavioral assumptions are covered, so an agent can invoke the tool and interpret results 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 fully compensates by defining each parameter with units, constraints, defaults, and geometric meaning. It adds important relationships such as outer_diameter > wire_diameter, fractional coils, and placement coordinates, plus derived output semantics.

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 names a specific verb and resource: 'Add a helical compression spring' and immediately defines the geometric construction. It clearly distinguishes this tool from other add_* and spring_check siblings by scoping it to compression-spring creation.

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 description makes it clear that this tool creates a compression spring and lists its constraints and supported mode, but it never explicitly names alternatives or states when to prefer another tool. Usage context is implied rather than directly contrasted with siblings.

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

add_sprocketAdd SprocketA

Add a roller-chain sprocket (ISO 606 / ANSI), built as a static solid plate.

teeth: tooth count (>= 3). chain_pitch: chain link pitch in mm (e.g. 12.7 for #40 / ANSI 40 chain). roller_diameter: chain roller diameter in mm. height: plate thickness in mm (default 6.0). placement: optional [x, y, z] mm translation.

Build: a disc of tip radius ~= pitch_radius + chain_pitch*0.3 with teeth roller seats (circular pockets, radius roller_diameter/2 * 1.05) cut on the pitch circle, one per tooth. This is a fit/visualisation approximation of the true ISO 606 tooth form, not a load-rated profile.

Returns {handle, name, volume, pitch_diameter, chain_pitch, teeth, tip_radius, bore}. pitch_diameter (mm) = chain_pitch / sin(pi/teeth) and chain_pitch are the MATING numbers: a chain of the same chain_pitch wraps the sprocket, and the centre distance between two sprockets derives from their pitch_diameters. bore is 0 (no shaft hole cut yet — drill one with the hole command).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoSprocket
teethYes
heightNo
placementNo
chain_pitchYes
roller_diameterYes

TDQS

A4.8/5.0
Behavior5/5

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

The description reveals important behavior beyond annotations: it produces a static solid plate, uses an approximate ISO 606 tooth form, is only for fit/visualisation, and returns a bore of 0. This adds meaningful context that annotations do not provide, and nothing contradicts the readOnlyHint/destructiveHint flags.

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 structured into compact sections: purpose, parameter meanings, construction approach, and return values. Every sentence adds useful information, and despite its length, there is no filler or repetition.

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?

Given that there is no output schema and no parameter descriptions, the description provides everything needed to call the tool correctly: parameter semantics, defaults, construction behavior, and a full return-object explanation. It even explains the mating relationship between pitch diameter and chain pitch.

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%, so the description fully compensates. It defines teeth with a minimum constraint, chain_pitch with a concrete example, roller_diameter as chain roller diameter, height with a default, and placement as an optional [x, y, z] mm translation. This adds substantial meaning the schema alone lacks.

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: 'Add a roller-chain sprocket (ISO 606 / ANSI), built as a static solid plate.' This clearly differentiates it from sibling tools like add_gear and add_pulley by naming the exact mechanical component and standard.

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 description gives clear context for when to use it: whenever a roller-chain sprocket is needed. It also includes a when-not limitation ('not a load-rated profile') and a follow-up command (drill the bore with `hole`), though it does not explicitly contrast it against sibling part-creation tools.

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

add_threadAdd ThreadA

Generate a REAL helical ISO-style 60-degree thread as a static solid.

Unlike hole/list_thread_options (which only flag a thread as metadata), this cuts actual helical geometry: a truncated triangular rib swept along a helix and fused to a core cylinder.

All lengths in mm, angles in degrees. diameter: nominal MAJOR (crest) diameter, mm. For internal=True this is the bore the tap fits. pitch: thread pitch, mm per turn (e.g. M8 coarse = 1.25). length: threaded length along +Z from z=0, mm. internal: False (default) -> a finished externally-threaded stud. True -> a TAP/insert cutting-tool solid sized to the bore; fuse it into (or cut it from) a bored hole in your part to produce a threaded bore. starts: number of thread starts, >=1. Multi-start repeats the helix rotated by 360/starts and uses lead = pitch*starts. grade: optional material / property class as ordered ("8.8", "A2"). Changes no geometry; it completes the DIN 976-1 threaded-rod designation stamped on an EXTERNAL single-start thread — that solid is studding, a thing you buy by the metre. An internal thread is a tap-shaped cutting tool and a multi-start is not a stock item, so neither is designated at all. placement: optional [x, y, z] mm translation of the solid's base (default at the origin, axis along +Z). name: optional object name.

Geometry note: the modeled minor (root) uses the ISO 5H/8 truncation; the reported minor_diameter uses the standard ISO formula diameter - 1.0825*pitch. Fallback behaviour: if the helical sweep cannot produce a valid solid the tool returns a plain cylinder tagged with the thread spec and modeled=False (this is rare for sane M-series inputs); always check the modeled flag.

Returns {handle, name, volume (mm^3), major_diameter (mm), minor_diameter (mm), pitch (mm), length (mm), starts (int), internal (bool), modeled (bool), designation, orderable, catalog}. Studding is bought by the bar and cut, so any length up to the longest stock bar reads as stocked with a note that it is a cut. Mating numbers: drill/bore minor_diameter to tap an internal thread; clear a major_diameter (+clearance) hole to pass an external stud.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoThread
gradeNo
pitchYes
lengthYes
startsNo
diameterYes
internalNo
placementNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations carry almost no behavioral information, so the description carries the full burden. It discloses a fallback behavior (plain cylinder with modeled=False if the helical sweep fails), the exact geometric truncation rule, the grade designation logic for orderable studding, and the full return shape. This is far more than the annotations provide and is highly useful for predicting tool behavior.

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 long but well-organized: core purpose, sibling contrast, parameter details, geometry note, fallback, return values, and mating guidance. Nearly every sentence earns its place, though some sections (e.g., the grade/studding explanation) are more elaborate than strictly necessary. Overall it is dense but structured enough to remain navigable.

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 tool with no output schema, the description covers all bases: parameter semantics, geometry model, fallback behavior, return fields, and practical mating usage. An agent has enough information to decide whether to call this tool, set parameters correctly, and interpret the result without additional lookups.

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%, so the description must compensate, and it does comprehensively. Every parameter (diameter, pitch, length, internal, starts, grade, placement, name) is explained with units, defaults, semantic meaning (e.g., internal=True bore sizing), and special cases. The description adds meaning that the bare schema completely lacks.

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 opens with a specific verb and resource: 'Generate a REAL helical ISO-style 60-degree thread as a static solid.' It further distinguishes itself from siblings by explicitly contrasting with `hole`/`list_thread_options`, which only flag thread metadata. This leaves no ambiguity about what the tool does or how it differs from nearby alternatives.

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 explicitly names alternatives and the condition for choosing them: 'Unlike `hole`/`list_thread_options` (which only flag a thread as metadata), this cuts actual helical geometry.' It also gives clear internal/external usage guidance, multi-start behavior, and mating instructions for tapped bores and clearance holes, making when-to-use and when-not-to-use explicit.

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

add_thumbnailAdd ThumbnailA

Place a small isometric pictorial of the part in the top-right corner of the sheet — the "glance" reference a machinist uses to grok the 3-D shape before reading the orthographic views — IF it fits there without crowding the existing views and dimensions.

It is a real TechDraw isometric projection rendered through the same path as the other views (a vector line drawing, not a raster), scaled to fit a reserved top-right box and pinned to that corner (fit_page leaves it put, and it is never dimensioned or counted by the manufacturability gate). Best-effort: when the top-right corner is already occupied it returns {placed: False, reason} rather than overlapping content. Call it AFTER placing the views and dimensions (and after fit_page) so "fits" is judged against the final layout.

Returns {placed, box, scale?, view?, reason?}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoIsoThumb
pageYes

TDQS

A4.3/5.0
Behavior5/5

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

Annotations provide only readOnlyHint=false, openWorldHint=false, destructiveHint=false, so the description carries the burden. It discloses that the thumbnail is a vector line drawing, is pinned to the corner, is left put by fit_page, is never dimensioned or counted by the manufacturability gate, and returns a soft failure rather than overlapping content. This is rich behavioral context beyond annotations.

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?

Every sentence adds distinctive information: purpose, technical rendering path, placement/pinning behavior, failure mode, and call timing. It is dense but not padded, and front-loads the core action.

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 description covers rendering, placement, failure behavior, timing, and return values, which is strong. However, with 0% schema parameter coverage and no output schema, the lack of any parameter semantics leaves a notable gap for an agent to formulate correct arguments.

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 has two parameters with zero description coverage, and the description does not explain what 'page' or 'name' refer to. The only hint is the default 'IsoThumb' in the schema. An agent would not know what value to pass for 'name' or what format 'page' expects.

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 ('Place a small isometric pictorial of the part in the top-right corner of the sheet') and clearly identifies the resource and location. It also distinguishes itself from related drawing tools by emphasizing it is a vector TechDraw projection pinned to the corner, separate from fit_page behavior.

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?

Explicitly instructs to call AFTER placing views, dimensions, and fit_page, so 'fits' is judged against the final layout. It also explains the best-effort soft-failure behavior when the corner is occupied. It does not name sibling alternatives for when not to use, but the placement timing is concrete.

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

annotate_faceAnnotate FaceA
Destructive

Declare the semantic ROLE of a face — what it is FOR — so later edits can be checked against intent instead of re-derived from raw geometry. The role binds to the face's stable f_* tag and persists in the .FCStd as a JSON property bag (same mechanism as publish_interface); it survives save/reopen. Once declared, check_airtight_path accepts the role/name directly (e.g. inlet="inlet").

handle: the part. face: an f_* tag, 'FaceN', or int index of the face to annotate. role: one of 'inlet' | 'outlet' | 'sealing' | 'wetted' | 'ambient' | 'mating'. name: optional unique label for this annotation (default: the role, then role_2, role_3, …); re-using a name updates that annotation. meta: optional dict stored verbatim (e.g. {"spec": "32mm hose"}).

Returns a dict: {handle, name (the annotation key used), role, tag (the f_* the role is bound to), index ('FaceN' at annotation time), roles (sorted list of all annotation names now on the part)}.

ParametersJSON Schema
NameRequiredDescriptionDefault
faceYes
metaNo
nameNo
roleYes
handleYes

TDQS

A4.4/5.0
Behavior4/5

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

The description discloses persistence ('persists in the .FCStd as a JSON property bag', 'survives save/reopen'), update semantics ('re-using a name updates that annotation'), and the full return dict — all beyond the destructiveHint annotation. It accurately represents the mutation, and no contradiction 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?

The description is longer than average but every sentence earns its place: purpose, persistence, integration, parameter details, return value. The parameter block is clearly delineated with 'handle:', 'face:', etc., and the return format is summarized in a compact dict notation. Minor redundancy with the title but 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?

Given no output schema, including the exact return dict is essential and done well. The description covers the tool's role, parameters, persistence, and return value. It doesn't mention potential errors or whether the updated document needs saving, but the persistence note implies it, and the destructiveHint covers the mutation risk. Complete enough for an agent to invoke 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 carries the full burden. It explains every parameter: handle, face (with allowed forms f_* tag, 'FaceN', or int index), role (with explicit enum values), name (with defaulting and update behavior), and meta (with example). This adds critical meaning beyond the bare schema.

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 opens with a specific verb and resource: 'Declare the semantic ROLE of a face — what it is FOR'. It clearly explains the purpose (intent-based editing) and differentiates itself from related tools by referencing check_airtight_path's downstream consumption. The title 'Annotate Face' is expanded, not just restated.

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 description provides clear context: annotations are used 'so later edits can be checked against intent' and explicitly says 'Once declared, check_airtight_path accepts the role/name directly'. It doesn't explicitly mention when not to use it or alternatives like list_face_roles or declare_intent, but the downstream integration and persistence behavior imply the intended use case.

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

assembly_lockAssembly LockA
Destructive

Write a lockfile recording each component's content hash, published- interface hash, and mate dependencies — the provenance baseline a coordinator uses to detect drift across a team. Call after a clean merge. lockfile defaults to .lock.json. Returns {lockfile, components}.

ParametersJSON Schema
NameRequiredDescriptionDefault
lockfileNo
manifestYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true, and the description's 'Write a lockfile' is consistent with that. It adds useful behavioral context beyond the annotations: the lockfile contents, the default path, and the return shape. It does not explain overwrite behavior, but the annotation covers the destructive nature.

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?

Three dense sentences with no filler. The core purpose is front-loaded, followed by a usage condition, default behavior, and return shape. Every sentence earns its place.

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?

There is no output schema, so the explicit return shape '{lockfile, components}' is valuable. The description also covers when to call it and what the lockfile records. It could mention overwrite behavior, but the destructiveHint annotation already signals that.

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 does explain the lockfile parameter's default ('<manifest>.lock.json'), but it does not explicitly describe the required manifest parameter, leaving its exact format or meaning to inference.

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: 'Write a lockfile recording each component's content hash, published-interface hash, and mate dependencies.' This clearly distinguishes it from checking or validating a lockfile, especially with siblings like assembly_lock_check.

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 when to call the tool: 'Call after a clean merge.' This gives a clear usage condition, though it does not mention when not to use it or name alternatives.

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

assembly_lock_checkAssembly Lock CheckA
Read-only

Compare current component files to a lockfile and classify drift (change propagation, RFC §9): modified — file changed since lock interface_changed — published interface frames moved (subset of modified) stale — mates to an interface_changed component and was NOT itself rebuilt: a neighbor that needs re-dispatch new / removed — components added to / dropped from the manifest ok = nothing stale and no new/removed (safe to re-merge without re-dispatch). Returns {modified, interface_changed, stale, new, removed, ok}.

ParametersJSON Schema
NameRequiredDescriptionDefault
lockfileNo
manifestYes

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description explains the logic of each classification, including the subset relationship of interface_changed within modified, what stale means, and the aggregate ok decision. This gives the agent a clear model of the tool's behavior and return semantics.

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 front-loaded opening sentence states the core operation, followed by a tight bullet-like list of categories, the ok rule, and the return object. Every line carries distinct information, and the structure makes the taxonomy easy to scan.

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 description thoroughly covers return values and category semantics despite the absence of an output schema. However, with a bare input schema, it leaves important input details unspecified, such as how to supply the manifest and lockfile and the meaning of the lockfile's null default. Adequate overall, but not complete enough to invoke without additional assumptions.

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?

With 0% schema description coverage, the description must compensate. It clarifies that the manifest is the set of current component files and the lockfile is the comparison baseline, but it does not explain the expected string format, what a null lockfile means, or whether manifest is a path or serialized content. Partial semantics are provided, with clear gaps.

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 action — compare current component files to a lockfile — and enumerates the drift categories it produces. The classification vocabulary (modified, interface_changed, stale, new/removed, ok) makes it distinct from sibling tools like assembly_lock or change_impact.

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 description provides the decision context 'safe to re-merge without re-dispatch', which implies when to use the check. It does not name alternatives or explicitly state when not to use this tool, so it falls short of a full 5.

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

async_demo_submitAsync Demo JobA

Reference async long-solve: launch a job that runs OFF the MCP channel and return immediately, so a multi-minute solve never blocks the worker. (This demo just computes for duration_s then returns a deterministic result; a real FEM/CFD solve plugs into the same facility — see ankusdrive/jobs.py.) Returns {job_id, status, cache_hit}; poll with job_status / job_result. A re-submit with identical (duration_s, value) is a content-hash cache hit (no recompute).

ParametersJSON Schema
NameRequiredDescriptionDefault
valueNo
duration_sNo

TDQS

A4.4/5.0
Behavior5/5

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

Beyond minimal annotations, the description discloses key behavior: execution runs off the MCP channel, returns immediately, produces a deterministic result, supports content-hash cache hits, and returns {job_id, status, cache_hit}. This gives the agent a strong behavioral model without contradicting the annotations.

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?

Three compact sentences cover purpose, behavior, return format, polling, and caching. The key async behavior is front-loaded, and the aside about real solves is brief and useful.

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 simple demo tool with two optional parameters, the description covers launch semantics, return payload, polling routes, and caching. It does not describe possible status values or error conditions, but the core information needed to call and follow up is present.

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 duration_s as the compute time and mentions that identical (duration_s, value) pairs trigger a cache hit, but it does not define what 'value' represents or its units/constraints. Partial compensation only.

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 action: launch an async job that runs off the MCP channel and returns immediately. It clearly identifies the tool as a demo/reference for long-running solves and differentiates it from polling tools like job_status and job_result.

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 explains the intended use case: avoid blocking the worker during multi-minute solves, and explicitly says to poll with job_status / job_result afterward. It does not explicitly enumerate when not to use it versus real FEM/CFD submits, but the 'demo' framing and 'real solve plugs into the same facility' provide clear context.

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

balloon_drawingBalloon DrawingA
Destructive

Number every characteristic on a drawing page with an inspection balloon — each dimension, feature control frame, and feature note gets a numbered circle beside it, rendered on SVG/PDF export. This is the print a quality engineer actually works from, and the key inspection_plan and fai_report row against.

Balloon numbers are an IDENTITY, not an ordinal. They are persisted on the FreeCAD objects, so: re-running on an unchanged page reassigns nothing; adding a dimension appends the next number rather than renumbering the print; and a deleted dimension RETIRES its number instead of passing it to a different feature — an inspection record written against balloon 7 can never come to mean something else. Pass renumber=True to deliberately discard the numbering and start from 1 (which invalidates any inspection record already written).

Call it after the dimensions are placed and fit_page has run. Returns {count, balloons, assigned, kept, retired, next_balloon}; balloons maps each source object name to its number.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageYes
renumberNo

TDQS

A4.4/5.0
Behavior5/5

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

The description goes well beyond the annotations (destructiveHint=true) by explaining the identity semantics of balloon numbers: they are persisted, re-running reassigns nothing, additions append, deletions retire numbers, and renumber=True deliberately discards and invalidates records. It also discloses the return shape, which is valuable since there is no output schema. No contradiction with annotations.

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 longer than average but organized into purposeful paragraphs: what it does, identity/persistence semantics, ordering, and return value. Nearly every sentence carries information, though some framing like 'This is the print a quality engineer actually works from' is contextual rather than strictly necessary. The important behavioral details are front-loaded.

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 tool with no output schema and sparse annotations, the description is highly complete. It covers what the tool does, when to call it, what renumbering means, how deleted numbers behave, and exactly what the return object contains. The only minor gap is the precise form of the page argument, but the surrounding drawing context makes the intent sufficiently clear for an agent to invoke it 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 description coverage is 0%, so the description must compensate. renumber is fully explained, including its default behavior and consequences. However, the required 'page' parameter is only indirectly described as 'a drawing page' and 'fit_page has run'; its exact value format or identifier semantics are never clarified. This leaves one of two parameters under-described.

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 verb and resource: 'Number every characteristic on a drawing page with an inspection balloon,' and enumerates exactly what gets numbered (dimensions, feature control frames, feature notes). It also distinguishes this from related drawing operations by tying balloons to inspection_plan and fai_report, making the tool's unique role clear among siblings like add_dimension, add_annotation, and add_feature_note.

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 description gives explicit sequencing guidance: 'Call it after the dimensions are placed and fit_page has run.' It also explains when renumber=True is appropriate and warns that it invalidates existing inspection records. It does not name alternative tools for the same job, but the ordering constraint and the renumber caution provide clear usage direction.

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

bar_impactBar ImpactA
Read-only

St-Venant bar impact, exact (NO solver): a uniform bar striking a rigid wall end-on. Face stress σ = ρ·c₀·v₀ with c₀ = √(E/ρ) — mass, area and length cancel, so only a slower strike or a softer/lighter material lowers it; contact lasts 2L/c₀ and the bar leaves stress-free at the strike speed (restitution 1). Past the yield velocity v_y = σ_y/(ρ·c₀) the face yields and a bilinear material (tangent_mpa) caps at σ_y + ρ·c_p·(v₀ − v_y), c_p = √(E_t/ρ). E and ρ from youngs_gpa/density_kg_m3 or a Materials-DB material (which also supplies yield). area_mm2 adds force_n. The closed-form twin impact_dynamics_submit is gated against; also the quick ceiling on what any strike at this speed can do to this material. Uniaxial-stress (slender bar) theory.

Returns {wave_speed_m_s, stress_mpa, elastic_stress_mpa, force_n, contact_duration_ms, rebound_velocity_m_s, yield_velocity_m_s, plastic, plastic_wave_speed_m_s, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
area_mm2No
materialNo
length_mmYes
yield_mpaNo
youngs_gpaNo
tangent_mpaNo
velocity_m_sYes
density_kg_m3No

TDQS

A4.5/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint annotation, disclosing detailed behavioral aspects: the exact formula, that mass/area/length cancel, contact duration, restitution, yield behavior, and the bilinear material cap. It also explains how material properties are sourced. This adds significant value beyond the annotations and gives the agent a precise understanding of the calculation's behavior.

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 dense paragraph, but every sentence carries essential information: physics, formulas, parameter sourcing, output list. It front-loads the core purpose and then expands. While it is longer than a minimal description, it is efficient and well-organized, with 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?

Given the tool's complexity (physics, material handling, yield) and lack of an output schema, the description is quite complete. It lists all returned fields, explains the theory, and mentions the twin solver. Minor gaps exist: it does not address error conditions, edge cases (e.g., very low velocity), or how 'fidelity' and 'band_pct' are determined, but these are secondary. Overall, it provides enough for an agent to invoke the tool correctly.

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?

With schema description coverage at 0%, the description compensates by explaining key parameters: it mentions 'youngs_gpa'/'density_kg_m3' and the 'material' option, explains 'area_mm2' adds force, and discusses 'yield_mpa' and 'tangent_mpa' in the yield context. However, it does not explicitly describe 'velocity_m_s' and 'length_mm' (though they are implied by the physics) or clarify the exact role of 'tangent_mpa' beyond the yield cap. Overall it adds substantial meaning but not exhaustive coverage.

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 clearly states the tool's function: 'St-Venant bar impact, exact (NO solver): a uniform bar striking a rigid wall end-on.' It specifies the verb (compute impact) and resource (bar impact), and differentiates from the twin solver impact_dynamics_submit by calling it 'closed-form twin' and 'gated against'. The purpose 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 Guidelines4/5

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

The description provides usage context by contrasting with impact_dynamics_submit ('closed-form twin ... gated against') and notes the theory ('Uniaxial-stress (slender bar) theory'). It implies this is a quick analytical alternative to a full solver, but does not explicitly state when to choose it over other impact tools (e.g., drop_impact) or list conditions where it should not be used. This is a clear but not exhaustive usage guideline.

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

baseline_createBaseline CreateA
Destructive

Pin a labeled, immutable BASELINE (issue #142, C3) — a {item: revision + content fingerprint} snapshot over an items.json registry (a git-tag / lockfile over the item graph) for reproducible rebuilds. The fingerprint pins the artifact BYTES, so a rebuild is verifiable byte-for-byte.

label: the baseline label (e.g. "v1.0"). registry: path to the items.json sidecar. items: optional subset of item ids to pin (default: every item). base_dir: artifact root for fingerprinting (defaults to the registry's directory). note: optional description. out: optional path — write the git-diffable baseline sidecar there.

Returns the baseline object. Deterministic: same state -> identical bytes.

ParametersJSON Schema
NameRequiredDescriptionDefault
outNo
noteNo
itemsNo
labelYes
base_dirNo
registryYes

TDQS

A3.7/5.0
Behavior2/5

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

Annotations declare destructiveHint=true)Skip to content, but the description does not disclose that creating a baseline may be a write/destructive operation (e.g., writing a sidecar file, potentially overwriting existing). It mentions 'write the git-diffable baseline sidecar there' but does not clarify if it modifies the registry or requires special permissions. With destructiveHint not being readOnly, the description should explicitly state side effects. The description does not contradict annotations (it says write, which aligns with destructive), but it fails to carry the burden of behavioral disclosure.

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 well-structured, with an initial summary sentence followed by a paragraph on fingerprinting and then parameter explanations. It is front-loaded with the core purpose. However, it includes extra context (issue #142, C3) which may be unnecessary for tool invocation, slightly reducing conciseness. Overall, it's efficient and readable.

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?

Given that the tool has 6 parameterscars with complex semantics, the description covers each parameter and the return value ('Returns the baseline object'). It also mentions determinism. However, it doesn't explain error conditions or how the 'out' path interacts with the registry, but this is minor. With no output schema, the description's mention of the return object is valuable. Overall, it is quite 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 description coverage is 0%, so the description must compensate. It does: it explains 'label' as the baseline label, 'registry' as path to items.json sidecar, 'items' as optional subset of item ids, 'base_dir' as artifact root, 'note' as optional description, and 'out' as optional path for writing the baseline. This adds meaning beyond the schema, which only has titles and defaults. The description gives clear semantics for each parameter, so it's strong.

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 clearly states it creates a labeled, immutable baseline snapshot with version/fingerprint semantics. It distinguishes itself from sibling 'baseline_verify' by explicitly mentioning 'for reproducible rebuilds' and referencing issue #142, C3. The purpose is specific and 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?

The description implies when to use it (for reproducible rebuilds, pinning artifact bytes) but does not explicitly state when not to use it or compare to alternatives like 'baseline_verify'. It provides context on the registry and fingerprinting but lacks explicit exclusions. Since there is a sibling 'baseline_verify', some guidance would help, but the context is sufficient.

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

baseline_verifyBaseline VerifyA
Read-only

Verify a rebuild against a pinned baseline (issue #142, C3) — the reproducible- rebuild gate. Re-resolves every pinned item from the current registry + artifacts and checks it still matches the pinned rev AND content fingerprint; a drifted input (changed bytes, a bumped rev, a vanished item) is caught, never silently accepted.

baseline: path to the baseline sidecar. registry: path to the current items.json sidecar. base_dir: artifact root for fingerprinting (defaults to the registry's directory).

Returns {ok, label, drifted (item/field/expected/actual), missing} — ok is True iff the rebuild reproduces the baseline exactly.

ParametersJSON Schema
NameRequiredDescriptionDefault
base_dirNo
baselineYes
registryYes

TDQS

A4.5/5.0
Behavior4/5

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

The description states that the tool 're-resolves every pinned item' and checks 'rev AND content fingerprint', and that it catches drifted inputs 'never silently accepted'. This adds behavioral detail beyond the readOnlyHint annotation, which is appropriate. It does not explicitly say it is read-only, but the annotation already covers that. The description provides useful behavioral context about what comparison is done and the guarantee of not silently accepting drift, which is valuable.

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 appropriately sized; it provides a clear, front-loaded explanation of the tool's purpose, then lists parameters, and finally describes the return value. Each sentence earns its place, including the behavioral guarantee and the default for base_dir. It is well-structured and efficient.

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?

Despite no output schema and low schema coverage, the description explicitly states the return format ('{ok, label, drifted (item/field/expected/actual), missing}') and its meaning ('ok is True iff the rebuild reproduces the baseline exactly'). The annotations (readOnlyHint=true) cover the safety profile. For a verification tool with this complexity, the description is complete enough for an agent to call it correctly.

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?

The input schema has 0% description coverage, but the description explains each parameter: 'baseline: path to the baseline sidecar', 'registry: path to the current items.json sidecar', and 'base_dir: artifact root for fingerprinting (defaults to the registry's directory).' This compensates for the lack of schema descriptions, providing meaning for all three parameters including the optional one.

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 clearly states that the tool verifies a rebuild against a pinned baseline, using a specific verb ('Verify') and resource ('a rebuild against a pinned baseline'). It explicitly distinguishes from other tools by naming it as the 'reproducible-rebuild gate' and describing its specific function of re-resolving pinned items, which is unique among siblings like items_validate or items_resolve.

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 description implies when to use this tool: as the final gate for reproducible rebuilds. It mentions the context of issue #142 and C3, which adds specificity. However, it does not explicitly state when not to use it or name alternative tools for other verification tasks, though the purpose is clear enough that an agent could infer the right usage scenario.

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

beam_bucklingBeam BucklingA
Read-only

Exact column-buckling screen (Euler + Johnson, NO solver) — the closed-form twin the CalculiX fem_buckling eigen-solve is gated against (as beam_modal is to fem_modal). Section: width_mm+height_mm (solid rectangle, weak axis automatic), diameter_mm (round), or explicit area_mm2+i_min_mm4. E/σ_y from youngs_gpa/yield_mpa or a Materials-DB material. end_condition: 'pinned_pinned' | 'fixed_free' | 'fixed_pinned' | 'fixed_fixed' (theoretical K). Euler σ_cr=π²E/λ² above the transition slenderness √(2π²E/σ_y), Johnson parabola below (both exactly σ_y/2 at it). With load_n the safety factor P_cr/P is returned. Escalate to fem_buckling for non-prismatic / eccentric / built-up cases.

Returns {end_condition, k_factor, slenderness, transition_slenderness, governing, sigma_cr_mpa, p_cr_n, area_mm2, i_min_mm4, radius_gyration_mm, safety_factor, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
load_nNo
area_mm2No
materialNo
width_mmNo
height_mmNo
i_min_mm4No
length_mmYes
yield_mpaNo
youngs_gpaNo
diameter_mmNo
end_conditionNopinned_pinned

TDQS

A4.9/5.0
Behavior5/5

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

ReadOnlyHint covers safety, and the description adds genuinely useful behavior: it is closed-form with no solver, uses theoretical K factors, computes Euler above and Johnson below the transition slenderness, and returns a fidelity/band/valid_range screening package. It discloses the output contract including safety_factor and escalate_to.

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 and information-dense, with the key no-solver screening identity first. It is slightly longer than strictly necessary, with details like the transition point equality (σ_y/2) being mathematically interesting but not required for tool selection or invocation.

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?

Despite 11 parameters and no output schema, the description is complete: it enumerates the return object, covers all parameter groups, states the mathematical model, and names the escalation path. An agent has enough context to call and interpret the result 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?

With 0% schema coverage, the description carries the full burden and does so well: it explains the section alternatives (width+height, diameter, or area+i_min), the material sources (youngs_gpa/yield_mpa or material DB), the end_condition enum values, and load_n's role in computing the safety factor. Every parameter is accounted for in context.

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 opens with a specific verb and resource: an exact column-buckling screen using Euler + Johnson closed-form solutions, explicitly labeled 'NO solver.' It also distinguishes itself from fem_buckling with the beam_modal/fem_modal analogy, so an agent can tell it apart from the FEA sibling.

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 states the tool is a closed-form screen and explicitly escalates to fem_buckling for non-prismatic/eccentric/built-up cases, giving clear when-to-use vs when-not-to-use guidance. The section/end-condition/material options further define the applicable domain.

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

beam_modalBeam ModalA
Read-only

Exact Euler-Bernoulli natural frequencies of a uniform rectangular beam — the closed-form modal oracle (no solver), and the band the CalculiX fem_modal eigen-solve is gated against. f_n = (βL)_n²/(2π)·sqrt(E·I/(ρ·A·L⁴)); the beam bends in height_mm (I = width·height³/12, so a slender beam's lowest mode is the thinnest-direction bend). boundary: 'cantilever' | 'simply_supported' | 'clamped_clamped' | 'free_free' | 'clamped_pinned' (up to 5 modes each). Material via youngs_gpa+density_kg_m3, or a Materials-DB material name. Slender-beam theory — accurate while length ≫ height (thick beams need a Timoshenko correction).

Returns {boundary, n_modes, frequencies_hz, beta_l, first_mode_hz, youngs_gpa, density_kg_m3, area_mm2, I_mm4, slenderness}.

ParametersJSON Schema
NameRequiredDescriptionDefault
n_modesNo
boundaryNocantilever
materialNo
width_mmYes
height_mmYes
length_mmYes
youngs_gpaNo
density_kg_m3No

TDQS

A4.8/5.0
Behavior5/5

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

With annotations limited to readOnlyHint and openWorldHint, the description carries the full behavioral disclosure and does it well. It supplies the governing formula, confirms a closed-form no-solver computation, states which dimension the beam bends in, lists supported boundary cases, explains the theoretical limit, and enumerates the exact return keys.

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 dense but every sentence earns its place: purpose, formula, geometry, boundary/material inputs, theory validity, and return shape. Significant information is front-loaded, and the formatting with backticks and the formula makes it scannable for an agent.

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 tool with no output schema and a bare input schema, the description supplies the necessary physics, valid parameter values, boundary condition set, material input paths, and exact output contract. An agent can select, invoke, and interpret beam_modal without further tool definitions.

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?

The schema has 0% description coverage, so the description must add meaning, and it does: the formula ties length, width, height, Young's modulus, and density together; it explains material selection (youngs_gpa+density_kg_m3 or a Materials-DB material), enumerates boundary values, and describes the results including slenderness. n_modes is only implied via 'up to 5 modes each,' but this is a minor gap in an otherwise complete compensation.

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 opens with a precise claim: exact Euler-Bernoulli natural frequencies of a uniform rectangular beam, and frames it as a closed-form modal oracle with no solver. It also names fem_modal as the eigen-solve it gates, plus boundary conditions, material modes, and the bending axis, so purpose is unmistakable.

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 references the CalculiX fem_modal eigen-solve as the tool this oracle validates against, giving the agent a decision context. It also states the validity boundary (slender-beam theory requires length ≫ height; thick beams need Timoshenko correction), though it stops short of a direct 'use this instead of X when...' routing statement.

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

bearing_lifeBearing LifeA
Read-only

Basic rating life L10 (ISO 281): L10=(C/P)^p rev (p=3 ball, 10/3 roller), L10h=L10*1e6/(60n). Supply the dynamic rating C as dynamic_load_c_n, or pull it from the deep-groove ball catalog by designation (e.g. "6205" -> C=14.0 kN, also reporting bore/OD/width, C0 and static safety factor). Returns {l10_million_rev, l10_hours, load_ratio, dynamic_load_c_n, exponent, pass, ...} (pass vs target_hours when given).

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoball
speed_rpmYes
designationNo
target_hoursNo
dynamic_load_c_nNo
equivalent_load_p_nYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations provide readOnlyHint=true, but the description goes beyond by detailing the calculation method (ISO 281 formula), the input modes (direct C or catalog lookup), and the output structure (including pass/fail against target_hours). It also discloses the exponent values for ball vs roller, which is behavioral detail not in annotations.

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 dense but efficient, fit in two sentences. It front-loads the core formula, then expands on input options and output fields. Every clause adds value, 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?

Given the tool's moderate complexity (6 params, no output schema), the description covers the formula, input modes, catalog lookup, and key outputs. It does not detail the full output dictionary (e.g., units of dynamic_load_c_n are implicit as N), but the essentials are covered. The absence of output schema makes it important to mention the return fields, which it does.

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%, so the description must compensate. It explains the meaning of dynamic_load_c_n, designation, and how they relate (e.g., '6205' -> C=14 kN). It also clarifies equivalent_load_p_n and speed_rpm are required, and kind affects the exponent. This adds substantial meaning beyond the bare parameter names.

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 clearly states the purpose: compute basic rating life L10 per ISO 281, with formula and parameters. It distinguishes its function from siblings by specifying the output fields and the catalog lookup feature for deep-groove ball bearings. The verb 'calculate' is implicit but the resource (bearing life) and the specific method are explicit.

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 description explains how to supply the dynamic rating C or pull it from the catalog by designation, which is clear usage context. However, it does not explicitly state when to use this tool versus alternatives like 'belt_drive' or 'gear_rating', though the sibling list shows it is one of many mechanical calculation tools. The context is clear, but no exclusion criteria for other tools.

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

belt_driveBelt DriveA
Read-only

Rate a belt drive (Eytelwein/capstan). Wrap theta=pi-2asin((D-d)/2C), Fe=P/V, T1/T2=e^(mu*theta) (V-belt divides mu by sin(beta/2)). Returns {wrap_angle_deg, belt_speed_m_s, effective_force_n, tension_ratio, tight_side_n, slack_side_n, transmissible_power_w, pass}.

ParametersJSON Schema
NameRequiredDescriptionDefault
power_wYes
friction_coefNo
small_pulley_rpmYes
vbelt_groove_degNo
center_distance_mmYes
tight_side_limit_nNo
large_pulley_dia_mmYes
small_pulley_dia_mmYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds valuable behavioral detail by exposing the mathematical model (Eytelwein equation), the V-belt adjustment, and the pass/fail output. It does not contradict annotations and provides transparency about computational assumptions beyond 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.

Conciseness5/5

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

The description is a single dense block that front-loads the purpose, then provides equations and the return object—no fluff or repetition. Every sentence contributes to understanding the tool's operation.

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?

Given no output schema, the description properly enumerates all return fields, which is essential. It also covers the core formulas and the V-belt variant, but it omits specifics about the 'pass' criterion and default friction/groove behavior, leaving minor gaps for an 8-parameter analysis tool.

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?

With 0% schema description coverage, the description must compensate, and it does: the equations map parameters to variables (D, d, C, mu, beta, P) and clarify relationships such as tension ratio and belt speed. However, 'tight_side_limit_n' is not explained, leaving a small gap for an otherwise thorough semantic mapping.

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 opens with a specific verb 'Rate a belt drive (Eytelwein/capstan)', clearly identifying the resource and the analysis type. The inclusion of governing equations and the output list further distinguishes it from mechanical siblings like 'chain_drive' or 'gear_rating'.

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 description implies usage context through the belt-drive formulas and return fields, but it does not explicitly state when to choose this tool over alternatives like chain_drive, nor does it mention any exclusions. The context is clear enough for an expert to infer, but it lacks direct routing guidance.

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

bolted_joint_checkBolted Joint CheckA
Read-only

Rate a bolted joint (VDI 2230-lite). Geometry from bolt_dia_mm (+pitch_mm) OR a standard thread named via bolt_size ("M8"/"M8x1.0") that pulls dia/pitch and the standards-table tensile stress area; proof strength from the ISO 898-1 property_class ("8.8") when given. Preload from torque via T=KFd (pass torque_nm OR preload_n). Returns {preload_n, tensile_stress_area_mm2, bolt_stress_mpa, preload_pct_proof, bolt_stress_with_load_mpa, separation_load_n, separation_margin, pass, governing}. preload_target_pct is the fraction of proof strength the preload is judged against (0.75 default; 0.65 for a reused bolt, 0.90 for a critical permanent joint).

ParametersJSON Schema
NameRequiredDescriptionDefault
k_factorNo
materialNoSteel-4140-QT
pitch_mmNo
bolt_sizeNo
preload_nNo
torque_nmNo
bolt_dia_mmNo
property_classNo
external_load_nNo
preload_target_pctNo
proof_strength_mpaNo
joint_stiffness_ratioNo

TDQS

A4.1/5.0
Behavior5/5

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

The annotations only indicate read-only and open-world hints, so the description carries the burden of explaining the calculation behavior. It provides the governing formula T=K*F*d, the source of tensile stress area and proof strength, the output fields, and the meaning of preload_target_pct with examples. This is substantial behavioral disclosure beyond the annotations.

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 appropriately detailed for an engineering calculation tool, and it fronts the core purpose before input alternatives and outputs. Each clause adds useful information, though it is presented as one long block rather than structured sections.

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 description names the full return set, explains input alternatives, and provides default behavior for preload_target_pct, which is valuable given no output schema. It is weaker in explaining how external_load_n and joint_stiffness_ratio influence the separation and loaded-stress outputs, and it does not define the exact pass criterion.

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?

With 0% schema description coverage, the description must compensate, and it does explain bolt_size, bolt_dia_mm, pitch_mm, property_class, torque_nm, preload_n, and preload_target_pct. However, several parameters such as external_load_n, joint_stiffness_ratio, material, proof_strength_mpa, and k_factor are not explicitly connected to their roles, leaving meaningful gaps for a 12-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 the tool rates a bolted joint using VDI 2230-lite, with a specific verb and resource. It is unmistakably distinct from sibling engineering checks, though it does not explicitly name or contrast a sibling alternative.

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 description gives clear context for when this tool would apply and explains the alternative input paths: bolt_dia_mm+pitch_mm or bolt_size, and torque_nm or preload_n. It does not explicitly state when not to use it or name alternatives, but the intended usage is well implied.

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

bom_extractBOM ExtractA
Read-only

Walk an assembly and return [{part, count, total_volume_mm3, total_mass_kg?}, ...] grouped by source (component file + object), NOT the bare object name, so two distinct components both named "Box" don't collapse into one row. density (kg/mm³) is optional.

recursive (default True): descend into linked subassemblies (App::Part) so the BOM flattens to leaf parts. False counts each subassembly as one line.

orderable (default False): opt in to the BUYABILITY view — is every purchased line on this BOM a part that actually exists off the shelf? The default return is unchanged — a bare list — because everything downstream consumes it. With orderable=True you instead get a dict:

rows the same BOM rows, each also carrying designation / standard / part_class plus the catalog verdict (stocked, catalog_code, catalog) consumables purchased parts that are NOT modelled objects and would otherwise never reach a BOM — today the O-ring an oring_groove was cut for, counted across every part that calls for it undesignated purchased rows a buyer cannot order from (no designation) not_stocked rows naming a part nobody stocks, each with a reason and the nearest stocked alternatives designation the full designation_check verdict stocked_count how many purchased lines resolved to a stocked item ok False when anything purchased is undesignated OR not stocked

check_stock=False designates without checking availability. A design built out of fasteners that do not exist is the failure this catches, and the offending rows stay IN the list rather than being quietly dropped. Availability is a curated snapshot of a market (captured, market), not physics.

ParametersJSON Schema
NameRequiredDescriptionDefault
densityNo
assemblyYes
orderableNo
recursiveNo
check_stockNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

The description discloses substantial behavior beyond the readOnlyHint annotation: the exact return schema, the default bare-list format, the dict shape under orderable=True, and the deliberate choice to keep offending rows in the list rather than silently dropping them. It also notes that availability is a curated snapshot, which is a meaningful caveat.

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 long but every section earns its place: the core result, grouping rule, parameter semantics, and optional buyability view are each explained with concrete examples. The structure front-loads the primary behavior and then moves through optional modes in a logical order.

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?

Given the tool's complexity, the description is complete: it covers all five parameters, the default and alternate return shapes, edge cases like undesignated/not-stocked rows, and the reason for the default bare-list behavior. Since an output schema exists, returning values need not be re-specified, and nothing essential 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%, so the description carries the full burden of explaining parameters. It covers assembly implicitly, density with explicit units, recursive with both True/False behavior, orderable with the resulting dict structure, and check_stock with a concrete example of what skipping availability means.

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 opens with a precise verb and resource: 'Walk an assembly and return [{part, count, total_volume_mm3, total_mass_kg?}, ...]'. It also clarifies a non-obvious grouping rule ('NOT the bare object name') that distinguishes this from a naive object-name aggregation and from sibling tools like list_assembly_parts.

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 description gives clear contextual guidance for each flag: recursive controls flattening, orderable opts into the buyability dict, and check_stock=False skips availability checks. It does not explicitly name an alternative tool or state when not to use bom_extract, but the behavioral conditions for parameter selection are unambiguous.

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

boolean_opBoolean OpA

Boolean operation on two existing objects, referenced by their handles.

op: 'cut' (base minus tool), 'fuse' (union), or 'common' (intersection). base, tool: handles returned from add_primitive (e.g. 'box_1', 'cylinder_1'). strict: raise instead of warning on a degenerate cut (see below).

Returns {handle, volume, removed_volume, volume_ratio}, plus warnings — a list of strings — ONLY when the cut looks degenerate; the key is absent on a clean op, so "warnings" in result is the test. removed_volume: base_volume - result_volume, mm3. Positive means material went away (always so for cut/common); NEGATIVE on a fuse, where it is the volume the tool added. volume_ratio: result_volume / base_volume, or None when the base was empty. The two warned cases are cut-only, and each means the cut did not do what was asked: annihilation (result ~ 0 — the tool swallowed the base, so every later feature operates on nothing) and miss (result == base — the tool never intersected the base, so nothing was removed). Warn-don't-fail is the default because cutting everything away is legitimate in some workflows; pass strict=True in a scripted recipe to turn both into an error instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYes
baseYes
toolYes
strictNo

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the sparse annotations: explains the conditional `warnings` key, sign convention for removed_volume, None volume_ratio, and the two degenerate-cut cases. Also discloses strict-mode behavior and default warn-don't-fail, so side effects are fully predictable.

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?

Long but tightly organized: purpose, params, return semantics, then edge cases. Every sentence earns its place, and the warnings-key test is stated operationally.

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 no output schema, the description supplies return fields and units, conditional keys, and failure semantics. An agent has everything needed to call boolean_op and interpret its result 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 fully compensates: it defines the three valid op values, clarifies base/tool provenance, and explains strict's default and effect. This is more parameter guidance than most schemas provide.

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: 'Boolean operation on two existing objects, referenced by their handles.' It enumerates cut/fuse/common, so an agent can distinguish it from other geometry transforms and feature tools in the sibling 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?

Describes the operating modes and says base/tool are handles returned from add_primitive, giving clear usage context. It does not explicitly name alternatives or when-not-to-use conditions, so it stops short of 5.

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

bounding_boxBounding BoxA
Read-only

Axis-aligned bounding box (AABB) of a shaped object. All lengths in mm, in world coordinates. This is a measurement — it returns numbers, not a new object, and does not modify the model.

KNOWN QUIRK (issue #284): min/max/size are FreeCAD/OCC's ANALYTIC box, which is an UPPER bound, not the true extent. OCC boxes a trimmed face using its untrimmed carrier surface, so a planar cut through fillets, chamfers, lofts or a sphere can report several mm of material that is not there — a real case had a trim plane at X=-32.0 reported as X=-36.7. Before you conclude a part is the wrong size, check "verified" (and pass tight=True): the analytic box over-estimating a correct part looks exactly like a wrong part.

handle: the object to measure. oriented: if True, also compute the tightest box at any orientation (the oriented bounding box, OBB) and return it under "oriented"; if the build can't compute it, "oriented" is null. Default False. This is about ORIENTATION, not tightness — it comes from the same analytic geometry and inherits the same over-estimate. tight: if True, also tessellate the shape and return the mesh-derived box under "tight" — the trustworthy numbers when the analytic box over-estimates. Opt-in because tessellation is not free (~1.4s on a 200mm plate with 60 filleted holes). Default False. deflection: mesh chord tolerance in mm for tight=True. Default diagonal/2000 (floor 0.001mm); larger is coarser and faster.

Returns a dict: min [x,y,z] mm — lower corner of the analytic AABB (upper bound) max [x,y,z] mm — upper corner of the analytic AABB (upper bound) size [x,y,z] mm — extents (max - min) along X, Y, Z center [x,y,z] mm — AABB center point diagonal float mm — space-diagonal length of the AABB oriented null, or {size:[x,y,z] mm, center:[x,y,z] mm, diagonal: mm} when oriented=True and supported — the minimum-volume box at the shape's best orientation (size is its three edge lengths). verified how far min/max above can be trusted: "exact" — proven tight (the shape's own vertices reach all six faces of the analytic box). "mesh_agrees" — tight=True found no disagreement beyond the mesh tolerance. "unverified" — unproven, the usual verdict on a curved part. Treat min/max/size as an upper bound only, and re-run with tight=True to measure. "over_estimate" — tight=True proved the analytic box overshoots. Use "tight"; min/max/size are wrong-big. tight null unless tight=True, else {min, max, size, center, diagonal, deflection, triangles} measured off the mesh. Accurate to about deflection; the true box lies between "tight" and the analytic box, never outside them. warnings list of strings (empty when there is nothing to say): which face over-estimates and by how many mm, or that an unverified box has not been checked.

ParametersJSON Schema
NameRequiredDescriptionDefault
tightNo
handleYes
orientedNo
deflectionNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description substantially discloses behavior: it states the model is not modified, reveals the analytic-box over-estimation quirk with a real example, explains when results are trustworthy, and documents performance costs of tessellation. This is rich, non-obvious behavioral context.

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 long but every section earns its place: a one-line purpose, a high-value quirk warning, parameter definitions, and a detailed return contract. The critical caveat about analytic over-estimation is prominently signaled, and the layout is scannable.

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 no output schema, the description provides a complete return-value breakdown including min, max, size, center, diagonal, oriented, verified, tight, and warnings. It also covers performance, defaults, and failure modes, making it sufficient for correct invocation and interpretation.

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 fully compensates by explaining each parameter, including default behavior, the difference between oriented and tight, and the effect of deflection on mesh fidelity. It adds meaning far beyond the raw schema types.

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 clearly states 'Axis-aligned bounding box (AABB) of a shaped object' and emphasizes it is a measurement that returns numbers without modifying the model. This verb+resource+scope combination distinguishes it from nearby measurement and transformation tools.

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 description conveys when to use the tool, namely when an AABB measurement is needed, and includes practical guidance such as checking 'verified' and using tight=True before judging a part incorrectly sized. It does not explicitly name sibling alternatives or exclusions, so it stops 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.

catalog_checkCatalog CheckA
Read-only

Is this exact part something you can buy off the shelf?

Pass a canonical designation ("ISO 4762 M4×12 A2", "608-2RS") or the handle of a part whose designation was stamped when it was generated. Offline and deterministic.

Returns {ok, code, standard, size, length, stocked, grade_ok, reason, nearest, lengths, grades, fidelity, captured, market}, where code is: stocked the size/length exists and the material is listed (for a cut-to-length product like threaded rod, any length up to the longest stock bar counts, with a note that it is a cut) not_stocked the size exists but the LENGTH is not a stocked rung — nearest names the rungs either side size_not_stocked the standard does not cover this size at all grade_not_listed the size exists, that material does not not_catalogued the product standard is outside this corpus's coverage. That is an absence of evidence, explicitly NOT a claim that the part is unavailable — check not_covered from catalog_search undesignated there was no designation to check ok is True only for stocked.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleNo
designationNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already mark this as read-only and not open-world, but the description adds substantial behavioral context: it is offline and deterministic, 'ok' is true only for 'stocked', and 'not_catalogued' is carefully framed as absence of evidence rather than unavailability. This goes well beyond the annotation signals.

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 dense but well organized: a one-line purpose, input guidance, then a structured enumeration of return codes with precise meanings. Every sentence contributes usable information, and the most important constraint ('ok is True only for stocked') is placed at the end as a crisp summary.

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?

Given the absence of an output schema, the description thoroughly explains the return shape: the code values, the meaning of 'nearest', the cut-to-length nuance, and the false-negative caveat. Even though a few tuple fields like 'fidelity' and 'market' are not individually defined, the agent has enough to invoke the tool correctly and interpret its primary result.

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?

The schema provides no descriptions for the two parameters, so the description must carry the full burden. It does so clearly: 'designation' is explained with concrete examples, and 'handle' is tied to a part whose designation was stamped at generation time. The agent can understand both how to populate the parameters and how they relate.

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 opening question 'Is this exact part something you can buy off the shelf?' plus the detailed code semantics make the tool's purpose unmistakable: check stock availability for an exact standardized designation or generated handle. It also differentiates itself from the sibling catalog_search by explicitly contrasting 'not_catalogued' here with 'not_covered' there.

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 description tells the agent exactly what inputs to pass and when the tool is the right choice: whenever an exact off-the-shelf availability question needs a deterministic answer. It also names a concrete alternative action for one outcome (check 'not_covered' from catalog_search), though it does not enumerate exclusions or compare against closely related siblings like catalog_nearest.

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

catalog_nearestCatalog NearestA
Read-only

Snap a desired standard part to the nearest one that actually exists.

This is the call that changes how you design. Ask for an ISO 4762 M4×13 and it tells you that 12 and 16 are stocked and 13 is not — which turns "I need a 13 mm screw" into "I need to adjust my stack-up to 12 or 16". Use it the moment a fastener length falls out of a dimension chain, before the geometry hardens around a size nobody sells.

standard: a product standard or alias ("ISO 4762", "DIN 912", "ISO 7380-1"). size: thread designation, nominal mm, or shaft/bore mm. length: the wanted length in mm. Omit it for a product with no length dimension (a nut, a washer, a circlip), or to list the whole stocked ladder. grade: optional property class / material, used to complete the designation the call hands back.

Exact arithmetic on a DISCRETE ladder: nothing is interpolated, and nothing is silently rounded on your behalf. A length between two rungs is not a part, so you get both rungs and the signed deltas and you decide which way to move.

Returns {ok, standard, name, size, requested_length, exact, stocked, below, above, nearest [{length, delta}], lengths, grades, designation, reason, fidelity, captured, market}. designation is the canonical designation of the RECOMMENDED part, so the answer is directly usable in a BOM. ok=True means what you asked for is already stocked.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeYes
gradeNo
lengthNo
standardYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already mark readOnlyHint true and openWorldHint false, but the description adds substantial behavioral detail beyond that: exact arithmetic on a discrete ladder, no interpolation, no silent rounding, both rungs with signed deltas are returned, and ok=True indicates the requested size is stocked. This significantly clarifies what the tool does and does not do.

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 long but every section earns its place: a crisp opening, a motivating example, parameter semantics, behavioral guarantees, and a return-field explanation. The most important concept—snapping to nearest existing part—is front-loaded, and the parameter details are clearly structured.

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 4-parameter tool with no output schema, the description is unusually complete. It documents all parameters, optional behavior, the discrete-ladder semantics, and the full return envelope including the meaning of ok and designation. An agent has enough information to invoke it correctly and interpret the result without external knowledge.

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%, so the description carries the full burden, and it fully succeeds. It explains each parameter: standard accepts alias names, size accepts thread or nominal mm, length is optional and can be omitted for products without length dimension or to list the full ladder, and grade is an optional property class/material. This is far more meaningful than the bare schema.

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 verb and resource: 'Snap a desired standard part to the nearest one that actually exists.' It is immediately clear this tool resolves a requested part to real stocked options, and the ISO 4762 M4×13 example makes the behavior concrete. It clearly separates this from general catalog search or validation tools by focusing on nearest-stock resolution.

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 description gives explicit usage context: 'Use it the moment a fastener length falls out of a dimension chain, before the geometry hardens around a size nobody sells.' It also explains when to omit length and what that yields. However, it does not explicitly name sibling alternatives or state when not to use this tool in favor of catalog_search or catalog_check, so the exclusion guidance is implied rather than explicit.

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

cfd_body_dragCFD Body DragA
Read-only

Analytic EXTERNAL-flow drag screen (NO solver, milliseconds) — the external twin of cfd_pipe_flow, and the banded oracle the wind-tunnel solve cfd_external_flow_submit(model=…) is checked against. Use this FIRST to narrow a design space; escalate to the solve only for the shapes that survive.

Three families:

  • shape='sphere' — Clift–Gauvin over the whole standard drag curve, Cd = 24/Re·(1+0.15·Re^0.687) + 0.42/(1+4.25e4·Re^-1.16). Collapses to the EXACT Stokes 24/Re as Re→0; valid to Re=2e5 (it does not model the drag crisis). Pass diameter_mm + velocity_m_s.

  • shape='cylinder' — Sucker–Brauer crossflow Cd (axis ⟂ flow), Cd ≈ 10 at Re=1, 1.45 at Re=100, 1.2 at Re=1e5. Pass diameter_mm, velocity_m_s, optional length_mm (default 1 m, i.e. drag per unit span; L/D<10 warns about end relief).

  • a tabulated bluff/streamlined shape — 'cube_face_on', 'flat_plate_normal', 'hemisphere_open_back', 'streamlined_body', 'car_modern', … (shape='list' returns the whole table). Needs frontal_area_mm2 (or a model handle, whose silhouette along flow_direction is measured off the live solid) + velocity_m_s; cd overrides the table with a known value.

Fidelity: sphere/cylinder are correlations with band_pct 10/15; the table is band_pct 20 and only valid for Re ≈ 1e4–1e6 on a shape that genuinely matches.

Returns {cd, drag_force_n, frontal_area_m2, dynamic_pressure_pa, velocity_m_s, fidelity, band_pct, escalate_to} plus {reynolds, regime, valid_range_ok, warnings} for sphere/cylinder — or {shapes: {name: cd}} for shape='list'.

ParametersJSON Schema
NameRequiredDescriptionDefault
cdNo
fluidNoair-20c
modelNo
shapeNosphere
mu_pa_sNo
length_mmNo
rho_kg_m3No
diameter_mmNo
velocity_m_sNo
flow_directionNo
frontal_area_mm2No
stl_tolerance_mmNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true and openWorldHint=false; the description carries the behavioral burden and does so richly. It discloses that this is an analytic, non-solver screening tool returning banded fidelity, gives per-family validity ranges (e.g. sphere valid to Re=2e5 and does not model drag crisis), and warns about L/D<10 end relief for cylinders. No contradiction with annotations.

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?

Long but every sentence earns its place: the first block gives purpose and routing, bullets organize the three parameter families, and the final block states the exact return payload. Formulas, defaults, validity limits, and warnings are all packed in without fluff.

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 12-parameter, no-output-schema analysis tool, the description is nearly complete. It explains the three invocation modes, which parameters go together, what results come back for each mode, fidelity bands, and escalation guidance. Only low-level property overrides and mesh tolerance are left implicit, which is acceptable given the level of detail already provided.

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 substantially: diameter_mm + velocity_m_s for sphere/cylinder, optional length_mm with default 1 m, frontal_area_mm2 or model handle with flow_direction, and cd as an override. It leaves a few parameters unexplained (fluid, mu_pa_s, rho_kg_m3, stl_tolerance_mm), so it is not quite a full substitute for per-schema documentation.

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 precise verb-resource pair: 'Analytic EXTERNAL-flow drag screen (NO solver, milliseconds)', explicitly distinguishing it from cfd_pipe_flow and cfd_external_flow_submit. The three shape families make the tool's scope unmistakable.

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 routing: 'Use this FIRST to narrow a design space; escalate to the solve only for the shapes that survive.' It names cfd_external_flow_submit as the checked-against oracle and cfd_pipe_flow as the internal-flow twin, so an agent knows exactly when to choose this tool versus alternatives.

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

cfd_external_flow_submitCFD External Flow SubmitA
Destructive

External-flow CFD (drag/lift) via OpenFOAM or SU2, asynchronous. Requires an OpenFOAM (apt/conda) or SU2 binary; when none resolves this returns {ok:false, reason, install} rather than raising. The two case-BUILDING modes below need OpenFOAM specifically — they emit OpenFOAM dictionaries; SU2 only ever runs a case_dir you prepared yourself, which is why solve_capabilities does not count it toward the cfd family's any_available (issue #237). Three modes:

  • Put a real solid in the virtual wind tunnel (issue #223): pass a model (or body) handle + velocity_m_s. The solid's faces tessellate into an STL, a farfield box is auto-sized around it by standard practice (5L upstream / 10L downstream / 5L lateral, overridable via upstream_factor/downstream_factor/ lateral_factor; the reported blockage_ratio warns past 5 %), snappyHexMesh carves the body out, and the forces function object integrates pressure + viscous traction over it. Cd/Cl/Cm come back on the MEASURED frontal silhouette along flow_direction (default +x; exact for a convex body — override with frontal_area_mm2 for a re-entrant one) and reference_length_mm (default: the largest bbox dimension). Mesh knobs: base_cell_mm (default L/2 — a coarser cell is REJECTED, since snappy would then mesh an empty tunnel and report ~0 drag), surface_refine [min,max] levels, wake_refine, stl_tolerance_mm, end_time. Trust: the laminar path is gated live against the sphere drag curve at Re=1 and Re=100 (within ~2 %); turbulence='kOmegaSST' runs but has no verified oracle for arbitrary bodies and comes back gated:false. Past Re≈1000 a laminar request is flagged in warnings rather than silently answered.

  • Build the flat-plate validation case (no model): pass velocity_m_s, with optional plate_length_mm (default 100), a fluid name ('air-20c','water-20c',…) or explicit mu_pa_s+rho_kg_m3, and mesh knobs nx_plate/n_y/end_time. THIS MODE SOLVES A FLAT PLATE, never the caller's geometry: a 2-D laminar plate with a clean leading edge (slip→plate→slip, far-field top), whose wall-shear drag is integrated from the converged U field and returned next to the Blasius reference Cf=1.328/√Re_L (blasius_ratio≈1, ~15 %). turbulence='kOmegaSST' upgrades it to RANS (default plate_length 1000 mm so Re_L > transition), gated BANDED against the mixed-transition Cf = 0.074·Re^(−1/5) − A/Re.

  • Run a prepared case_dir (optionally an application); OpenFOAM runs with its environment sourced, an SU2 case (*.cfg + *.su2 mesh) runs as a direct native subprocess — no bash/WSL needed, including on Windows.

Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result. Body mode: {ok, returncode, cd, cl, cm, drag_force_n, drag_pressure_n, drag_viscous_n, lift_force_n, force_total_n, moment_total_nm, force_drift_pct, n_force_samples, reynolds, reference_length_m, frontal_area_m2, frontal_area_source, moment_reference_m (the bbox centre moments are taken about, not the global origin), blockage_ratio, base_cell_m, converged, gated, warnings, case_dir}. Flat plate: {ok, returncode, reynolds_l, cd, cf_solved, cf_blasius, blasius_ratio, drag_force_n, drag_momentum_n, drag_blasius_n, n_cells, case_dir}; RANS plate swaps the gate fields for {cf_solved (momentum), cf_mixed_ref, cf_mixed_ratio, cf_turbulent_ref, cf_wall_corrected, y_plus_estimate, band_pct}. Prepared case: {ok, returncode, solver, application, case_dir, kind, stdout_tail}.

ParametersJSON Schema
NameRequiredDescriptionDefault
n_yNo
bodyNo
fluidNoair-20c
modelNo
mu_pa_sNo
case_dirNo
end_timeNo
nx_plateNo
rho_kg_m3No
turbulenceNolaminar
applicationNo
wake_refineNo
base_cell_mmNo
velocity_m_sNo
flow_directionNo
lateral_factorNo
surface_refineNo
plate_length_mmNo
upstream_factorNo
frontal_area_mm2No
stl_tolerance_mmNo
downstream_factorNo
reference_length_mmNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only supply destructiveHint=true; the description carries the full burden and does so richly: it returns {ok:false, reason, install} rather than raising when no solver binary resolves, discloses async/poll behavior via job_result, explains gating against known curves (sphere drag within ~2%, Blasius reference, banded RANS gate), warns that laminar past Re≈1000 is flagged in `warnings`, notes `base_cell_mm` rejection to avoid empty-tunnel meshes, and details exact return payloads per mode including the `moment_reference_m` gotcha.

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 long, but the tool is genuinely complex (three modes, 23 params, two solvers), and the bullet structure with bolded mode headers keeps it navigable. It is front-loaded with the core purpose. Minor redundancy (defaults restated in prose) and overall density justify a 4 rather than 5.

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 no output schema, the description must enumerate return values itself and does so for all three modes, including degradation dict and cache_hit paths. Async workflow (poll job_result), solver environment requirements (OpenFOAM env sourced, SU2 native subprocess no bash/WSL), trust/validation caveats, and cross-references to solve_capabilities are all covered. Nothing an agent needs to invoke correctly 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%, so the description must fully compensate — and it does. All 23 parameters are explained with defaults and constraints: `base_cell_mm` (default L/2, coarser rejected), `upstream_factor`/`downstream_factor`/`lateral_factor` (5L/10L/5L defaults), `plate_length_mm` (default 100, or 1000 for RANS), `flow_direction` (default +x), `frontal_area_mm2` (override for re-entrant bodies), `reference_length_mm` (largest bbox dimension), plus mesh knobs and fluid/mu/rho options.

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 opening sentence states a specific verb and resource: 'External-flow CFD (drag/lift) via OpenFOAM or SU2, asynchronous.' This immediately distinguishes it from siblings like cfd_internal_flow_submit and cfd_pipe_flow via the 'external-flow' qualifier, and the three explicitly bulleted modes make the tool's scope unambiguous.

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 selection criteria for each of the three modes: pass a `model`/`body` + `velocity_m_s` for the solid mode, omit `model` for the flat-plate validation case, or pass `case_dir` for the prepared-case mode. It also states when NOT to expect something ('THIS MODE SOLVES A FLAT PLATE, never the caller's geometry') and solver-specific constraints (OpenFOAM needed for case building; SU2 only runs a prepared `case_dir`).

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

cfd_internal_flow_submitCFD Internal Flow SubmitA
Destructive

Internal-flow CFD (pressure drop) via OpenFOAM or SU2, asynchronous. Requires an OpenFOAM (apt/conda) or SU2 binary; when none resolves this returns {ok:false, reason, install} rather than raising. The pipe and geometry-bridge modes need OpenFOAM specifically — they emit OpenFOAM dictionaries — but channel_height_mm builds a NATIVE SU2 case, which is why solve_capabilities counts SU2 toward the cfd family (issue #237). On Apple Silicon that is the difference between needing a Multipass VM and not. turbulence='kOmegaSST' upgrades the pipe validation case to RANS (SIMULATION_NEXT B3): wall-function k/ω/ν_t with first-cell y+ targeted at ~30–100, developed dp/dx fitted over the second half of a ≥40·D pipe, gated BANDED against Colebrook (colebrook_ratio ≈ 1 ± 10 % — the Moody correlation is itself a band, never an exact gate). Four modes:

  • Build the native SU2 plane-channel case (no OpenFOAM, no VM): pass channel_height_mm, optionally channel_length_mm (default 10× the height), velocity_m_s (default Re 50), a fluid or mu_pa_s+rho_kg_m3 (default a light oil — holding Re low with water means millimetres per second, where SU2's incompressible pseudo-time is badly scaled), nx/ny, max_iterations. Gated against the EXACT plane-Poiseuille closed form Δp = 12·μ·U·L/h², returning poiseuille_ratio ≈ 1. The inlet is the fully developed parabolic profile, so there is no entrance-length error to drown out with a long domain.

  • Build the straight-pipe validation case (no case prep): pass diameter_mm, length_mm, and velocity_m_s (or flow_rate_lpm), with a fluid name or explicit mu_pa_s+rho_kg_m3 (mesh density via n_axial/n_radial, iterations via end_time). The handler builds the axisymmetric laminar pipe, runs blockMesh+simpleFoam, and returns the solved Δp next to the Hagen–Poiseuille analytic reference (cfd_pipe_flow) — the kickoff's exact CFD gate, hp_ratio≈1.

  • Solve a real FreeCAD solid — the geometry bridge: pass a body handle plus inlet_face/outlet_face (1-based indices into the solid's faces; every other face becomes a no-slip wall) and velocity_m_s (applied along the inlet face's inward normal). The solid tessellates into a multi-region STL and meshes with blockMesh + snappyHexMesh; base_cell_mm sets the background cell size, location_in_mesh_mm the kept-region seed point (default: bbox centre — set it for non-convex solids), stl_tolerance_mm the tessellation sag. Use the developed-profile pressure_drop_pa; also pass diameter_mm+length_mm to get an hp_ratio reference for pipe-like bodies.

  • Run a prepared case_dir (optionally an application, e.g. 'simpleFoam'/'foamRun'); for OpenFOAM its environment is sourced before the run, while an SU2 case (*.cfg + *.su2 mesh) runs as a direct native subprocess — no bash/WSL needed, including on Windows.

Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result. Pipe/body cases: {ok, returncode, pressure_drop_pa (developed), pressure_drop_inlet_pa, hagen_poiseuille_pa?, hp_ratio?, n_cells, case_dir}; RANS pipe adds {dpdx_pa_m, dpdx_colebrook_pa_m, colebrook_ratio, y_plus_estimate, band_pct}. Prepared case: {ok, returncode, solver, application, case_dir, kind, stdout_tail}.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
fluidNowater-20c
mu_pa_sNo
n_axialNo
case_dirNo
end_timeNo
n_radialNo
length_mmNo
rho_kg_m3No
inlet_faceNo
turbulenceNolaminar
applicationNo
diameter_mmNo
outlet_faceNo
base_cell_mmNo
velocity_m_sNo
flow_rate_lpmNo
max_iterationsNo
stl_tolerance_mmNo
channel_height_mmNo
channel_length_mmNo
location_in_mesh_mmNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, it discloses the non-raising failure contract ({ok:false, reason, install}), async job semantics, solver-specific environment sourcing, RANS wall-function targeting with y+ and banded Colebrook gating, and the per-mode return payloads. Nothing in the description contradicts readOnlyHint=false, openWorldHint=false, or destructiveHint=true.

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 long but highly structured: a summary sentence, solver prerequisites, four bullet modes, then per-mode return shapes, with important constraints front-loaded. It is not truly concise—issue references, B3 labels, and some Apple Silicon digressions could be trimmed—but every paragraph earns its place in a dense, complex tool.

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 22-parameter async tool with no output schema, it is nearly complete: prerequisites, mode selection, units, failure behavior, polling, and exact result shapes are all present. It loses a point only because it never states that exactly one mode configuration is required, and the fluid-default contradiction adds ambiguity.

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?

With 0% schema description coverage, the description compensates for nearly all 22 parameters, including mode selectors, physical inputs, mesh controls, iteration limits, and units/defaults. It earns less than 5 because it cites nx/ny that are absent from the schema, and its 'default a light oil' statement conflicts with the schema's fluid default of water-20c.

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 opening line states the exact operation—internal-flow CFD pressure drop via OpenFOAM or SU2, asynchronous—and the four bullet modes make the target resource and invocation style unmistakable. The 'internal' qualifier and the reference to the cfd family separate it from external-flow and analytic-analysis siblings.

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?

Provides explicit decision rules: channel_height_mm selects native SU2 with no OpenFOAM or VM, pipe and geometry-bridge modes require OpenFOAM specifically, and prepared case_dir runs either solver with environment handling. It also tells the agent when to add diameter_mm+length_mm for an hp_ratio reference and to poll job_result for async completion.

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

cfd_mesh_independence_submitCFD Mesh Independence SubmitA

Solve the same CFD case at 2-3 refined meshes and report the Grid Convergence Index — asynchronous, one job for the whole ladder. Requires OpenFOAM; degrades to {ok:false, reason, install} when it does not resolve.

Answers the question no single solve can: is this number a property of the flow, or of the mesh? On geometry with no analytic twin that band is the only error bar available, and it is what turns "a solver produced 0.31" into "0.31 ± 2 %".

Two families, dispatched like their single-solve twins:

  • the wind tunnel — pass model (or body) + velocity_m_s, plus any cfd_external_flow_submit knob. The ladder varies the background cell; the body is tessellated ONCE and shared, so the study isolates mesh error instead of mixing in a changing STL. Default metric 'cd'.

  • the straight pipe — pass diameter_mm, length_mm, velocity_m_s (or flow_rate_lpm). The ladder scales n_axial/n_radial. Default metric 'pressure_drop_pa'.

The COARSEST level is the mesh a plain submit would have built and the study refines from there (the tunnel's default cell is already the coarsest that resolves the body at all). Cost therefore grows as the cube of refinement_ratio: 3 levels at 1.5 puts roughly 11x the cells in the finest mesh, so budget accordingly. end_time is the cap for the COARSEST level and is scaled up for the finer ones — a fine mesh needs proportionally more sweeps, and a study whose finest level quietly stopped at its cap is worthless.

Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result for {ok, family, metric, levels: [{label, value, cell_size_m, n_cells, converged, returncode, case_dir}], grid_convergence: {observed_order, extrapolated_value, gci_pct, monotonic, asymptotic_ratio, order_clamped, warnings, ...}, band_pct, extrapolated_value, hagen_poiseuille_pa (pipe family), warnings}.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
fluidNoair-20c
modelNo
levelsNo
metricNo
mu_pa_sNo
n_axialNo
end_timeNo
n_radialNo
length_mmNo
rho_kg_m3No
turbulenceNolaminar
diameter_mmNo
base_cell_mmNo
velocity_m_sNo
flow_rate_lpmNo
flow_directionNo
surface_refineNo
refinement_ratioNo

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the sparse annotations, the description discloses that execution is asynchronous, one job covers the whole refinement ladder, OpenFOAM is required, and failure degrades to a specific {ok:false, reason, install} dict. It also reveals cost growth with refinement_ratio and the end_time scaling behavior for finer levels, giving agents important expectations about job behavior and results.

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 long but well-structured with bolded family sections, clear default values, and a detailed return-value spec. Each section adds operational value rather than padding; it is not minimal, but the length is justified by the complexity and the absence of schema-level parameter documentation.

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?

Given a 19-parameter, 0%-schema-covered tool with no output schema, the description is exceptionally complete. It covers failure modes, parameter selection, default metrics, cost scaling, end_time behavior, and the full shape of the returned result, including the per-level fields and grid_convergence sub-dict.

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?

With 0% schema description coverage, the description compensates by explaining the key parameter families: model/body + velocity_m_s for external flow, diameter_mm/length_mm/velocity_m_s/flow_rate_lpm for pipe flow, default metric values, levels, refinement_ratio, and end_time semantics. It does not individually document all 19 parameters, but it covers the principal decision-driving ones and points to inherited 'knobs' for the rest.

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 verb and resource: 'Solve the same CFD case at 2-3 refined meshes and report the Grid Convergence Index'. It also clearly differentiates from the single-solve CFD siblings by framing this tool as answering 'the question no single solve can', establishing its distinct role in the mesh-independence workflow.

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 description gives clear selection guidance between the two supported families, the wind tunnel and the straight pipe, with explicit parameter sets for each and default metrics. It references 'single-solve twins' and cfd_external_flow_submit knobs, which implies when to use this vs single-solve tools, though it does not formally name or exclude the alternative tools.

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

cfd_pipe_flowCFD Pipe FlowA
Read-only

Analytic straight-pipe pressure drop (NO solver) — the fast internal-flow screen and the exact gate the OpenFOAM cfd_internal_flow solve is checked against. Laminar (Re<2300) is Hagen–Poiseuille Δp = 128·μ·L·Q/(π·D⁴) with its D⁴ scaling — exact; turbulent uses smooth-pipe Blasius, or Colebrook–White when roughness_mm is given (the Colebrook value is always reported for turbulent flow) — a ±10 % Moody-band correlation (fidelity labeled). Give flow as flow_rate_lpm or velocity_m_s; fluid μ,ρ from a name ('water-20c','air-20c','oil-sae30-20c','glycerin-20c') or explicit mu_pa_s+rho_kg_m3. Escalate turbulent cases to cfd_internal_flow_submit(turbulence='kOmegaSST').

Returns {reynolds, regime, velocity_m_s, flow_rate_m3_s, friction_factor, colebrook_friction_factor, relative_roughness, pressure_drop_pa, wall_shear_pa, hagen_poiseuille_pa, laminar, fidelity, band_pct, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
fluidNowater-20c
mu_pa_sNo
length_mmYes
rho_kg_m3No
diameter_mmYes
roughness_mmNo
velocity_m_sNo
flow_rate_lpmNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations provide readOnlyHint=true, but the description goes far beyond that: it discloses that this is analytic (NO solver), explains the fidelity label ('±10 % Moody-band correlation'), mentions that 'the Colebrook value is always reported for turbulent flow', and details the exact return structure. It even describes when the output includes an 'escalate_to' field. This adds substantial behavioral context beyond the annotations, with no contradictions.

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 long but every sentence adds value: it front-loads the core purpose, covers regimes, formulas, escalation, and return fields. While it could be trimmed, the density of useful information justifies the length. It is structured logically, moving from purpose to execution details to escalation, and ends with the return JSON. Slight redundancy in explaining formula details could be condensed, but it's far from bloated.

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 physically-complex tool with eight parameters, no output schema, and no parameter descriptions, this description is remarkably complete. It covers the laminar and turbulent regimes, the exact formulas used, the conditions for Colebrook, the fidelity and band, and the full return object including escalate_to. The agent has everything needed to call the tool correctly and interpret results, even without an output schema.

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?

The input schema has 0% description coverage, so the description must fully compensate. It does: it explains the fluid parameter ('fluid μ,ρ from a name ... or explicit mu_pa_s+rho_kg_m3'), the flow input options ('flow_rate_lpm or velocity_m_s'), and the effect of roughness_mm ('Colebrook–White when `roughness_mm` is given'). It also clarifies the required diameter and length units. Every parameter's purpose is effectively communicated.

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 opens with 'Analytic straight-pipe pressure drop (NO solver)' and immediately identifies it as 'the fast internal-flow screen and the exact gate the OpenFOAM cfd_internal_flow solve is checked against'. This states both the verb (compute pressure drop), the resource (straight pipe), the nature (analytic, no solver), and explicitly distinguishes it from the sibling cfd_internal_flow_submit. The agent can immediately understand what the tool does and how it differs from related tools.

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 provides explicit when-to-use guidance: 'the fast internal-flow screen' for quick estimates, and 'the exact gate' for validation of the solver. It also gives an explicit escalation rule: 'Escalate turbulent cases to cfd_internal_flow_submit(turbulence='kOmegaSST')'. This tells the agent exactly when to use this tool instead of the alternative, meeting the highest bar for usage guidance.

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

chain_driveChain DriveA
Read-only

Rate an ANSI roller-chain drive (ASME B29.1). Rated at the lower of the link-plate-fatigue (HP1=0.004N1^1.08n1^0.9P^(3-0.07P), low speed) and roller-impact (HP2=1000KrN1^1.5P^0.8/n1^1.5, high speed) envelopes, P in inches. Give chain_pitch_mm (matching add_sprocket) OR a chain_number ("40","60",...) for pitch+Kr; strands scale by the B29.1 factor. Powers in W. Returns {rated_power_w, type1_power_w, type2_power_w, governing, strands, strand_factor, ..., power_sf?, pass}. k_r overrides the roller-impact constant the chain_number lookup supplies (29 for the 25-240 series, 17 for the lightweight #41) — needed for a chain outside the ANSI table.

ParametersJSON Schema
NameRequiredDescriptionDefault
k_rNo
power_wNo
strandsNo
speed_rpmYes
teeth_smallYes
chain_numberNo
chain_pitch_mmNo

TDQS

A4.5/5.0
Behavior5/5

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

The description discloses the governing philosophy (lower of fatigue and impact envelopes), includes the actual formulas, explains how strands scale, and enumerates the return fields. This goes well beyond the readOnlyHint annotation and gives the agent a realistic model of what the tool computes and returns.

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 information-dense and front-loaded, with every clause serving a purpose. It is a single long paragraph, which makes it less scannable, but the inclusion of formulas and output details earns its length.

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 description compensates for the missing output schema by listing the expected result fields and explaining the capacity envelopes. It is not fully complete because the exact meaning of 'pass' and 'governing' is left implicit, and the '...' in the return object indicates unspecified fields.

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?

With 0% schema description coverage, the description must explain parameters, and it does so for most: chain_pitch_mm vs chain_number, strand scaling, and k_r override semantics. However, power_w's role is only implied through 'Powers in W' and the output field power_sf?, and the formula symbols N1/n1/P are not explicitly mapped to teeth_small/speed_rpm/pitch.

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 opens with a specific verb-resource statement: 'Rate an ANSI roller-chain drive (ASME B29.1)'. It clearly distinguishes this from transmission siblings like belt_drive and gear_rating by naming the exact standard and component type.

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 use context: rating roller-chain drives under ASME B29.1, and explains when to supply chain_pitch_mm versus chain_number and when k_r is needed for a chain outside the ANSI table. It does not explicitly state exclusions or name alternative tools for non-chain drives, so it stops 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.

chamfer_edgesChamfer EdgesA

Chamfer (bevel) specific edges of a shaped Part object — the direct-shape counterpart to fillet_edges.

handle: handle of the object to chamfer (e.g. 'box_1', a boolean result). edges: non-empty list of edge references. Each may be a tag ('e_...' from list_edges, preferred), an 'EdgeN' string, or a bare 1-based integer index. size: symmetric chamfer leg distance in mm (applied equally to both faces meeting at the edge, i.e. dist1 = dist2 = size). Must be > 0. Default 1.0. name: label for the resulting feature object. Default 'Chamfer'. per_edge: add the edges one at a time, validating after each, instead of in a single apply. Slower; for geometry known to be blend-hostile. allow_partial: accept a partial result instead of aborting. Off by default.

The base object is hidden (consumed into the chamfer feature). Validated exactly like fillet_edges (issue #283) — Shape.isValid(), unchanged solid count, no growth of the tight bounding box — before a handle is issued.

Returns {handle, name, volume (mm^3), edges (resolved 1-based indices actually chamfered), checks {valid, solids, envelope_ok, envelope_growth_mm, envelope_tol_mm}, mode ('batch' | 'per_edge'), partial}; when partial is True, also skipped_edges and a warnings entry. On a failed check the feature is removed from the document and BlendCheckFailed is raised naming the offending edges — never a handle to corrupt geometry.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoChamfer
sizeNo
edgesYes
handleYes
per_edgeNo
allow_partialNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, the description discloses key behaviors: the base object is hidden/consumed, validation matches fillet_edges with specific checks, the feature is removed on failure, BlendCheckFailed is raised, and the tool never returns a handle to corrupt geometry. This is rich behavioral context the structured annotations do not provide.

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 dense but well organized: purpose first, then parameter semantics, then behavior and return shape. No sentence is filler; even the return-object enumeration earns its place because there is no output schema.

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 mutating, failure-prone tool with no output schema, this description is complete. It covers accepted input forms, default behavior, failure cleanup, exception naming, and the full returned result structure, including partial-result extras. An agent has what it needs to invoke the tool correctly and interpret outcomes.

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%, so the description bears the full burden, and it succeeds. It explains handle, edges and its three accepted reference forms, size as symmetric leg distance, name as a feature label, per_edge's validation cadence, and allow_partial's tradeoff. Every parameter gains meaning beyond the bare schema.

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 opens with a specific verb and resource: 'Chamfer (bevel) specific edges of a shaped Part object.' It also distinguishes itself as the 'direct-shape counterpart to fillet_edges,' immediately separating it from a key sibling and making its role unmistakable.

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 description gives clear context for parameter choices, such as preferring 'e_' tags from list_edges and using per_edge 'for geometry known to be blend-hostile.' It names fillet_edges as a counterpart, but it does not explicitly state when to prefer chamfer over fillet or mention partdesign_chamfer as an alternative.

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

change_impactChange ImpactA
Read-only

The where-used impact report for a set of changed items over a lockfile graph (issue #142, C3) — surfaces the §9 stale set as an item-level impact report BEFORE a change is committed.

lockfile: path to the lockfile (the §9 dependency graph). changed: the list of changed item / component ids (an ECO's affected set).

Returns {changed, stale (the §9 immediate re-dispatch consumers), where_used (the full transitive blast radius), ok (true iff nothing is impacted)}.

ParametersJSON Schema
NameRequiredDescriptionDefault
changedYes
lockfileYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds value by specifying the return shape {changed, stale, where_used, ok} and the semantic distinction between immediate stale consumers and the full transitive blast radius. The 'before a change is committed' phrasing reinforces that this is a non-mutating analysis. No contradiction with annotations.

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 tool's purpose is front-loaded and the structure is logical (overview, parameters, returns). However, the cryptic 'issue #142, C3' and repeated §9 spec references add noise and may confuse an agent without the surrounding document, making the description less self-contained than it could be.

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?

Given there is no output schema, the description properly documents return values. It also covers both parameters and the pre-commit usage context. For a read-only report tool this is largely complete, though concrete examples or a note about the item id format would round it out.

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 does: 'lockfile' is defined as the path to the §9 dependency graph, and 'changed' is defined as a list of changed item/component ids from an ECO's affected set. This adds significant meaning beyond the bare schema types, though the element type of the 'changed' array is not specified.

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 the tool produces a where-used impact report for a set of changed items over a lockfile graph, with the verb 'surfaces' and specific resource. It identifies the output as an item-level impact report before commit, though it does not explicitly contrast with the sibling 'where_used' tool.

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 description provides clear usage context: it is for a set of changed items (an ECO's affected set) and intended to be run BEFORE a change is committed. It does not mention explicit exclusions or alternative tools, but the pre-commit framing gives useful selection guidance.

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

check_airtight_pathCheck Airtight PathA
Read-only

Functional check for an enclosed-flow part (a vacuum adapter, manifold, duct): is there a single connected void joining the inlet to the outlet, bounded by solid everywhere else? This catches what check_shape cannot — a watertight solid can still have a blocked flow path or a hidden leak. Inspection only: measures, returns no handle, mutates nothing.

handle: the part to inspect. inlet / outlet: a face reference naming each port OPENING (the rim face around the hole) — an f_* tag, 'FaceN', int index, or a role/name declared with annotate_face (e.g. "inlet"). Both ports are sealed with cap solids and the negative-space void is analysed. min_aperture_mm2: optional minimum acceptable bottleneck cross-section; a connected-but-pinched path (a near-zero 'almond slit') then fails. pad_mm: optional bounding-box margin (default max(2.0, 0.05*diagonal)).

Returns a dict (lengths mm, areas mm², volumes mm³): ok (bool) connected AND not leaky AND aperture >= threshold status (str) 'airtight' | 'bottleneck' | 'blocked' | 'leaky' connected (bool) one void joins inlet and outlet leaky (bool) with both ports capped the cavity still reaches ambient, so an unintended opening exists min_aperture_mm2 (float|null) narrowest section of the flow void bottleneck_point ([x,y,z]|null) a point on the narrowest section plane flow_void_volume_mm3 (float|null) volume of the connecting void void_components (int) number of void solids (ambient + enclosed) inlet / outlet (str) the resolved 'FaceN' references pad_mm (float) the margin used

ParametersJSON Schema
NameRequiredDescriptionDefault
inletYes
handleYes
outletYes
pad_mmNo
min_aperture_mm2No

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces this with 'Inspection only: measures, returns no handle, mutates nothing.' It adds meaningful behavioral detail beyond the annotations: the cap-solids sealing method, the negative-space void analysis, the bottleneck threshold behavior, and the leak-detection semantics. It doesn't describe side effects (there are none) or failure modes, but for a read-only inspection tool this is strong coverage.

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 well-organized: a one-sentence purpose, a contrast with the sibling, a short inspection-only note, then parameter explanations and a return-value list. It earns its length because every section adds information an agent needs. Slightly long, but the structure (purpose → params → returns) makes it scannable.

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 5-parameter tool with no output schema, the description is complete: it documents all parameters, explains the return dict fields with units, and covers the behavioral semantics (capping, void analysis, bottleneck threshold). An agent has everything needed to invoke it correctly and interpret the result.

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%, so the description carries the full burden, and it delivers. It explains what 'handle' is, what 'inlet'/'outlet' mean (face reference naming each port OPENING, with accepted forms: f_* tag, 'FaceN', int index, or role/name from annotate_face), what min_aperture_mm2 does, and what pad_mm defaults to. This is far beyond what the bare schema provides.

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 verb ('functional check'), a precise resource ('enclosed-flow part'), and the exact question it answers: is there a single connected void joining inlet to outlet, bounded by solid everywhere else. It also explicitly contrasts itself with check_shape, which is a sibling in the tool list, so an agent can distinguish it 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 explicitly says when to use this tool ('catches what check_shape cannot — a watertight solid can still have a blocked flow path or a hidden leak') and names the alternative. It also states the inspection-only nature and the required port references, giving clear context for when this tool is appropriate.

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

check_shapeCheck ShapeA
Read-only

Check a shaped object's geometry validity and topology before you build on it. Inspection only — measures, returns no handle, mutates nothing, and does NOT auto-repair. Use it as a guard after booleans/sweeps/imports to confirm you have one clean watertight solid.

Note: a watertight solid can still have a BLOCKED or LEAKY enclosed-flow path — watertightness says the shell is closed, not that an internal channel is unobstructed and leak-free. For ducts/manifolds/adapters use check_airtight_path(inlet, outlet) to verify the flow path.

handle: the object to inspect.

Returns a dict (volumes in mm3): valid (bool) OCC topology/geometry is sound watertight_solid (bool) exactly one solid AND valid AND closed — the 'safe to keep building' verdict shape_type (str) e.g. 'Solid', 'Shell', 'Compound', 'Wire' closed (bool) no free boundary edges solids (int) number of solids (want 1 for a part) shells (int) number of shells faces (int) number of faces edges (int) number of edges volume_mm3 (float) total volume (0 for open/2D shapes) is_null (bool) the shape is empty check (str) present only when valid is False — diagnostics were printed to the worker log check_error (str) present only if the diagnostic pass itself raised

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond readOnlyHint/openWorldHint, the description states it is inspection only, mutates nothing, returns no handle, and does NOT auto-repair. It also discloses the watertight-vs-airtight nuance and that diagnostics are printed to the worker log when invalid.

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 longer than average but every section earns its place: purpose/caveat, usage, parameter, and return dictionary, which acts as the de facto output schema. Key constraints are front-loaded and the return field list is clearly structured.

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?

There is no output schema, yet the description provides a full field-by-field response contract including types, units, whether fields are conditional, and the meaning of watertight_solid. Combined with the usage and safety caveats, an agent has enough to call and interpret the result correctly.

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?

The handle parameter is explained as 'the object to inspect,' giving semantic role beyond the raw string type in the schema. It doesn't detail where to obtain handles or whether they are registered identifiers, but with a single parameter the added meaning is sufficient.

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 verb and resource: checking a shaped object's geometry validity and topology. It also explicitly contrasts with check_airtight_path, making the scope (shape watertightness vs flow-path airtightness) unambiguous.

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 explicitly tells the agent when to use the tool: 'as a guard after booleans/sweeps/imports' before building. It also names the alternative check_airtight_path and the condition (ducts/manifolds/adapters) where the sibling is preferred.

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

cht_channel_submitCHT Channel SubmitA
Destructive

Conjugate heat transfer via Elmer (P3 M6 frontier), asynchronous — ONE solve spanning a plug-flow fluid channel AND a conducting solid wall coupled at their shared interface. Requires ElmerSolver; when absent this returns {ok:false, reason, install} rather than raising.

Builds the two-body channel (constant outer flux_w_m2, inlet Dirichlet t_in_c, all else adiabatic) whose gates are exact WITHOUT a Nusselt correlation: the outlet bulk temperature follows the energy balance q″·L = ṁ·c_p·ΔT and the solid-layer drop is q″·t/k. Defaults are the live-validated water channel (cell Péclet ≈ 9 — the builder rejects > 25, where stabilized advection visibly leaks the energy balance). Also accepts a prepared case_dir.

Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for {ok, t_outlet_mean_c, t_out_exact_c, energy_balance_ratio (≈1, ±3%), dt_solid_k, dt_solid_exact_k, solid_drop_ratio (≈1), pe_cell, case_dir}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nxNo
sifNocase.sif
t_in_cNo
k_fluidNo
k_solidNo
case_dirNo
cp_fluidNo
length_mNo
ny_fluidNo
ny_solidNo
flux_w_m2No
rho_fluidNo
velocity_m_sNo
fluid_height_mNo
solid_thickness_mNo

TDQS

A4.4/5.0
Behavior5/5

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

Adds substantial context beyond annotations: error behavior when ElmerSolver is absent, validation rejection threshold, return object shapes, and the instruction to poll job_result. This is exactly the kind of behavioral detail annotations alone cannot convey.

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?

Three dense paragraphs with no redundancy. The first sentence front-loads the core purpose and async behavior; subsequent sentences add prerequisite, validation, and return contract. Every sentence earns its place.

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?

Given no output schema and 0% schema parameter coverage, the description covers return values, error handling, validation limits, and the job polling workflow. It leaves individual parameter roles mostly to inference, which is a partial gap for a 15-parameter 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 coverage is 0%, so the description must compensate. It explicitly explains flux_w_m2, t_in_c, and case_dir, and the physical context implies meaning for thermal and geometric parameters. However, 12 of 15 parameters remain undocumented in both schema and description, leaving meaningful gaps.

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+resource: 'Conjugate heat transfer via Elmer', 'ONE solve spanning a plug-flow fluid channel AND a conducting solid wall coupled at their shared interface.' This clearly distinguishes it from siblings like cht_graetz_submit by naming the coupled solid-wall physics.

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: asynchronous execution, requires ElmerSolver, accepts a prepared case_dir, and rejects Péclet >25. It does not explicitly name alternatives, but the domain is scoped precisely enough that an agent can infer when to use it.

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

cht_graetz_submitCHT Graetz SubmitA
Destructive

Flow-coupled Graetz channel via Elmer (SIMULATION_NEXT B4), asynchronous — the TRUE Nusselt validation that upgrades cht_channel_submit's plug flow: FlowSolve computes the real laminar profile and HeatSolver rides on it (Convection = Computed) between two isothermal walls. Requires ElmerSolver; when absent this returns {ok:false, reason, install} rather than raising.

Two gates: the solved parabola's u_max/u_mean ≡ 3/2 exactly, and the developed mixing-cup decay d ln(T_wall−T_bulk)/dx fitted over the second half of the channel yields Nu, gated against the Graetz eigenvalue Nu_T = 7.5407 (parallel plates, constant wall temperature) — a slug profile would give π² = 9.87, so the gate also proves the profile coupling is real. This closes the loop with the h_estimate correlation screen. The writer polices Re < 400, development lengths inside the first 45 %, and cell Péclet ≤ 25. Also accepts a prepared case_dir.

Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for {ok, u_max_over_mean (≈1.5), nu_fit, nu_exact, nu_ratio (≈1, ±10 %), nu_slug, reynolds, prandtl, pe_cell, case_dir}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nxNo
nyNo
sifNocase.sif
gap_mNo
t_in_cNo
k_fluidNo
case_dirNo
cp_fluidNo
length_mNo
mu_fluidNo
t_wall_cNo
rho_fluidNo
velocity_m_sNo

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description discloses asynchronous behavior (returns job_id/status/cache_hit), graceful failure when ElmerSolver is missing, and the writer's constraints on Re, development length, and Péclet. These are valuable behavioral details not present in the annotations, and nothing contradicts them.

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 dense but every sentence serves a purpose: it front-loads the core differentiator, then covers gates, constraints, failure mode, and return/polling details. No fluff is present, and the structure flows logically from purpose to usage to behavior.

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?

This is a complex submit tool with 13 parameters and no output schema, yet the description covers the workflow thoroughly: prerequisites, asynchronous pattern, acceptance gates, writer constraints, and exact result fields to poll. The only missing piece is per-parameter documentation, which is already penalized under parameter semantics; overall, an agent has enough to call and interpret 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?

With 0% schema description coverage, the description must compensate for parameter meaning. It provides domain context (channel flow, fluid properties, wall temperatures) and explicitly mentions case_dir as an alternative input, but it does not individually document the 13 parameters. The parameter names and defaults partially self-explain, and the domain narrative helps, but full compensation is lacking.

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 explicitly states this tool runs a flow-coupled Graetz channel simulation via Elmer to compute the true laminar Nusselt number, contrasting it with the sibling cht_channel_submit's plug-flow approximation. It names the resource (ElmerSolver) and the action (submit), making the intent unmistakable.

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 description positions the tool as an upgrade to cht_channel_submit, indicating when the more accurate Graetz validation is appropriate, and states the ElmerSolver prerequisite. It does not explicitly list when not to use it, but the sibling contrast and requirement provide clear contextual guidance.

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

classify_face_sidesClassify Face SidesA
Read-only

Inside-vs-outside topology: for every face, decide whether its outward side opens into an enclosed cavity (wetted) or ambient (exterior). Answers the "which faces are inside the airflow path" question from issue #19 and suggests a role per face. Inspection only; returns no handle, mutates nothing.

With seal_ports=True (default) any declared inlet/outlet roles (annotate_face) are capped first, so an OPEN duct's bore reads as the enclosed flow cavity rather than as ambient.

handle: the part. seal_ports: cap declared inlet/outlet before classifying.

Returns a list (one per face) of dicts: tag / index (str) stable f_* tag and 'FaceN' kind (str) surface kind (planar/cylindrical/…) side (str) 'interior' | 'ambient' | 'ambiguous' suggested_role (str) 'wetted' for interior, 'ambient' for exterior, else null declared_role (str) the role already annotated on this face, if any

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes
seal_portsNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Inspection only; returns no handle, mutates nothing.' It goes beyond annotations by explaining the seal_ports behavior and the meaning of 'interior' vs 'ambient', adding substantial behavioral context. No contradiction with annotations.

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 dense but well-organized: purpose, context, side effects, parameter explanations, and output format are all covered without redundancy. The main goal is front-loaded, and each sentence contributes valuable information.

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 tool with no output schema, the description provides a detailed return structure (list of dicts with fields and types). It addresses the complex topology classification, mentions the interaction with annotate_face, and includes all necessary context. Nothing an agent needs to invoke it correctly 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%, so the description carries the full burden. It provides clear, meaningful explanations for both parameters: 'handle: the part' and 'seal_ports: cap declared inlet/outlet before classifying'. This fully compensates for the absent 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?

The description states a specific verb and resource: 'for every face, decide whether its outward side opens into an enclosed cavity (wetted) or ambient (exterior)'. It clearly distinguishes the tool from related siblings like annotate_face and list_face_roles by focusing on topology classification rather than role assignment. The reference to issue #19 adds concrete 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?

The description effectively communicates when to use the tool (when answering the 'which faces are inside the airflow path' question) and even touches on interaction with annotate_face through seal_ports. However, it does not explicitly state when not to use it or name direct alternatives, which prevents a perfect score.

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

close_documentClose DocumentA
Destructive

Close a document by name (or 'active' for the currently active one). Frees its objects and invalidates any handles into the closed doc. Returns {closed, invalidated_handles}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoactive

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description specifies concrete consequences: objects are freed and handles into the closed document are invalidated. It also discloses the return payload, which is valuable given there is no output schema. No contradiction with annotations.

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?

Three short sentences with no filler: target selection, side effects, and return value are each covered. The most important action is front-loaded.

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-optional-parameter tool with destructiveHint and no output schema, the description is complete: it names the target, the side effects, and the return shape. Agents have enough information to invoke it safely and interpret the result.

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 for the single name parameter is 0%, but the description compensates by explaining that it takes a document name and that the literal 'active' refers to the currently active document. This clarifies the default/sentinel behavior, though it does not detail what counts as a valid name.

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: closes a document, selectable by name or 'active'. The target is clearly a document rather than a workspace or sketch, so it is distinguishable from siblings like close_workspace and close_sketch.

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?

The description explains how to identify the document but does not say when to choose this tool over related operations such as save_document, close_workspace, or set_active_document. No explicit when/when-not or alternative routing is provided.

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

close_sketchClose SketchB
Read-only

Recompute and report DOF status. Returns {geometry_count, constraint_count, open_vertices, fully_constrained}.

ParametersJSON Schema
NameRequiredDescriptionDefault
sketchYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description does not contradict them. It adds useful context by listing the return fields and the DOF-status concept, but doesn't disclose edge cases, failure modes, or what 'open_vertices' means. With annotations covering the safety profile, this is adequate but not rich.

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?

One front-loaded sentence with no filler; the action and return shape are both included. The description is appropriately sized for the tool's simplicity.

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 description covers the core behavior and return format, which matters because there is no output schema. However, it omits parameter semantics and any usage context, and it doesn't reconcile the 'close' title with the read-only recompute behavior. For a simple tool this is a moderate gap, not a fatal one.

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 description does not explain the 'sketch' parameter beyond its name and type. It doesn't say whether it expects an ID, name, or object, nor how to obtain one. The single self-descriptive parameter earns minimal credit, but the description fails to compensate for the missing schema documentation.

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 action ('Recompute and report DOF status') and the exact output object. It is clearly distinct from editing tools like add_sketch_constraint, but it doesn't explicitly differentiate itself from siblings such as mechanism_kinematics.

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?

No statement of when to call this tool, what prerequisites exist, or which alternatives to prefer. 'Recompute' implies post-edit validation, but the description never says 'use after adding constraints' or contrasts with other analysis/check tools.

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

close_workspaceClose WorkspaceA
Destructive

Shut down a workspace's worker and free its pool slot. All of that workspace's documents, unsaved changes, and handles are lost. Closing the workspace you are currently in returns you to the "default" workspace. The default workspace can be closed too (its worker respawns clean on next use). Returns {closed: , workspace: , current: }.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark this as destructive, but the description goes further by warning that all documents, unsaved changes, and handles are lost, and explains that the default workspace respawns cleanly. This adds substantial behavioral context beyond the structured annotations.

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?

Every sentence in the description earns its place: action, consequences, current-workspace behavior, default-workspace behavior, and return value. It is front-loaded with the most important information and contains no filler.

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 single-parameter destructive tool with no output schema, the description fully covers what happens, including side effects, special cases, and the exact return shape. Nothing needed for 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?

The schema only provides a required string 'name' with no description. The tool description compensates by making clear the parameter refers to a workspace, and specifically notes that the current workspace and the default workspace are valid special cases. It does not list sources of valid names, but the meaning is sufficiently conveyed.

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 verb and resource: "Shut down a workspace's worker and free its pool slot." It clearly distinguishes this from sibling tools like close_document or use_workspace by emphasizing worker shutdown, pool slot release, and loss of workspace documents and handles.

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 description gives clear context for when closing is appropriate, including the behavior of closing the current workspace and the default workspace. It lacks an explicit comparison to alternatives like restart_worker, but the usage context is clear enough that an agent can select this tool appropriately.

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

cnc_machinability_checkCNC Machinability CheckA
Read-only

3-axis CNC machinability screen off a live solid — pure geometry, NO CAM engine (no toolpath, no gouge check, no holder collision).

Counts SETUPS from a tool-approach census: for every machined face, which of ±X/±Y/±Z can both address it (the normal does not point away — a wall parallel to the tool axis is milled by the cutter's periphery) and reach it (a ray from the face escapes the solid, the same caster the moldability undercut check uses), reduced to a minimum cover. Faces lying on the stock envelope are excluded: they are billet surfaces, and counting them would quote six setups for a plain block.

Findings: 'undercut' (a machined face no principal approach reaches — 5-axis, a special cutter, or a redesign), 'deep_pocket' (depth/(2·corner radius) past max_l_over_d — the corner radius caps the cutter and it cannot reach), 'small_radius' (an internal corner below the smallest cutter quoted, including a SHARP planar corner reported as radius 0, which no rotating tool can produce), 'thin_wall'. pass is false when any fires; more than max_setups is a warning, not a failure. fidelity='correlation', band_pct=None (an ordinal screen — rank variants with score, don't gate on it).

Returns {setups, setup_directions, coverage, machined_faces, stock_faces, machined_area_mm2, min_internal_radius_mm, max_l_over_d_seen, undercut_faces, findings:[{code, severity, feature, detail}], warnings, score, pass, fidelity, band_pct, basis, escalate_to='cnc_time_estimate', limitations, n_faces}.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYes
max_setupsNo
min_wall_mmNo
max_l_over_dNo
min_tool_radius_mmNo

TDQS

A4.3/5.0
Behavior5/5

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

The description richly discloses behavior beyond the annotations: it explains the setup-counting census, the ray-casting reach test, the exclusion of stock-envelope faces, the exact finding codes and their triggers, pass/fail logic, and the fidelity='correlation' limitation. This far exceeds the readOnlyHint and openWorldHint annotations.

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 long but dense and front-loaded: the boundary 'pure geometry, NO CAM engine' appears immediately. Each sentence carries functional content, and the output return list is justified by the absence of an output schema. It could trim some elaboration, but it is structured and purposeful.

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 output schema, the description covers the output fields, finding semantics, pass/warning behavior, fidelity limitations, and escalation target. Minor gaps remain: parameter semantics for min_wall_mm and min_tool_radius_mm, and no explicit types for returned fields, but overall it is nearly complete for an agent to invoke 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 description coverage is 0%, so the description carries the burden. It gives functional meaning for max_setups and max_l_over_d in context, and model is implied by 'live solid.' However, min_wall_mm and min_tool_radius_mm are not directly explained despite the tool mentioning 'thin_wall' and 'smallest cutter quoted.' Partial compensation, not full.

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 clearly identifies a specific verb ('screen'), resource ('live solid'), and scope ('3-axis CNC'), and distinguishes itself from CAM engines by explicitly saying 'NO CAM engine (no toolpath, no gouge check, no holder collision).' It also names the escalation target cnc_time_estimate, making the tool's role clear relative to its 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?

The description gives valuable usage guidance: it is a geometric screen, not a CAM estimate; findings are ordinal, so 'rank variants with score, don't gate on it'; and max_setups overage is a warning, not a failure. It names cnc_time_estimate as the escalation path. It does not explicitly state 'use this when you need X instead of Y' for all alternatives, but the context is clear.

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

cnc_time_estimateCNC Time EstimateA
Read-only

Machining time for a live solid from a material-removal-rate model — the honest cnc machine time cost_estimate's flat volume table cannot give.

stock         = bbox grown by stock_allowance_mm per side
roughing_min  = (stock − part volume) / MRR(material)
finishing_min = machined face area / finish area-rate(material)
total         = (roughing + finishing)/utilisation · tolerance factor
                + setups · setup_min

MRR is per material class (aluminium 60, steel 12, stainless 6, titanium 2.5 cm³/min …) — ratios that track the standard machinability ratings amplified by the depth-of-cut headroom a soft alloy allows on the same spindle. Stock-envelope faces are excluded from the finishing area: facing a billet is not finishing a pocket. setups defaults to the count cnc_machinability_check derives from the same solid, so the two tiers agree. tolerance_class ('IT7', 7, …) scales the cutting time through the shared tolerance-cost corpus, so a tolerance costs the same here as in tolerance_cost_check.

fidelity='correlation', band_pct=50 — the RSS of MRR scatter (±40 %) and cut-time utilisation scatter (±25 %), against the flat table's ±100 %; supply a measured mrr_cm3_min and it tightens to 30. Feed machine_time_hr into cost_estimate(machine_time_hr=…) to replace the table there too.

Returns {machine_time_min, machine_time_hr, roughing_min, finishing_min, cutting_min, setup_min_total, removed_volume_mm3, stock_volume_mm3, removal_fraction, machined_area_mm2, setups, setups_basis, material_class, material_basis, mrr_cm3_min, finish_cm2_min, utilisation, tolerance, bbox_mm, part_volume_mm3, fidelity, band_pct, basis, warnings, next}.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYes
setupsNo
materialYes
setup_minNo
mrr_cm3_minNo
utilisationNo
finish_cm2_minNo
tolerance_classNo
stock_allowance_mmNo

TDQS

A4.5/5.0
Behavior5/5

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

Read-only annotations are present)Skip the description adds substantial detail: the full formula, MRR defaults per material class, stock allowance logic, exclusion of stock-envelope faces from finishing area, tolerance scaling, fidelity and band_pct estimates, and the exact output fields. No contradiction with annotations.

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 long but well-structured with a formula and explanation of the output fields. It is front-loaded with the core purpose and the distinction from the sibling tool. Some sentences are dense, but each contributes useful context.

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?

Given no output schema, the description lists all return fields and explains the calculation pipeline, including accuracy/band_pct behavior and how to feed results into `cost_estimate`. It is missing explicit definition of `model`, but the overall context is sufficiently complete for a read-only estimation tool.

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 explain parameters. It explains `stock_allowance_mm`, `setups` (defaulting to `cnc_machinability_check`), `material`, `mrr_cm3_min`, `utilisation`, `setup_min`, and `tolerance_class`. However, `model` and `finish_cm2_min` are less explicitly defined, though `finish_cm2_min` is implied by 'finish area-rate(material)'.

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 purpose: computing machining time from a material-removal-rate model, and explicitly contrasts itself with `cost_estimate`'s flat volume table. This clearly distinguishes it from siblings like `cost_estimate` and `cnc_machinability_check`.

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 description names alternative tools (`cost_estimate`, `cnc_machinability_check`) and explains how they relate (defaults from `cnc_machinability_check`, and feeding `machine_time_hr` back into `cost_estimate`). It does not give an explicit 'when to use vs when not to use' statement, but the intended context is clear.

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

component_contract_checkComponent Contract CheckA
Read-only

Builder-side contract gate for one component (issue #169) — the local half of the gate merge_assembly re-runs at fan-in. Any MCP host builds a component with the full AnkusDrive tool surface, then calls this on its part BEFORE saving, against its builder brief (a ankusdrive.builder_brief/1 slice), and repairs any failing check. Catching a violation here turns the expensive loop (build → merge → gate-fail → rebuild) into a cheap local one. Never raises on a failing check.

handle: the component's shaped object. brief: a builder brief. Only three of its keys drive checks (the rest guide the build, not the gate): envelope {min:[x,y,z], max:[x,y,z]} the part's LOCAL bbox must fit inside. interfaces {name: {origin?:[x,y,z], z_axis?:[x,y,z], tol_mm?, angle_tol_deg?}} each named frame must be PUBLISHED (publish_interface) with a sane frame, and within tolerance of a pinned origin/axis if the brief gives one. performance {requirements?: [{name, limit}], required?: bool} the quantitative spec (#226) the builder must DECLARE (declare_performance, no looser than briefed) and PROVE (verify_performance) before fan-in.

Checks run: watertight (check_shape's one-clean-solid verdict), envelope (local bbox inside the keep-out box), interface: (published + sane + in tol), performance_spec: (declared as briefed) and performance: (the last RECORDED verify_performance verdict says it is met).

A performance requirement the record says is NOT met fails the gate. One with no verdict yet — never verified, a solve still in flight, or a verdict invalidated by a later edit — is neither passed nor failed: it comes back in skipped with a reason, because "unverified" is not "fine" and must not be actioned as either.

Returns {handle, ok, checks:[{check, passed, detail}], reasons:[...], skipped:[{check, reason}], performance?} — ok True iff every check passed (skips never move it); reasons is the failing checks' details. A part that declares no performance contract gets no performance rows, empty skipped and no performance key, so the geometric gate is unchanged.

ParametersJSON Schema
NameRequiredDescriptionDefault
briefYes
handleYes

TDQS

A5/5.0
Behavior5/5

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

Annotations already mark readOnlyHint true and openWorldHint false; the description adds that it 'Never raises on a failing check,' explains skipped semantics (unverified is neither passed nor failed), and specifies return-shape behavior including the absence of the performance key when no performance contract is declared. This goes well beyond annotation coverage.

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?

Long but dense: every section (purpose, parameters, checks, return contract) earns its place and the critical timing is front-loaded. Issue-number references add minor noise but do not undermine the overall efficiency.

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 no output schema, the description documents the exact return shape {handle, ok, checks, reasons, skipped, performance?}, the meaning of ok, and skipped's role. It covers all checks run, key parameter semantics, and edge cases (no performance contract, no verdict yet), making it complete for an agent to call 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%, and the description compensates fully: handle is defined as the component's shaped object, and brief's three gate-driving keys (envelope, interfaces, performance) are each structurally described with semantics like PUBLISHED, tolerance, declared, and prove. It also clarifies that other brief keys guide the build, not the gate.

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 'Builder-side contract gate for one component' and positions it as the local half of the gate merge_assembly re-runs at fan-in. It names the specific action (check contract), the resource (component vs builder brief), and the sibling/alternative merge_assembly, so an agent can distinguish it.

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 instructs when to call: after building a component with the full AnkusDrive tool surface and BEFORE saving, against a builder brief. It contrasts the cheap local check with the expensive build → merge → gate-fail → rebuild loop and references merge_assembly as the fan-in re-run, giving clear placement among siblings.

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

contact_setupContact SetupA

Set up surface-to-surface contact between face pairs for a CalculiX solve and flip the solver to nonlinear — no new solver (promotes the CCX contact/nonlinear flags the FEM path already exposes). face_pairs is a list of {a:{handle, tag|face}, b:{handle, tag|face}} (master, slave) pairs; friction is the Coulomb coefficient (0 = frictionless); slope optionally sets the penalty contact stiffness; nonlinear (default True) sets the solver's GeometricalNonlinearity.

Run fem_run + fem_results after. Gate RELATIVE to a bonded reference on the same mesh: a bonded model is stiffer (less peak displacement) than frictional contact. Returns {contacts:[handles], n_pairs, friction, nonlinear}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoContact
slopeNo
analysisYes
frictionNo
nonlinearNo
face_pairsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=false, destructiveHint=false, but that's minimal; the description adds key behavioral context: it promotes CCX contact/nonlinear flags the FEM path already exposes, meaning no new solver is created. It also clarifies the gate relationship (bonded model is stiffer and less peak displacement), which helps the agent understand the physical behavior of the results. It doesn't mention whether it modifies the existing analysis in place or creates a new contact object, but the 'promotes the flags' phrasing gives some insight.

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 two paragraphs, but every sentence is informative: the first paragraph explains the operation and parameter details; the second provides post-requisites and a physical interpretation. It is front-loaded with the core action and delivers the most critical usage guidance. No filler words; it is concise yet complete.

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?

Given the tool's complexity (6 params, no output schema, nested objects in face_pairs), the description provides enough to call it correctly: it explains the face_pairs structure, parameter defaults, the effect on the solver, the post-requisite sequence, and a relational gate for interpreting results. It even mentions the return value structure ('Returns {contacts:[handles], n_pairs, friction, nonlinear}') so the agent knows what to expect. There is no critical missing information.

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?

With 0% schema description coverage, the description must compensate, and it does. It explains the semantics of `face_pairs` (list of {a:{handle, tag|face}, b:{handle, tag|face}} master/slave pairs), `friction` as Coulomb coefficient (0=frictionless), `slope` as penalty contact stiffness, and `nonlinear` default True sets GeometricalNonlinearity. It also notes the `analysis` parameter is in the schema but not explained; however, the name itself is clear. This is strong compensation for the schema 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 description states a specific verb ('Set up'), a clear resource ('surface-to-surface contact between face pairs for a CalculiX solve'), and explicitly mentions it flips the solver to nonlinear. It also distinguishes itself from a new solver setup, which differentiates it from sibling tools like fem_set_solver and fem_run. The purpose 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 Guidelines4/5

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

The description gives explicit sequencing guidance: 'Run fem_run + fem_results after.' It also provides a relative gate ('Gate RELATIVE to a bonded reference on the same mesh'), indicating when to use this in comparison to a bonded assumption. However, it does not explicitly state when not to use this tool or name alternative tools (e.g., fem_set_solver) for setting nonlinearity separately, but the context is clear enough for an agent to infer usage.

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

copy_shapeCopy ShapeA

Duplicate a shaped object as an INDEPENDENT static solid.

Unlike add_part (which creates an App::Link that tracks the source), this deep-copies the geometry: later edits to the original do NOT propagate to the copy. Use it to seed a mirror/pattern, or to drop a standalone duplicate instance into an assembly.

handle: handle of the source object (must have a Shape). placement: optional absolute [x, y, z] translation in mm applied to the copy's base. Omit to leave the copy coincident with the source. The source object is unchanged and stays visible. name: optional name for the new object (default '_copy').

Returns {handle, name, volume}: handle is a new 'copy_N' handle, name is the FreeCAD object name, volume is the copied solid's volume in mm^3.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
handleYes
placementNo

TDQS

A5/5.0
Behavior5/5

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

Annotations only state readOnlyHint=false and destructiveHint=false. The description adds essential behavioral context beyond those flags: later edits to the original do NOT propagate, the source stays unchanged and visible, the copy is an independent solid, and the exact output shape is documented. No contradiction with annotations.

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 the core purpose, then uses a compact contrast with add_part, then parameter details, then return values. Every sentence adds information; there is no filler or redundancy despite covering deep-copy semantics, placement, defaults, and output format.

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 no output schema and almost no schema documentation, the description carries full responsibility and meets it: it explains prerequisites, transformation behavior, default naming, output fields, and the distinction from a sibling tool. An agent has everything needed to call 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 coverage is 0% and the schema only gives parameter names and types. The description fully compensates: source must have a Shape, placement is an absolute [x, y, z] translation in mm applied to the copy's base, and name has an explicit default. This makes the tool invokable without guessing.

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 verb and resource ('Duplicate a shaped object') and immediately clarifies the distinguishing property: an 'INDEPENDENT static solid.' It also explicitly contrasts itself with add_part, so an agent can discriminate between the two tools without inspecting schemas.

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 names the alternative tool (add_part) and explains the key difference: this deep-copies geometry while add_part creates a tracking link. It also gives concrete use cases: 'seed a mirror/pattern' or 'drop a standalone duplicate instance into an assembly.' This is explicit when-to-use guidance.

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

cost_estimateCost EstimateA
Read-only

Per-unit cost rollup (Design for Cost). material_cost = volume·density·price ·(1+scrap) from the Materials DB (process: cnc | fdm | casting | injection). process_cost = amortized setup + per-process machine time; tooling amortized over quantity, so unit_cost falls as quantity rises. The machine-time table is order-of-magnitude (fidelity='correlation', band_pct=100) — trust the ratios between processes/quantities, not the absolute dollars; material_cost alone is exact given its inputs.

material may be any Materials-DB card name (material_list / material_get), or anything at all if you price it yourself: price_usd_kg and density_kg_m3 override the DB lookup and are flagged in breakdown.price_basis / density_basis as 'explicit' instead of 'material'. A generic word like 'aluminum' is a CATEGORY, not a card — it carries a density but no price, so it needs price_usd_kg or a real card name (AL6061-T6, …); the error says which.

Two optional inputs sharpen it. tolerance_class ('IT7', '9', …) scales the TABLE machine time by the tolerance-cost curve (see tolerance_cost_check): holding tighter than the process's natural capability roughly doubles cost every 1.5 IT grades. machine_time_hr REPLACES the table with a time a real model computed (cnc_time_estimate) and drops band_pct from 100 to that model's band (50 by default, or machine_time_band_pct); the tolerance factor is then not applied again, because cnc_time_estimate already applied the same curve. Both default to None, reproducing the pre-existing behaviour exactly.

Returns {material_cost, process_cost, tooling_amortized, unit_cost, mass_kg, fidelity, band_pct, breakdown:{…, density_kg_m3, price_usd_kg, density_basis, price_basis, machine_time_hr, machine_time_basis, base_machine_time_hr, tolerance_class, tolerance_factor, tolerance_applied, tolerance_basis}}. Errors on a material with no usable density/price and no override, an unknown process/tolerance class, or a non-positive volume/quantity/machine time.

ParametersJSON Schema
NameRequiredDescriptionDefault
processNocnc
materialYes
quantityNo
setup_minNo
volume_mm3Yes
tooling_usdNo
price_usd_kgNo
density_kg_m3No
scrap_fractionNo
machine_time_hrNo
tolerance_classNo
machine_rate_usd_hrNo
machine_time_band_pctNo

TDQS

A4.7/5.0
Behavior5/5

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

The description goes far beyond the readOnlyHint=true annotation, disclosing the fidelity assumptions of the machine-time table (fidelity='correlation', band_pct=100), the exact behavior of overrides, the fact that defaults reproduce pre-existing behavior, and the error conditions when material data is unusable. It also explains how machine_time_hr replaces table-based time and how the tolerance factor interacts with it. No statement contradicts the annotations.

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 long, but every sentence earns its place: the core formula comes first, then material semantics, then optional sharpening inputs, then the return shape and error conditions. Formatting with inline code and grouping keeps the density navigable. For a 13-parameter tool with zero schema coverage, this length is justified rather than bloated.

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?

Because there is no output schema, the description compensates by explicitly listing the complete return object, including the nested breakdown fields, plus error conditions. It also covers defaults, override behavior, fidelity/band semantics, and interaction with sibling tools. Nothing critical needed for an agent to invoke cost_estimate correctly appears to be 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?

With schema description coverage at 0%, the description carries the full burden of documenting parameters, and it covers most of them well: volume, material, process, quantity, price/density overrides, scrap, tolerance_class, machine_time_hr, and machine_time_band_pct are all explained or formula-bound. The main gap is that machine_rate_usd_hr and setup_min are only implied by 'per-process machine time' and 'amortized setup' rather than named and defined. Given the schema provides no descriptions, this is a strong but not perfect compensation.

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 opens with a specific verb and resource: 'Per-unit cost rollup (Design for Cost)' and immediately defines the calculation. It goes beyond the title by giving the exact formula and the scope (materials DB, processes, quantity amortization), so there is no ambiguity about what the tool computes. It also implicitly differentiates itself from related tools by naming material_list/material_get, tolerance_cost_check, and cnc_time_estimate as complementary rather than competing operations.

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 description gives clear context about when the tool is appropriate: for cost rollups, with material lookups from the Materials DB, or with explicit price/density overrides. It names related tools such as tolerance_cost_check and cnc_time_estimate as sources for optional sharpening inputs, and explains when those are relevant. It stops short of explicitly stating 'use this instead of X' for a direct cost-estimation sibling, but among the listed siblings no direct alternative exists, so the guidance is adequate.

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

creep_flagCreep Risk FlagA
Read-only

Screen for creep risk: compare operating temperature to the material's max service temperature (Materials DB, or an override). A screen, not a Larson-Miller life model. pass = below the service limit. Returns {operating_temp_c, service_temp_c, margin_c, stress_mpa, creep_risk, pass, reason}.

ParametersJSON Schema
NameRequiredDescriptionDefault
temp_cYes
materialNoSteel-1045
stress_mpaYes
max_service_temp_cNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark readOnlyHint=true, and the description adds meaningful behavioral context: it uses the Materials DB or an override, computes margin and pass based on service temperature, and returns a structured result. It goes beyond the schema by explaining the screening nature and pass logic, though the role of stress_mpa in the outcome is not fully explained.

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 tight sentences with no filler. The core screening action, the pass rule, and the full return shape are front-loaded and each sentence earns its place.

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 no output schema, listing the returned fields is valuable and done well. The description covers the source of service temperature, the override mechanism, and the pass criterion. The main gap is the unexplained role of stress_mpa, but overall the description is sufficient for an agent to invoke 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 description coverage is 0%, so the description carries the burden. It clarifies temp_c as operating temperature, material is looked up in the Materials DB, and max_service_temp_c acts as an override. However, the required stress_mpa parameter appears only in the return tuple and its influence on the creep check is not described.

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 ('Screen for creep risk') and names the resource and criterion ('compare operating temperature to the material's max service temperature'). It also differentiates itself from a life model ('A screen, not a Larson-Miller life model') and states the pass definition, making its purpose unambiguous.

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 description clearly conveys when this tool is appropriate: when a simple creep screen is needed rather than a Larson-Miller life model. It does not name a specific sibling alternative, but the 'not a life model' exclusion gives enough context to route an agent away from more detailed analysis.

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

declare_intentDeclare IntentA
Destructive

Record the functional invariants a part must keep satisfying, so they can be re-checked after every edit (see verify_intent). Persists in the .FCStd as a JSON property bag (AD_Intent); one contract per part — re-declaring replaces.

handle: the part. contract: a dict with any of these (declare at least one): watertight (bool) require check_shape's watertight_solid verdict. airtight_path (dict) {inlet, outlet, min_aperture_mm2?}; each port is a face tag / 'FaceN' / int / declared role-or-name. required_faces (list) face tags / 'FaceN' / declared role-or-names that must still resolve (catches a deleted/drifted face).

Returns {handle, contract} — the stored contract.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes
contractYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already mark this as destructive (destructiveHint=true), and the description adds value by specifying the exact destructive behavior: 'one contract per part — re-declaring replaces.' It also discloses the persistence mechanism (JSON property bag AD_Intent in the .FCStd), which is useful behavioral context beyond the annotation.

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 moderately long but every sentence earns its place: it states purpose, persistence, replacement semantics, and a compact but complete contract schema breakdown. The use of code-fenced parameter details makes it scannable and well-structured. There is no redundant or promotional language.

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 tool with complex nested contract input and no output schema, the description covers the return value ('Returns {handle, contract}'), the storage location, replacement behavior, and references to related tools (check_shape, verify_intent) that supply necessary context. An agent can invoke it confidently without needing further clarification.

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?

With schema_description_coverage at 0%, the description fully compensates by detailing both parameters: 'handle' is identified as the part, and 'contract' is explained as a dict with specific recognized keys (watertight, airtight_path, required_faces), their types, and the constraint to declare at least one. This far exceeds what the bare input schema provides.

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 action ('Record the functional invariants'), the target resource ('a part'), and the purpose ('so they can be re-checked after every edit'). It also distinguishes itself from verify_intent by explicitly linking the recorded invariants to that companion tool. This is a clear, differentiated purpose 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?

The description establishes a clear workflow context: invariants are recorded so they can be re-checked after every edit, with a direct pointer to verify_intent. It also clarifies the overwrite behavior ('re-declaring replaces'), which guides when to call it again. However, it does not explicitly name alternative tools or say when not to use it, so it lacks an explicit exclusion.

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

declare_performanceDeclare PerformanceA
Destructive

Record a quantitative PERFORMANCE spec on a part so it can be re-proved after every edit — the performance twin of declare_intent, which only covers geometry. Persists in the .FCStd as a JSON property bag; one contract per part, re-declaring replaces it.

Each requirement is metric-agnostic — the contract layer only orchestrates, so the metric is whatever the named tool already returns, and "Cd ≤ 0.30", "Δp ≤ 50 Pa", "first mode ≥ 200 Hz" and "ΔT ≤ 40 K" are the same machinery:

{"name": "drag_at_cruise",
 "metric": "cd",                        # dotted path into the tool's result
 "tool": "cfd_external_flow_submit",    # what measures it at solver tier
 "conditions": {"model": "$handle", "velocity_m_s": 30, "fluid": "air-20c"},
 "limit": {"max": 0.30},                # max, min, or both (a window)
 "screen": {"tool": "cfd_body_drag", "metric": "cd",
            "conditions": {"shape": "sphere", "diameter_mm": 50,
                           "velocity_m_s": 30}},
 "fidelity_floor": "solver",            # "screen" if an estimate is proof enough
 "trust": {"converged": true, "band_max_pct": 5}}

"$handle" anywhere in conditions is replaced with this part's handle at verification time, so a contract is portable between parts. trust demands are enforced by verify_performance against the solver's own trust block: a requirement asking for converged: true can never be satisfied by an unconverged solve.

Returns {handle, contract: {requirements: [...]}, n_requirements}. Raises ValueError on a malformed requirement, naming the offending one.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes
requirementsYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, it discloses concrete behaviors: persistence in the .FCStd as a JSON property bag, one contract per part with re-declaring replacing it, $handle substitution at verification time, trust enforcement by verify_performance, return shape, and ValueError on malformed requirements. This is rich and non-contradictory.

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 the core purpose, then uses a well-commented example to explain the complex requirements structure. The length is justified by the schema gap and the complexity of the requirements object; no sentences are filler.

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?

Even without an output schema, the description states the return value, error behavior, persistence, replacement semantics, and trust/verification coupling. For a mutating tool with an underspecified schema, this is complete enough for an agent to call it and interpret results 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?

With 0% schema description coverage and an empty items schema for requirements, the description carries full responsibility. It provides a detailed example requirement object with fields, comments, allowed limit forms, fidelity_floor semantics, and trust enforcement, plus the meaning of $handle. This fully compensates for the missing 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?

The description states a specific verb and resource: 'Record a quantitative PERFORMANCE spec on a part so it can be re-proved after every edit.' It also distinguishes itself from declare_intent, calling itself the 'performance twin' and noting declare_intent 'only covers geometry,' so an agent can tell them apart.

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 explicitly names the alternative tool (declare_intent) and the dimension that selects between them: geometry vs. performance. It also gives the intended context ('so it can be re-proved after every edit') and notes the replacement behavior, making when-to-use clear.

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

dem_flow_submitDEM Flow SubmitA

Discharge spheres from a flat-bottomed hopper box through a central orifice with the REAL YADE discrete-element engine and measure the steady mass-flow rate — gated against granular_screen('beverloo') (flow ∝ outlet^2.5). Submit two outlet_m sizes and feed the (outlet, flow) pair to granular_screen('beverloo_exponent') to check the Beverloo 2.5 exponent (vs the Torricelli 2.0 of a draining fluid). YADE is GPL-3.0 and is run ONLY in a subprocess; runs OFF the MCP channel via a background job.

box_m is the [Lx, Ly, Lz] hopper box (m; default [0.10, 0.10, 0.20]); outlet_m the central orifice diameter; settle_steps/flow_steps the DEM step budgets. Returns {job_id, status, cache_hit, oracle}; the job result carries the Beverloo oracle PLUS {mass_flow_kg_s, n_discharged, discharge_time_s, positions:[...]}. Absent YADE: {ok:false, reason, install, oracle}.

ParametersJSON Schema
NameRequiredDescriptionDefault
box_mNo
densityNo
outlet_mNo
radius_mNo
young_paNo
n_spheresNo
flow_stepsNo
friction_degNo
settle_stepsNo

TDQS

A4/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false, openWorldHint=false, destructiveHint=false. The description adds valuable behavioral traits: YADE is GPL-3.0, runs only in a subprocess, operates off the MCP channel via a background job, returns a job_id, and handles the case of absent YADE with an ok:false payload. This goes well beyond annotations and helps the agent manage expectations.

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 detailed and uses structured formatting (backticks for parameters, clear return types). It front-loads the main purpose before diving into specifics. While it is longer than minimal, it earns its length by covering purpose, workflow, execution model, and return values without fluff.

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?

Given the tool's complexity (9 parameters, no output schema, no parameter descriptions in schema), the description provides essential context: return format (job_id, status, cache_hit, oracle, and result details), error handling for absent YADE, and the Beverloo workflow. However, it fails to document five of the nine parameters and does not describe how the simulation is configured (e.g., density, friction). This leaves an agent with gaps when setting up a proper run.

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 box_m (as [Lx, Ly, Lz] with default), outlet_m (orifice diameter), and settle_steps/flow_steps as DEM step budgets. However, it omits density, radius_m, young_pa, n_spheres, and friction_deg, which are critical simulation parameters. The partial explanation helps but is not comprehensive.

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 clearly states a specific purpose: discharging spheres from a hopper through an orifice using the YADE engine and measuring mass-flow rate. It also distinguishes itself from likely siblings like dem_pack_submit by focusing on flow-rate measurement and referencing granular_screen gating. The verb-resource pair is specific and not a tautology.

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 description provides explicit usage guidance: 'Submit two outlet_m sizes' and feed results to granular_screen('beverloo_exponent'). It also warns that YADE runs in a subprocess and off the MCP channel, implying asynchronous handling. While it doesn't explicitly name alternatives or state when not to use this tool, the workflow is clear enough for an agent to know how to invoke it.

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

dem_pack_submitDEM Pack SubmitA

Pour N monodisperse spheres into a box and settle them under gravity with the REAL YADE discrete-element engine, then measure the random close-packing fraction φ of the settled bed — gated against granular_screen('packing') (RCP band 0.60–0.66, well below the crystalline 0.7405). YADE is GPL-3.0 and is run ONLY in a subprocess (the parent never imports it — same arm's-length isolation as the GPL Elmer/OpenFOAM binaries). Runs OFF the MCP channel via a background job, so a multi-second settle never blocks the worker.

box_m is the [Lx, Ly] floor footprint (m; default [0.06, 0.06]); the column height is sized to hold n_spheres. friction_deg is the inter-particle friction angle; young_pa the contact modulus; density the grain density. Returns {job_id, status, cache_hit, oracle} (poll job_status / job_result); the job result carries the oracle band PLUS the measured {packing_fraction, in_band, n_settled, settled_height_m, mean_coordination, positions:[[x,y,z,r]]}. Absent YADE: {ok:false, reason, install, oracle}.

ParametersJSON Schema
NameRequiredDescriptionDefault
box_mNo
stepsNo
densityNo
radius_mNo
young_paNo
n_spheresNo
friction_degNo

TDQS

A4.3/5.0
Behavior5/5

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

The description discloses important behavioral traits beyond the sparse annotations: YADE is GPL-3.0 and runs only in a subprocess, the parent never imports it, the run happens off the MCP channel in a background job so it does not block the worker, and the absent-YADE behavior is specified. This goes well beyond what readOnlyHint/destructiveHint provide, and there is no contradiction.

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 prose is dense and well structured: purpose first, then licensing/execution constraints, then parameter meanings, then return shape. Some detail about the GPL Elmer/OpenFOAM arm's-length isolation could be trimmed, but nearly every sentence adds needed context for a complex asynchronous solver submission.

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 async submission with no output schema, the description covers the job result shape, the oracle band, the absent-YADE fallback, and most parameter semantics. It falls short only in leaving steps and radius_m to name/default inference and by carrying the box_m default inconsistency, which keeps it just shy of fully complete.

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?

With 0% schema description coverage, the description does add physical meaning for box_m, friction_deg, young_pa, density, and n_spheres. However, it omits explicit semantics for steps and radius_m, and it states box_m's default as [0.06, 0.06] while the schema default is null, creating a potentially confusing inconsistency. This is helpful but not fully 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?

The description opens with a concrete, specific operation: pour N monodisperse spheres into a box, settle under gravity with YADE, measure the random close-packing fraction, and gate it against granular_screen('packing'). This is an unambiguous verb+resource+scope statement that also distinguishes the tool from siblings like dem_flow_submit or granular_screen.

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 description clearly establishes the operational context: it is an asynchronous background submit that should be polled via job_status/job_result, and it is explicitly gated against granular_screen('packing'). It does not name when-not-to-use alternatives explicitly, but the context is sufficient for an agent to route a packing-fraction request correctly.

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

designation_checkDesignation CheckA
Read-only

Gate: every purchased part on this assembly must be orderable.

Flags BOM rows a buyer cannot act on — a purchased standard part with no canonical designation, or one whose designation is missing a fact needed to order it (no material grade). Run it before quoting or releasing a package: a BOM whose purchased lines are geometry names silently pushes the sourcing work onto a human, once per revision.

Purchased-ness is EXACT for AnkusDrive-generated parts (the object carries a stamp) and a documented name heuristic for everything else — so a hand-modelled "Bracket" is never flagged, while a hand-modelled "M6Screw" is. Pass rows instead of assembly to check BOM rows you already hold.

Returns {ok, findings, purchased, designated, undesignated, incomplete, basis}; each finding carries part / count / code (no_designation | incomplete_designation) / certainty (stamped | name_heuristic) / reason. ok=False means the BOM cannot be ordered as it stands.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsNo
assemblyNo
recursiveNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, which match the description's read-only nature. The description adds valuable behavioral detail beyond that: the exact/name-heuristic purchased-ness logic, the specific examples ('Bracket' vs 'M6Screw'), and the return structure. It does not contradict annotations.

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 information-dense and well-structured. It opens with the gate statement, then explains the flagging logic, the purchased-ness heuristic, and the return format—all in a logical order. Every sentence contributes meaning, with no filler. It's longer than typical but every part earns its place.

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?

Given there is no output schema, the description fully describes the return value: '{ok, findings, purchased, designated, undesignated, incomplete, basis}' and details each finding's fields and possible codes. It also explains the meaning of ok=False. For a 3-parameter tool with 0% schema description coverage, this is a complete description that leaves no critical gaps for an agent to invoke 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 description coverage is 0%, so the description must compensate. It explains the difference between rows and assembly ('Pass rows instead of assembly to check BOM rows you already hold') but does not explain the 'recursive' parameter or its default behavior. It provides partial parameter semantics but leaves a gap for one of the three parameters.

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 verb ('flags') and resource ('BOM rows'), and opens with the gate condition 'every purchased part on this assembly must be orderable.' It clearly distinguishes the tool's role as a pre-quote/pre-release check, separating it from related tools like catalog_check or substitutability_check without needing to name them 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?

Provides explicit when-to-use guidance: 'Run it before quoting or releasing a package.' Also gives input-selection guidance: 'Pass rows instead of assembly to check BOM rows you already hold.' However, it doesn't explicitly state when not to use it or name alternative tools, but the context is clear enough for an agent making a decision.

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

dfa_checkDFA CheckA
Read-only

Grade an assembly (Boothroyd-Dewhurst-lite). assembly_efficiency = theoretical_min/(part_count+fastener_count) (theoretical_min = unique_part_count or 1); assembly_score scales that by a handling penalty from insertion_axes/ symmetry and decreases monotonically as part/fastener count rises. The grade is an ordinal index for comparing variants (fidelity='correlation', band_pct=None) — rank with it, don't gate on the absolute value. Returns {part_count, fastener_count, insertion_axes, handling_difficulty, assembly_efficiency, assembly_score, symmetry_score, fidelity, band_pct}.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_countYes
fastener_countNo
insertion_axesNo
unique_part_countNo
symmetric_fractionNo

TDQS

A4.4/5.0
Behavior4/5

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

With annotations already marking the tool read-only, the description adds substantial behavioral context: the exact efficiency formula, the handling penalty from insertion_axes/symmetry, monotonic decrease with part/fastener count, and the fixed fidelity/band_pct output values. It does not contradict the annotations, though it omits edge cases like zero counts or invalid fractions.

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?

Two dense sentences pack the purpose, formula, caveat, and return structure without filler. The primary action is front-loaded, and every clause earns its place given the sparse schema.

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?

Despite no output schema or parameter descriptions, the description provides the formula, usage caveat, and the full set of returned fields. It is complete enough to call and interpret results for comparative DFA screening, but it lacks validation guidance and interpretation of handling_difficulty/symmetry_score levels.

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 carries the burden. It explains part_count and fastener_count through the denominator, unique_part_count through theoretical_min, and insertion_axes/symmetry through the handling penalty. However, symmetric_fraction is only implied as 'symmetry' and no bounds or validation semantics are given, so it stops short of full compensation.

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 opens with a specific verb and resource: 'Grade an assembly (Boothroyd-Dewhurst-lite).' It goes beyond a one-line summary by stating the scoring formula and the ordinal nature of the grade, which clearly separates it from sibling tools like dfm_check or cost_estimate.

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 directive: use the grade for comparing variants and explicitly warns not to gate on the absolute value ('rank with it, don't gate on the absolute value'). However, it does not name alternatives or explicitly state when not to use this tool versus another.

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

dfm_checkDFM CheckA
Read-only

Screen a part for manufacturability against a pull/tool axis. Give a hand-built faces list of {name, draft_deg, wall_mm?} — draft_deg relative to pull_axis (0 = a vertical wall needing draft; <0 = a re-entrant undercut) — OR a live handle, whose per-face descriptors are read off the solid (draft vs the pull axis + a ray-cast undercut test + inward-chord wall sampling) and scored identically (v2 Shape wiring). draft_violations are 0≤draft<min_draft_deg, undercut_faces are draft<0, min_wall_violations are wall_mm<min_wall_mm (defaults by process: injection 1.0, cnc 0.5, sheet/fdm 0.8).

Sheet metal: a handle built by sheet_base/sheet_flange/sheet_tab/sheet_hem is ALSO screened against the press-brake rules (minimum bend radius by material, minimum flange length, hole-to-bend distance, refold collision) with no extra argument — those rules are DELEGATED to the same implementation sheet_check calls, so the two tools cannot return different verdicts on one part. Pass an explicit sheet block {thickness_mm, material?, bends, holes?, interferences?} to screen bends on a part AnkusDrive did not model.

Returns {process, pull_axis, min_wall_mm, draft_violations, undercut_faces, min_wall_violations, score, pass} — plus n_faces + wall_thickness_stats on the handle path, and a sheet sub-result {ok, findings, rules, fidelity, band_pct} whose failures also gate pass on the sheet-metal path.

ParametersJSON Schema
NameRequiredDescriptionDefault
facesNo
sheetNo
handleNo
processNoinjection
pull_axisNo+z
min_wall_mmNo
min_draft_degNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only provide readOnlyHint and openWorldHint, so the description carries the full behavioral burden. It discloses violation definitions, process-dependent thresholds, handle-side measurement methods, delegation to sheet_check, and how sheet failures gate the final pass. There is no contradiction with the readOnlyHint; the tool screens and returns results without mutating anything.

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 long but dense and well-organized: general mechanics, sheet-metal specifics, then return shape. It front-loads the purpose and avoids filler. A little more restraint would improve readability, but almost every sentence carries necessary technical detail.

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 seven optional parameters, no output schema, and multiple input paths, the description is unusually complete. It documents the return fields, which sub-results appear on which path, how sheet-metal failures affect pass, and the relationship to sheet_check. An agent has enough information to invoke the tool correctly without guessing.

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?

Input schema has 0% description coverage, so the description must compensate, and it does extensively. It defines the faces list structure, the live handle semantics, the sheet block fields, process-dependent min_wall_mm defaults, and exact violation formulas. Minor details like accepted process strings and pull_axis format are left to defaults, but the core meaning of every parameter is effectively documented.

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 opens with a specific action and scope: 'Screen a part for manufacturability against a pull/tool axis.' It clearly defines the three input modes and distinguishes this tool from sheet_check by stating that the press-brake rules are delegated to the same implementation sheet_check calls. An agent can tell what dfm_check does and how it differs from related screening tools.

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 explains when to provide a faces list, when to provide a handle, and when to pass an explicit sheet block, including the sheet-metal special case. It explicitly names sheet_check and notes the two tools share the same implementation and cannot disagree. It does not fully contrast dfm_check with broader siblings like dfa_check or moldability_check, but within its stated domain the usage guidance is clear.

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

dipole_resonanceDipole ResonanceA
Read-only

Thin centre-fed half-wave dipole first resonance (NO solver, banded) — the closed-form twin the openEMS FDTD S11 antenna sweep (em_fullwave_submit) is gated against. Give EXACTLY ONE of length_mm (→ resonant frequency) or freq_ghz (→ resonant length). End-effect shortening k = shortening makes the resonant length a little under λ/2: L = k·λ, f_r = k·c/L (k≈0.48 textbook; ≈0.475 typical wire). Because k tracks the length/diameter ratio this is a ±band correlation (fidelity='banded', ~±3% over k∈[0.46,0.49]); an FDTD S11 sweep must put its first resonance inside [freq_lo, freq_hi] (or [length_lo, length_hi]).

Returns {given, shortening, half_wavelength_mm, resonant_length_mm, resonant_freq_ghz, freq_lo_ghz, freq_hi_ghz, length_lo_mm, length_hi_mm, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
freq_ghzNo
length_mmNo
shorteningNo

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, and the description does not contradict this. It adds substantial behavior beyond the annotations: it explains this is a closed-form correlation with 'fidelity='banded'', quantifies the ~±3% tolerance over the shortening range, describes end-effect shortening physically, and lists the full return payload including valid_range_ok, warnings, and escalate_to. This gives the agent a realistic model of the tool's analytic fidelity and limitations.

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 dense but every clause earns its place: the core distinction ('NO solver, banded') comes first, followed by the exact-input rule, then the model and formula, then the fidelity/band context, and finally the return contract. Despite being rich, it remains a single compact block with no filler or repetition.

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?

Given zero schema description coverage, no output schema, and a three-parameter tool with non-obvious physics, the description is remarkably complete. It covers input selection, parameter meaning, accuracy bounds, validity ranges, relationship to the sibling full-wave tool, and a full list of return fields. There is no critical information an agent would need to invoke or interpret this tool correctly that 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%, so the description carries full responsibility for explaining the parameters. It clearly explains the complementarity of `length_mm` and `freq_ghz`, precisely defines `shortening` as end-effect shortening k with typical values k≈0.48 and ≈0.475, and ties the meaning of parameters to the governing formula L = k·λ, f_r = k·c/L. 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?

The description states a precise calculation target — 'Thin centre-fed half-wave dipole first resonance' — with the key distinction 'NO solver, banded' and names the sibling `em_fullwave_submit` as the FDTD counterpart it is gated against. An agent can immediately tell exactly what this tool computes and how it differs from the full-wave solver.

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 an explicit invocation rule: 'Give EXACTLY ONE of length_mm or freq_ghz' and maps each input to its output direction. It also frames when this analytic estimate is appropriate versus when the FDTD S11 sweep (`em_fullwave_submit`) must be used, including the banding correlation and the requirement that the sweep resonance must fall inside the returned band.

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

draftDraftA

Apply a draft angle to faces (for moldability).

base: feature handle. faces: list of {handle, face: tag|'FaceN'}. angle_deg: draft angle (positive degrees). neutral_plane: {handle, face: tag|'FaceN'} for the plane along which the angle is measured (typically the parting plane). reversed: flip the direction of the draft.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseYes
nameNoDraft
facesYes
reversedNo
angle_degNo
neutral_planeNo

TDQS

A3.5/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, so the description doesn't need to restate safety. The description adds useful context about what the neutral_plane is and that reversed flips direction. However, it doesn't disclose what happens to existing geometry, whether the operation is parametric, or any failure modes. With annotations covering the basic safety profile, a 3 is appropriate.

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 compact and front-loaded with the purpose, then lists parameters in a scannable format. Each line earns its place, though the parameter list format is slightly terse and could benefit from a brief example or clarification of the face reference syntax.

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 feature-creation tool with 6 parameters and no output schema, the description covers the key parameters and their semantics. However, it lacks information about return values, error conditions, or how the draft feature integrates with the feature tree. The sibling list shows many similar feature tools, so more context about when this is appropriate would help.

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 carries the full burden of explaining parameters. It explains base, faces, angle_deg, neutral_plane, and reversed with meaningful detail, including the format for face references (tag|'FaceN') and the semantic role of neutral_plane. This goes well beyond the bare schema, though it doesn't explain the 'name' 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 clearly states the tool applies a draft angle to faces for moldability, which is a specific verb+resource. It distinguishes itself from siblings like moldability_check and sheet operations, though it doesn't explicitly name an alternative. The purpose is clear enough for an agent to understand what the tool does.

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 description implies usage context (for moldability) and explains the role of neutral_plane as typically the parting plane, which gives some guidance. However, it doesn't explicitly state when to use this tool versus alternatives like moldability_check or dfm_check, nor does it mention prerequisites like having a body/feature selected.

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

drawing_gateDrawing GateA
Read-only

Manufacturing-completeness gate for a drawing page: does the placed dimension set fully and non-redundantly reconstruct the part? A green render is not a manufacturable drawing — this validates the drawing itself, the way the geometry-realizes-declaration gate validates an assembly.

Reads the real solid + the placed dimensions and accounts degrees of freedom, process-aware: a 'prismatic' (milled/plate) part must locate each hole by X/Y from a datum and size the block W×H×T; a 'turned' part is concentric, so a step needs only Ø + axial length. process='auto' infers it from the geometry.

Returns {ok, violations, slots_total, slots_covered, process, features, dimensions, enumerated_features, datum_faces, section_recommended}. section_recommended ({recommended, reasons, feature_ids}) advises whether the part has internal geometry that needs a cross-section (see add_section_view). Each violation has a code (under = a feature size/location is missing; redundant = a DOF dimensioned more than once; conflict = dimensioned twice with disagreeing values; extra = a dim that pins nothing; no_datum = a location not taken from a datum) and a human reason. ok=True (empty violations) means the drawing is manufacturing-complete.

Datum-origin discipline turns on automatically when the part has faces annotated role='datum' (annotate_face): a location dimension not measured from a datum face is then flagged no_datum. Set datums_declared=True to force the check on even without annotated datums.

require_ballooned=True additionally demands that every characteristic carries an inspection balloon (see balloon_drawing) — the requirement a release flow imposes when the drawing must ship with an inspection plan. Unballooned characteristics become not_ballooned violations and fail the gate. The ballooned ({ok, total, ballooned, missing}) summary is reported either way.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageYes
processNoauto
datums_declaredNo
require_balloonedNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true, but the description goes far beyond this, detailing the return object, violation codes (under, redundant, conflict, extra, no_datum, not_ballooned), process-aware behavior, datum-origin discipline, and ballooning requirements. This is comprehensive behavioral disclosure that fully compensates for the minimal annotation.

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 long but meticulously organized: purpose first, then return-value explanation, violation codes, datum behavior, and ballooning. Every sentence adds substantive value, and the structure front-loads the core purpose before diving into details. No filler or repetition.

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?

Despite having no output schema, the description fully documents the return object and its fields, including section_recommended and ballooned summaries. It covers process-aware logic, datum handling, and ballooning, leaving no ambiguity about inputs, behaviors, or outputs. The complexity of the tool is matched by the completeness of its description.

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?

With 0% schema description coverage, the description carries the entire burden of explaining parameters. It explains 'process' (including 'auto' inference), 'datums_declared' (forces datum checking without annotated datums), and 'require_ballooned' (mandates inspection balloons). The required 'page' is self-explanatory, but all optional parameters are well-elaborated.

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 clearly states the tool's purpose: a manufacturing-completeness gate that validates whether the placed dimension set fully and non-redundantly reconstructs the part. It distinguishes itself from other gates (e.g., geometry-realizes-declaration) and from siblings like drawing_legibility, making the tool's role unambiguous.

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 description provides strong contextual guidance: it explains when the gate applies (after a green render, to validate the drawing itself), and references related tools (annotate_face, add_section_view, balloon_drawing) that affect behavior. However, it does not explicitly state when to prefer this over alternatives like drawing_legibility, relying on context rather than explicit contrasts.

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

drawing_legibilityDrawing LegibilityA
Read-only

Legibility gate for a drawing page: on the ACTUAL placed graphics, flag the ways the layout becomes unreadable — overlapping dimension labels, a dimension line crossing a view it does not reference, or anything past the sheet border.

min_gap (mm) is the breathing room required between two labels. Returns {ok, violations, labels, segments, views}; each violation has a code (overlap/crosses_view/out_of_border) and a human reason. ok=True means the placed dimensions read cleanly on the sheet. Inspection balloons count as placed graphics too — a numbered circle sitting on a neighbour or off the sheet is flagged like any other label.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageYes
min_gapNo

TDQS

A4.2/5.0
Behavior5/5

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

The annotations already mark the tool as read-only, so the description adds substantial behavioral value beyond them. It discloses the exact return envelope ({ok, violations, labels, segments, views}), the violation codes (overlap/crosses_view/out_of_border), the meaning of ok=True, the effect of min_gap, and that inspection balloons are also checked. This gives an agent a reliable model of behavior with no contradiction to the read-only annotation.

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 the core purpose and violation examples, then layers in parameter semantics, return-value semantics, and an edge case about inspection balloons. Every sentence contributes new information, and there is no filler, tautology, or repetition of the title or annotations.

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 no output schema, the description adequately explains the return structure, the meaning of ok, and how violations are reported with codes and reasons. It does not explain what labels, segments, and views contain, nor how to obtain the page handle, but those details are secondary to invoking the check and interpreting its pass/fail result. The description is sufficient for a typical call.

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 carries the burden of explaining parameters. It does explain min_gap well: 'breathing room required between two labels' in millimeters. However, it never defines the required page parameter beyond the general notion of a 'drawing page,' leaving its format, source, or relationship to other drawing tools undocumented. The partial compensation is useful but incomplete.

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 verb and resource: it 'flags' legibility problems on a drawing page's 'ACTUAL placed graphics.' It enumerates concrete violation classes — overlapping dimension labels, dimension lines crossing unreferenced views, and items past the sheet border — which makes the tool's purpose precise and distinguishable from generic drawing checks such as drawing_gate.

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 description implies when to use the tool: as a legibility gate after graphics are placed, checking whether placed dimensions and balloons read cleanly on the sheet. It does not explicitly state when not to use it, nor does it name an alternative for broader drawing validation, so the usage context is clear but the exclusion/alternative guidance is left implicit.

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

drop_impactDrop ImpactA
Read-only

Drop/impact screen by exact energy balance (NO solver). Give crush_distance_mm (available cushion/crumple stroke) -> deceleration, OR deceleration_limit_g (fragility spec) -> required stroke — exactly one. G_avg = h/d exactly (mass cancels); g_peak = pulse_factor·G_avg with pulse bounding the shape: 'constant' (ideal crush, 1×) | 'linear_spring' (elastic, 2×) | 'half_sine' (π/2×). v = √(2gh). mass_g only adds peak_force_n and energy_j. fidelity='exact'; where the part is stressed, or what an edge/corner strike changes, is escalate_to='impact_dynamics_submit'.

Returns {drop_height_mm, impact_velocity_m_s, pulse, pulse_factor, crush_distance_mm, g_avg, g_peak, pulse_duration_ms, deceleration_limit_g, required_crush_mm, energy_j, peak_force_n, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
pulseNolinear_spring
mass_gNo
drop_height_mmYes
crush_distance_mmNo
deceleration_limit_gNo

TDQS

A4.7/5.0
Behavior5/5

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

With readOnlyHint already in annotations, the description goes further by explaining the exact mathematical model (G_avg = h/d, g_peak = pulse_factor·G_avg, v = √(2gh)), the role of mass, and the 'NO solver' behavior. It also discloses that fidelity is 'exact' (within the energy-balance simplification) and that certain conditions trigger escalation, which is valuable behavioral context not present in annotations.

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 well-organized: purpose first, then parameter semantics, model formulas, and finally the return object. Every clause adds useful information, and the use of separators (semicolons, |) and inline notation keeps it scannable. It is longer than typical, but the complexity of the tool justifies the length.

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?

Given that there is no output schema and annotations only provide readOnlyHint, the description is remarkably complete. It explains the input constraints, the calculation method, the pulse options, the effect of mass, and lists every return field. The escalation path for more detailed analysis is also included. An agent has everything needed to invoke this 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 coverage is 0%, so the description carries the full burden. It explains crush_distance_mm as 'available cushion/crumple stroke', deceleration_limit_g as 'fragility spec', and explicitly states that exactly one must be provided. It defines the pulse parameter with its three enum-like options and their factors, and explains that mass_g only affects peak_force_n and energy_j. This is thorough and compensates fully for the lack of 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?

The description explicitly states the tool is a 'Drop/impact screen by exact energy balance (NO solver)' and immediately clarifies that it computes deceleration or required crush distance from input parameters. It distinguishes itself from the heavier simulation tool by naming 'escalate_to='impact_dynamics_submit'' for cases needing stress or edge/corner detail, making the purpose and scope unambiguous.

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 description gives clear context for when to use the tool (quick energy-balance screening for impact) and explicitly says to escalate to impact_dynamics_submit when the part is stressed or edge/corner effects matter. It doesn't compare against the sibling bar_impact, but the geometry-specific nature of that tool makes the distinction obvious enough.

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

eco_createECO CreateA
Destructive

Build an ECO change-order record (issue #142, C3) — turn a change into a record, not a silent mutation (the diff IS the change order, mapping onto a git commit/PR). Optionally compute its where-used impact over a lockfile in the same call, so the blast radius travels with the record.

id: the ECO id (e.g. "ECO-0001"). affected: the list of changed item / component ids. disposition: the change disposition (use_as_is | rework | scrap | revise | ...). effectivity: a dict with exactly one of date|serial|revision (when it takes effect). title / note: optional human description recorded on the record. interface_change: true if a published interface moved (the §9 stale trigger). lockfile: optional path — when given, the result embeds an impact report. out: optional path — write the git-diffable ECO sidecar there.

Returns the ECO object (with impact when a lockfile is supplied); a malformed ECO fails loudly.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
outNo
noteNo
titleNo
affectedYes
lockfileNo
dispositionYes
effectivityYes
interface_changeNo

TDQS

A4.5/5.0
Behavior5/5

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

The description goes well beyond the destructiveHint annotation by explaining the record-building semantics, the diff-as-change-order mapping, the optional sidecar write, the embedded impact report, and the failure behavior ('a malformed ECO fails loudly'). It also clarifies effectivity constraints and the interface_change trigger, giving rich behavioral context.

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 well-structured: a clear opening sentence states the core purpose, optional capabilities follow, then a parameter list, and finally the return/failure behavior. Every sentence earns its place; the parameter section is visually scannable and front-loads the primary verbs and semantics.

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 tool with 9 parameters, no output schema, and no parameter descriptions, the description is remarkably complete: it covers all parameters, returns, side effects, and error behavior. It could have further clarified preconditions (e.g., validating with eco_validate) or the detailed shape of the impact report, but these are minor gaps given the strong schema compensation.

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 compensates fully by explaining every parameter: id with an example, affected as a list, disposition enumerating common values, effectivity requiring exactly one of date|serial|revision, title/note as optional, interface_change semantics, lockfile behavior, and out path purpose. This is exactly the compensation needed for a schema with no descriptions.

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 the specific action: 'Build an ECO change-order record' and emphasizes 'not a silent mutation (the diff IS the change order)' which distinguishes it from direct mutation tools. It does not explicitly name sibling tools like eco_validate or change_impact, so sibling differentiation is implied rather than explicit.

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 description provides clear usage context: use this to create a durable ECO record instead of a silent mutation, and optionally use lockfile to embed an impact report or out to write a git-diffable sidecar. It does not explicitly state when not to use it or mention alternatives such as eco_validate, but the optional-parameter guidance is clear.

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

eco_validateECO ValidateA
Read-only

Validate an ECO (engineering change order) record (issue #142, C3) — the cheap front door. Checks the schema stamp, a non-empty id + affected item set, a present disposition, and an effectivity carrying exactly one of date|serial|revision.

eco: the ECO object.

Returns {ok, problems} — ok is True iff problems is empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
ecoYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already mark readOnlyHint=true and openWorldHint=false, and the description adds details about the validation rules and the return format ({ok, problems}). It clarifies the non-mutating nature and the success criteria, which is consistent with the annotations.

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 description is fairly compact and front-loads the main purpose, but it includes extraneous references like 'issue #142, C3' and the 'cheap front door' metaphor that do not help an agent invoke the tool. These add noise without adding actionable value.

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 single-parameter read-only validation tool, the description provides the return format and specific validation criteria, which is sufficient for an agent to understand the tool's behavior. It does not cover edge cases like error handling, but the annotations and simple signature make this gap minor.

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 has one object parameter with no field descriptions (0% coverage), and the description only says 'eco: the ECO object.' The validation rules hint at required subfields (id, affected items, disposition, effectivity) but do not explicitly document their structure. This does not sufficiently compensate for the missing schema documentation.

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 verb and resource: 'Validate an ECO record', and enumerates the exact checks performed (schema stamp, id + affected item set, disposition, effectivity). This clearly distinguishes it from other *_validate sibling tools that target different entities.

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 phrase 'the cheap front door' implies this is a lightweight preliminary check, but the description does not explicitly state when to use it versus alternatives, nor what conditions would make a more thorough validation necessary. There is context but no clear when-not-to-use guidance.

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

elastica_deflectionElastica DeflectionA
Read-only

Exact large-deflection cantilever tip — Bisshopp–Drucker elastica (NO solver) — the closed-form twin the *NLGEOM CalculiX solve is gated against. Section: width_mm+height_mm (solid rectangle, I = b·h³/12, load transverse to height_mm) or explicit i_mm4. E from youngs_gpa or a Materials-DB material. Load parameter α = P·L²/(E·I); the tip slope solves the elliptic-integral elastica. Linear theory δ/L = α/3 over-predicts the transverse tip and ignores the axial draw-in — the elastica captures both, and nonlinear_over_linear is the divergence the solve must reproduce. Valid for tip slope < ~80° (α ≲ 3.5); beyond that escalate to a follower-load fem_set_nonlinear_material solve.

Returns {alpha, tip_slope_deg, tip_disp_mm (transverse), tip_x_mm (axial projection), axial_drawin_mm, linear_tip_mm, nonlinear_over_linear, youngs_mpa, I_mm4, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
i_mm4No
load_nYes
materialNo
width_mmNo
height_mmNo
length_mmYes
youngs_gpaNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses that this is a closed-form no-solver calculation, names the governing theory, states the linear-theory comparison, and warns about applicability limits. It also enumerates the full return payload, so an agent knows exactly what behavior and outputs to expect. No contradiction with annotations.

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 key fact, followed by formulas, validity, and return fields. It contains no filler or repeated schema information; the only reason not to give full marks is the length and technical density, though every sentence earns its place.

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 7-parameter engineering calculator with no output schema and no parameter descriptions, the text supplies the mathematical model, parameter-combination rules, valid range, and output fields. Minor gaps remain around conflicting section/E inputs and the meaning of fidelity or band_pct, but the agent has enough to call it 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?

The schema has 0% description coverage, and this description fully compensates: it explains section choices via width_mm and height_mm or explicit i_mm4, E from youngs_gpa or material, and defines α = P·L²/(E·I), connecting load_n, length_mm, E, and I. It even notes that load is transverse to height_mm, adding physical meaning absent from the schema.

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 names the exact resource and operation: 'Exact large-deflection cantilever tip — Bisshopp–Drucker elastica' with the explicit 'NO solver' distinction. It also differentiates itself from solver-based FEM siblings by describing itself as the closed-form twin the NLGEOM CalculiX solve is gated against.

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 an explicit validity envelope ('tip slope < ~80° (α ≲ 3.5)') and an explicit escalation path: 'beyond that escalate to a follower-load fem_set_nonlinear_material solve.' It also frames the analytical result as a benchmark, telling an agent when to use this versus a nonlinear FEM solve.

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

em_conduction_submitEM Conduction SubmitA

DC current conduction via Elmer's StatCurrentSolver (P3 M6 frontier), asynchronous. Requires ElmerSolver; when absent this returns {ok:false, reason, install} rather than raising. Builds a rectangular strip with voltage_v across its ends and reads the electrode current, total Joule heating and Elmer's effective resistance — all machine-exact against R = L/(σ·A) (resistance_ratio = 1.000000 live).

Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for {ok, current_a, joule_w, effective_resistance_ohm, resistance_exact_ohm, current_exact_a, resistance_ratio, case_dir}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nxNo
nyNo
width_mNo
length_mNo
conductorNocopper
voltage_vNo
conductivity_s_mNo

TDQS

A4.3/5.0
Behavior5/5

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

With only weak annotations (readOnlyHint: false, destructiveHint: false), the description carries the full burden of behavioral disclosure and does so richly. It explains the async job contract, the missing-solver fallback shape, the cache_hit possibility, and the exact result fields to expect after polling.

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 mostly front-loaded, with the core operation stated first, followed by the async and error behavior. The cryptic 'P3 M6 frontier' phrase adds little signal and the return-field listing is long, but nearly every sentence earns its place.

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?

Since there is no output schema, the description correctly enumerates the polled result fields and the submit response shape. It also covers the missing-solver behavior and the analytic validation expectation. However, `nx`/`ny` semantics are absent and the 'degradation dict' phrase is undefined, so it is not fully self-contained for a 7-parameter 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 for all 7 parameters. It explicitly ties `voltage_v` to the applied voltage and hints at `length_m`, `conductivity_s_m`, and `width_m` through the R = L/(σ·A) formula, but it never explains `nx`, `ny`, or `conductor`. This partial compensation is helpful but leaves real gaps.

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 operation: DC current conduction via Elmer's StatCurrentSolver, building a rectangular strip and computing current, Joule heating, and resistance. It clearly distinguishes itself from related sibling tools like em_dc_resistance, em_field, and em_induction_submit by emphasizing the asynchronous submission and Elmer solver backend.

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 description gives clear usage context: it is asynchronous, requires ElmerSolver, returns a non-raising error payload when absent, and directs the agent to poll job_result for the final values. It does not explicitly compare against alternatives or state when not to use it, so it misses the 'when-not/alternatives' bar for a 5.

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

em_dc_resistanceEM DC ResistanceA
Read-only

Exact DC resistance of a uniform conductor (NO solver) — R = L/(σ·A), the closed-form anchor the Elmer em_conduction_submit gate reproduces to machine precision. With voltage_v the Ohm/Joule pair is included (I = V/R, P = V·I). σ from conductivity_s_m or a conductor name.

Returns {resistance_ohm, conductivity_s_m, length_m, area_m2, current_a?, joule_w?}.

ParametersJSON Schema
NameRequiredDescriptionDefault
area_mm2Yes
conductorNo
length_mmYes
voltage_vNo
conductivity_s_mNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=truecars, and the description adds meaningful behavioral context: the computation is exact, uses a closed-form formula, and optionally includes current and Joule heating when voltage_v is supplied. It also explains how conductivity is sourced. No contradiction with annotations.

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 compact, front-loaded with the core formula and scope, and every sentence adds value: no-solver emphasis, formula, optional voltage behavior, conductivity source, and return shape. There is no wasted text.

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 simple analytic calculator, the description is largely complete: it gives the formula, the source of conductivity, optional voltage behavior, and the return object. Minor gaps remain, such as explicit unit-conversion rules and what happens if neither conductivity_s_m nor conductor is supplied, but these are not severely misleading.

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 conductivity_s_m, conductor, and voltage_v semantics, and the return list implies unit conversion from mm to m. However, the required length_mm and area_mm2 are not explicitly described, and precedence between conductivity_s_m and conductor is left ambiguous.

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 precise verb and resource: 'Exact DC resistance of a uniform conductor' and gives the governing formula R = L/(σ·A). It also differentiates from sibling em_conduction_submit by explicitly calling this the 'closed-form anchor' that the solver gate reproduces, so an agent can distinguish it immediately.

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 'NO solver' qualifier and the reference to em_conduction_submit clearly signal this is the analytic, non-solver path for uniform conductors. It implies when to use it versus the numerical solver, though it does not explicitly state exclusions such as 'use em_conduction_submit for non-uniform geometry'.

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

em_fieldEM FieldA
Read-only

Exact magnetostatic field of the two canonical sources (NO solver): kind='wire' is the long straight wire B = μ₀·I/(2π·r) at distance_mm (Ampère's law); kind='solenoid' is the long-solenoid interior B = μ₀·μ_r·n·I with turns_per_m.

Returns {b_t, b_mt, …} (the field in tesla and millitesla).

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNowire
mu_rNo
current_aNo
distance_mmNo
turns_per_mNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, so the main behavioral disclosure is whether this is analytic or numerical. The description explicitly says 'NO solver' and 'Exact magnetostatic field', adding the key deterministic and non-iterative behavior. It also discloses the return units and structure with {b_t, b_mt, …}. Minor gaps remain for null-input handling, but the annotations lower the burden here.

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 compact and front-loaded: it opens with the tool's exact purpose and non-solver nature, then gives formulas and the return signature. Every sentence carries useful information and there is no filler or redundant repetition of schema defaults.

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 description is essentially complete for a simple read-only analytic field calculator: it covers both supported kinds, maps parameters to formulas, gives units, and states the output format. It stops short of explicitly saying which parameters are ignored for each kind or what happens when required inputs are null, but those are minor given the formula-level guidance.

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%, so the description must add meaning to parameters. It successfully does: kind is explained as wire or solenoid, distance_mm appears in the wire formula, turns_per_m in the solenoid formula, and mu_r and current_a are directly used in the physical expressions. Every parameter has a clear physical role.

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 clearly states that this tool computes an exact magnetostatic field for two canonical sources, wire and solenoid, and prefaces with 'NO solver' to distance it from numerical simulation tools. It gives a specific verb and resource and readily distinguishes itself from solver-type 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?

The description clearly defines the two supported cases, showing when to use the wire formula with distance_mm versus the solenoid formula with turns_per_m. The 'NO solver' note gives a strong selection cue against numerical solver alternatives, though it does not explicitly name sibling tools or list exclusions.

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

em_fullwave_submitEM Fullwave SubmitA

Full-wave FDTD EM solve on openEMS, asynchronous (OFF the MCP channel) — the real-field twin of the analytic waveguide_cutoff / dipole_resonance oracles. openEMS is GPL-3.0 and is run ONLY out-of-process via ankusdrive/em_fullwave_gpl_runner.py; degrades to {ok:false, reason, install} when no openEMS venv resolves.

problem='waveguide_sweep' (default): hollow rectangular guide, broad wall a_mm/narrow wall b_mm (default a/2), length length_mm (default 120), TE10 port at each end. Sweep f_start_ghz..f_stop_ghz (default 4..10 GHz — straddling the WR-90 cutoff 6.56 GHz) in n_freq points, nrts max timesteps, cells_per_wl mesh density, eps_r fill, end_criteria energy stop (1e-6). THE GATE IS alpha_ratio≈1: voltage probes along the guide read the SOLVED field's decay rate below cutoff at decay_f_ratio·f_c (default 0.7) against the exact α = sqrt((π/a)² − k²); it degrades under a coarse mesh or a truncated nrts. alpha_ratio is null with a decay_note when the guide is too short for the probe window. fc_ratio (half-power crossing vs c/2a) is only a PORT-SETUP CHECK: openEMS's analytic port β zeroes every sub-cutoff sample, so it reads the frequency grid, not the field. A degenerate mesh/length (port blocks overlapping) returns {ok:false, error}. problem='dipole_s11': centre-fed thin dipole (length_mm, gap_mm, radius_mm, each resolved by its own mesh lines), sweep S11, report first resonance. Mesh is mesh_res_mm, else λ(mesh_f_ghz, default f_stop) / cells_per_wl (default 30) — pin it to vary the sweep window alone.

Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result for {ok, fc_analytic_ghz, freq_ghz[], s21_db[], transmission_norm[], alpha_fdtd, alpha_exact, alpha_ratio, decay_freq_ghz, decay_probe_z_mm[], decay_fit_rms_np, fc_crossing_ghz, fc_ratio, evanescent_mean, propagating_mean, mesh_res_mm, n_cells, wall_s} (waveguide) or {freq_ghz[], s11_db[], resonance_ghz, resonance_s11_db, mesh_res_mm, n_cells} (dipole).

ParametersJSON Schema
NameRequiredDescriptionDefault
a_mmNo
b_mmNo
nrtsNo
eps_rNo
gap_mmNo
n_freqNo
problemNowaveguide_sweep
timeoutNo
length_mmNo
radius_mmNo
f_stop_ghzNo
mesh_f_ghzNo
f_start_ghzNo
mesh_res_mmNo
cells_per_wlNo
end_criteriaNo
decay_f_ratioNo

TDQS

A4.7/5.0
Behavior5/5

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

The description goes far beyond the sparse annotations (readOnlyHint=false, destructiveHint=false). It discloses out-of-process execution via ankusdrive/em_fullwave_gpl_runner.py, the GPL-3.0 constraint, async submission returning {job_id, status, cache_hit}, polling via job_result, degradation when no venv resolves, and detailed physical caveats like the alpha_ratio gate and the fc_ratio port-setup check. No contradiction with annotations.

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 long but every sentence carries operational content: licensing, execution path, per-mode parameter semantics, physical interpretation, and return contract. It is front-loaded with the core purpose and organized by problem type. Some verbosity is justified because no output schema or parameter descriptions exist elsewhere.

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?

Given zero schema descriptions and no output schema, the description is remarkably complete. It covers both problem modes, all parameter defaults and meanings, failure/degradation behavior, async polling flow, and the exact return keys for both waveguide and dipole solves. The only minor omission is explicit timeout semantics, but that field is self-explanatory.

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?

With schema description coverage at 0%, the description carries the full parameter-documentation burden and succeeds. It explains broad/narrow wall defaults, TE10 port setup, sweep defaults, mesh density, energy stop, the alpha_ratio gate, dipole-specific parameters, and even clarifies that mesh_f_ghz 'pins' the sweep window. All 17 parameters are meaningfully addressed.

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 opens with a specific verb+resource: 'Full-wave FDTD EM solve on openEMS', and immediately distinguishes itself as 'the real-field twin of the analytic waveguide_cutoff / dipole_resonance oracles.' This makes the tool's purpose and identity unmistakable relative to sibling tools.

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 names the analytic siblings and positions this as the full-wave counterpart, which implies when to prefer it over those oracles. It also specifies the async off-channel pattern and the degradation path when openEMS is unavailable. However, it does not give an explicit 'use X instead when you need a quick analytic estimate' rule, so it stops just short of full guidance.

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

em_induction_heating_submitEM Induction Heating SubmitA
Destructive

Coupled induction heating via Elmer (SIMULATION_NEXT B5), asynchronous — completes em_induction_submit into a THERMAL answer: the harmonic MagnetoDynamics solve runs once, MagnetoDynamicsCalcFields turns it into the time-averaged Joule loss field, and a transient adiabatic HeatSolver integrates it for heat_duration_s. Requires ElmerSolver; when absent this returns {ok:false, reason, install} rather than raising.

Two gates: joule_power_ratio — the solved eddy-current power vs the exact deep-slab dissipation P″ = R_s·|H₀|²/2 = ω²σA₀²δ/4 (from the shipped em_skin_depth chain; live 1.0003) — and energy_balance_ratio — the mean temperature rise vs P·t/(m·cₚ) (live 1.005). Conductor σ from a name or explicit conductivity_s_m; thermal ρ/cₚ/k explicit. Also accepts a prepared case_dir.

Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for {ok, eddy_power_w_m, p_total_exact_w_m, joule_power_ratio (≈1), t_mean_final_k, dt_mean_exact_k, energy_balance_ratio (≈1), skin_depth_m, case_dir}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nxNo
nyNo
sifNocase.sif
mu_rNo
depthsNo
n_stepsNo
case_dirNo
cp_j_kgkNo
a_surfaceNo
conductorNocopper
k_thermalNo
frequency_hzNo
density_kg_m3No
heat_duration_sNo
conductivity_s_mNo

TDQS

A4.3/5.0
Behavior5/5

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

Annotations mark this as destructive and not read-only, but the description adds much-needed behavioral detail: it is asynchronous, returns ok:false instead of raising when ElmerSolver is absent, validates results using two named ratio gates, and returns a job handle. This goes well beyond the structured annotations and helps an agent anticipate side effects and failure modes.

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 technical, but it is front-loaded with the core purpose and structured logically: workflow, prerequisites, validation gates, parameters, and return shape. Some formula detail is arguably more than necessary, but it supports the stated validation behavior. Overall it earns its length without being bloated.

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?

Given no output schema, the description compensates well by enumerating the returned fields and polling mechanism. It also covers failure mode and prerequisite. The main gap is ambiguity around the two return shapes ('degradation dict' vs job_id payload) and incomplete parameter coverage, but the overall context is strong for a complex async simulation 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 for 15 undocumented parameters. It explains several key ones: heat_duration_s, conductor, conductivity_s_m, thermal properties (cp, k, density), and case_dir. However, it leaves nx, ny, sif, mu_r, depths, n_steps, a_surface, and frequency_hz unexplained, which is a meaningful gap given zero schema documentation.

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 verb ('couples induction heating via Elmer') and resource target ('completes em_induction_submit into a THERMAL answer'). It clearly differentiates from sibling tools like em_induction_submit and em_skin_depth by describing the multi-step thermal workflow. This is unambiguous and actionable for an agent.

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 description explicitly explains when this tool is relevant (as the thermal follow-up to em_induction_submit), its asynchronous nature, the requirement for ElmerSolver, and the recommended polling pattern via job_result. It does not list explicit exclusions or alternatives beyond the parent induction tool, but the context is clear enough for correct selection.

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

em_induction_submitEM Induction SubmitA

AC skin effect / induction via Elmer's harmonic 2-D magnetodynamics (P3 M6 frontier), asynchronous. Requires ElmerSolver; when absent this returns {ok:false, reason, install} rather than raising. Builds a conductor slab depths skin depths deep driven by the surface vector potential at frequency_hz, solves the complex field, and fits the e-folding length of BOTH the magnitude and the phase of A(x) — each must equal the exact δ = √(2/(ω·μ₀·μ_r·σ)) (live: decay_ratio 0.999, phase_ratio 1.000). The Joule deposition profile |J|² ∝ e^(−2x/δ) is the induction-heating answer.

Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for {ok, skin_depth_exact_m, decay_length_m, phase_length_m, decay_ratio, phase_ratio, case_dir}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nxNo
nyNo
mu_rNo
depthsNo
conductorNocopper
frequency_hzNo
conductivity_s_mNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already indicate it is not read-only, not open-world, and not destructive. The description adds valuable behavioral context: async execution, dependency on ElmerSolver, the fallback return on missing solver, and the need to poll job_result. It explains the exact return shape, going beyond the annotations without contradicting them.

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 efficient, packing physics, dependency, return format, and expected output into a single paragraph. It front-loads the core function and then details technical specifics. While long, it avoids redundancy and each sentence adds value.

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 simulation tool with 7 parameters and no output schema, the description provides substantial context: the physical model, the exact expected results, the asynchronous workflow, and the return structure. It does not explain all parameter meanings, but the missing details are minor given the defaults and the physics narrative.

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 directly names 'depths' and 'frequency_hz' in the physics description and mentions μ_r and σ implicitly through the formula. However, parameters like nx, ny, conductor, conductivity_s_m are not explained beyond their names/defaults, leaving ambiguity for an agent.

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 clearly states the tool's purpose: 'AC skin effect / induction via Elmer's harmonic 2-D magnetodynamics' and mentions it is asynchronous. It specifies the physics being modeled, and the return includes skin-depth verification, distinguishing it from sibling EM tools through its focus on induction and skin effect.

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 description notes a prerequisite ('Requires ElmerSolver; when absent this returns {ok:false, reason, install}') but does not explicitly contrast with sibling tools like em_induction_heating_submit, em_skin_depth, or em_conduction_submit. Usage context is implied by the physics description, but no direct alternatives or exclusions are given.

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

em_skin_depthEM Skin DepthA
Read-only

Exact AC skin depth (NO solver) — δ = √(2/(ω·μ₀·μ_r·σ)) plus the per-square surface resistance R_s = 1/(σ·δ); fields/current decay e^(−x/δ) into the conductor (~95% of induction heating deposits within 1.5·δ). σ from an explicit conductivity_s_m or a conductor name (copper, aluminum, silver, gold, brass, steel-mild, stainless-304).

Returns {skin_depth_m, skin_depth_mm, surface_resistance_ohm, angular_frequency_rad_s, conductivity_s_m, mu_r}.

ParametersJSON Schema
NameRequiredDescriptionDefault
mu_rNo
conductorNo
frequency_hzYes
conductivity_s_mNo

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description discloses the governing formula, field decay behavior, the ~95% heating depth heuristic, and the exact return keys. It also transparently indicates the closed-form nature of the calculation. No contradictions with annotations.

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 formula and 'NO solver' are front-loaded, immediately conveying what the tool does. The return list is necessary because there is no output schema, and the conductor-name list is useful. No filler sentences.

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 description covers the analytical formula, conductivity inputs, and all returned values, which matters because there is no output schema. However, it leaves minor ambiguity about the behavior when both conductivity_s_m and conductor are supplied or when neither is supplied, and it does not state explicit validity limits.

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?

With 0% schema description coverage, the description explains conductivity sourcing (explicit conductivity_s_m or named conductor with examples) and the role of mu_r through the formula. It does not explicitly state precedence when both conductivity_s_m and conductor are provided, nor frequency units beyond the parameter name/title.

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 clearly states it computes exact AC skin depth with an explicit formula, and differentiates itself from solver-based sibling tools with '(NO solver)'. The list of returned values confirms the operation. This goes well beyond a restatement of the title.

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 description implies analytical use by saying 'NO solver' and by showing how to specify conductivity via explicit value or conductor name, but it never explicitly names alternative tools or states when not to use this one. Usage context is implied rather than explicit.

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

engrave_textEngrave TextA

Engrave (cut) or emboss (add) extruded text onto a planar face of a solid.

The text is rendered in a system TrueType font, extruded, laid flat on the chosen face centred on its centroid, then booleaned into the host solid.

handle: the host solid to mark. face: the planar face to put the text on — a stable f_* tag (preferred), a 'FaceN' index string, or an int. Must be a flat (planar) face. Get a tag from list_faces / query_faces. text: the string to render (non-empty). size: cap height of the text in mm (default 5.0). depth: extrusion/engraving depth in mm (default 0.5). Engrave recesses the text this far below the surface; emboss raises it this far above. mode: 'engrave' (default) cuts the text into the solid (removes material); 'emboss' fuses raised text onto the surface (adds material). position: optional [u, v] in-face offset in mm from the face centroid, along the text's local X (u) and Y (v) axes. Omit to centre on the face. font: optional absolute path to a .ttf/.ttc font file. If omitted, common macOS fonts are auto-probed (Arial, then Helvetica). If none is found and none is supplied, the call raises RuntimeError — pass an explicit path. name: label for the resulting solid (default 'Text').

Returns {handle, name, volume, text, mode, depth} where volume is the mm^3 of the resulting solid (less than the input for engrave, more for emboss). The host solid is consumed/hidden and replaced by the returned handle.

ParametersJSON Schema
NameRequiredDescriptionDefault
faceYes
fontNo
modeNoengrave
nameNoText
sizeNo
textYes
depthNo
handleYes
positionNo

TDQS

A4.8/5.0
Behavior5/5

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

Discloses that the host solid is 'consumed/hidden and replaced by the returned handle', a mutation that matters to callers. Also documents the RuntimeError when no font is found, the macOS auto-probe fallback order, and that volume is less for engrave and greater for emboss. readOnlyHint=false already signals mutation, so this is additive context, not a contradiction.

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?

Front-loads the core purpose, then a single process sentence, then a tight parameter-by-parameter breakdown, then the return contract. Each parameter line carries distinct semantic weight with no filler; at roughly 250 words for a nine-parameter tool it is dense but appropriately sized.

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?

Complete for a high-complexity tool: 9 params, 0% schema coverage, no enums, and no output schema — yet the description supplies the return shape, volume semantics, error conditions, preconditions, units, and defaults. Nothing an agent needs to invoke it correctly 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%, but the description documents all nine parameters with units (mm), defaults, allowed values, constraints (non-empty text, planar face), and failure modes. It even clarifies ambiguous schema types like position ([u, v] offset from centroid) and nullable font (auto-probe behavior). Fully compensates for the bare schema.

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-plus-resource statement — 'Engrave (cut) or emboss (add) extruded text onto a planar face of a solid' — and clarifies the text is booleaned into the host. This distinguishes it from every sibling in the list, none of which perform face text marking. Goes well beyond the title by naming both modes and the geometric target.

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 concrete preconditions: the face must be planar and passed as a stable f_* tag from list_faces/query_faces, explicitly naming sibling tools that feed it. Explains when to choose mode='engrave' versus 'emboss' in terms of material removal versus addition. It does not name explicit alternative tools or when-not-to-use conditions, though no close sibling for text marking exists.

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

envelope_checkEnvelope CheckA
Read-only

Keep-out gate: assert each named part's world bounding box stays inside its declared envelope. envelopes maps a part's link name (or label) to {"min": [x,y,z], "max": [x,y,z]} in the assembly frame. Returns violations [{part, axis, got, allowed}, ...]; empty means everything is within its box.

ParametersJSON Schema
NameRequiredDescriptionDefault
assemblyYes
envelopesYes

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description states the coordinate frame (assembly frame), defines the envelope mapping format, and specifies the exact return shape including the empty-list success convention. It adds substantial behavioral context and does not contradict the annotations.

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?

Three tight sentences: purpose, envelope schema, and return semantics. There is no filler or repeated annotation info; every sentence adds necessary operational detail.

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 validation tool with no output schema, the description covers inputs, coordinate semantics, output structure, and success/failure convention. It stops short of edge cases such as missing envelopes or invalid assembly references, but nothing essential to a basic correct call is missing.

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%, and the description takes on the burden by fully specifying 'envelopes' as a map of link name/label to min/max coordinates. 'assembly' is only indirectly described as the assembly frame, not as an identifier/path, so one of the two required parameters remains under-specified.

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 'Keep-out gate' and a specific verb ('assert') plus the exact resource: each named part's world bounding box vs declared envelope. This clearly differentiates it from sibling validation tools like interference_check or check_shape.

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 'Keep-out gate' label and assembly-frame context make the usage scenario clear, and the pass/fail return format reinforces that it is a pre-flight validation check. It does not name alternatives or exclusion conditions, but the context is enough to distinguish envelope compliance from interference/shape checks.

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

export_drawingExport DrawingA
Destructive

Export a drawing page to PDF, SVG, or DXF (format inferred from the path extension), headless. PDF/SVG are composed from the template, the per-view geometry, and any dimensions/annotations on the page; DXF uses FreeCAD's native page writer. Returns {path, size, format, views, dimensions}.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageYes
pathYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds meaningful behavior beyond that: headless execution, the different composition paths for PDF/SVG versus DXF, and the exact return object fields. It does not explicitly mention overwrite semantics, but with annotations covering the destructive nature, the added transparency is strong.

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?

Two dense sentences with no filler. The first sentence front-loads the core operation, format options, and headless behavior; the second explains the two rendering pathways and the return value. Every sentence earns its place.

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 synchronous export tool with no output schema, the description is quite complete: it covers format inference, composition behavior, and the return shape. It could add explicit warnings about file overwrites or page identification details, but given the annotations and the compact scope, nothing critical is missing for an agent to call it 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?

With 0% schema description coverage, the description must carry parameter meaning, and it partially does: 'page' is the drawing page to export and 'path' is the target whose extension selects the format. However, 'page' remains vague as an identifier/name, and path details such as overwrite behavior or path requirements are unspecified. It compensates for the schema silence but not fully.

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 operation ('Export a drawing page') and enumerates the target formats PDF, SVG, or DXF, with format inferred from the path extension. This clearly distinguishes it from shape-focused siblings like export_shape and sheet-focused siblings like sheet_flat_export. The verb+resource+scope are all present and unambiguous.

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 description makes it clear this is for exporting a drawing page headlessly, with format selection driven by the file extension. It does not explicitly name alternative tools or exclusion conditions, but the context is strong enough for an agent to recognize when this tool applies versus other export/render tools.

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

export_shapeExport ShapeA
Destructive

Export a shape to STEP/IGES/BREP/STL. Format inferred from path extension.

object: FreeCAD object name (NOT a AnkusDrive handle). If omitted, exports the document's single final shape: inputs consumed by another feature (a cut's base/tool, Body features) are skipped, and solids win over sketches. If more than one final shape remains, it raises and lists them. It never picks one for you.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
objectNo

TDQS

A4/5.0
Behavior4/5

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

The description goes beyond annotations by detailing the auto-selection behavior when object is omitted: it skips inputs consumed by other features, prefers solids over sketches, and raises an error if ambiguity remains. It also clarifies that the tool never picks one for you. This is valuable behavioral context that annotations (only destructiveHint true) do not convey. It does not contradict the destructive hint, as exporting to disk could overwrite files.

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 efficiently structured: the main purpose is front-loaded, and the object parameter details are organized in a clear block. Every sentence earns its place, explaining format inference and selection rules without fluff. It is slightly longer than strictly necessary but remains concise and readable.

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 tool with only two parameters and no output schema, the description covers the essential aspects: formats, how format is determined, object selection logic, and error handling. It does not explicitly state prerequisites like an active document being open, but that context is likely implied by the document reference. Overall, it is complete enough for correct invocation.

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?

With 0% schema description coverage, the description must compensate fully. It explains the path parameter's format inference and the object parameter's meaning (FreeCAD object name, NOT a handle), optionality, selection algorithm, and error behavior. This adds substantial semantics beyond the bare schema field names and types, making the parameters understandable and usable.

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 the tool exports a shape to specific formats (STEP/IGES/BREP/STL) and infers format from the path extension. This gives a clear verb+resource+target. It doesn't explicitly contrast with sibling export tools like export_drawing or sheet_flat_export, but the purpose is unambiguous from the description and name.

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 description provides usage guidance for the object parameter (optional, selection rules, error behavior) and path extension format inference, but it does not explicitly tell the agent when to choose this tool over alternative export tools. There is no mention of alternatives or conditions that would route to a different export function, so the when-to-use guidance is incomplete.

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

fai_reportFAI ReportA
Destructive

First-article inspection report for a drawing page, shaped like AS9102 Rev B Form 3.

Each ballooned characteristic becomes a row carrying the AS9102 fields (Char No. / Reference Location / Characteristic Designator / Requirement / Results / Designed-Qualified Tooling / Nonconformance Number / Notes) plus its limits, the suggested measurement method, and a computed status.

results: balloon number -> measured value; each row is then accepted or rejected against its limits. For a position control you may pass {"x":.., "y":..} and the diametral deviation 2·√(x²+y²) is used, matching gdt_check. Omit it entirely to get a BLANK form for the inspector — every row comes back 'not_evaluated', never a silent pass. path: optionally write the report — .csv (the data), .svg or .pdf (a printable paginated table). part / rev: identity stamped into the file; default to the page's part name and title-block revision. reference: AS9102 field 6 (Reference Location), e.g. the sheet/zone; defaults to the view each characteristic is dimensioned on.

THIS IS NOT A CERTIFIED AS9102 SUBMISSION — it reproduces the Form 3 field layout so a real form can be filled from it, and says so on every artifact it writes.

Returns {ok, columns, rows, summary, disclaimer, part, rev, plan_ok, unmeasurable, path?, size?, format?}; ok=False means at least one characteristic measured out of limits.

ParametersJSON Schema
NameRequiredDescriptionDefault
revNo
pageYes
partNo
pathNo
ratioNo
resultsNo
referenceNo

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations, it discloses non-certification, the ok=false semantics, the 'never a silent pass' invariant, defaulting behavior for part/rev/reference, and supported output formats. These are meaningful behavioral traits not inferable from readOnlyHint/destructiveHint.

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?

Long but information-dense; front-loaded with a one-sentence purpose, then structured parameter details and a clear certification disclaimer. Some field lists and return-object enumeration are verbose, but there is no output schema, so they earn their place.

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 7-parameter tool with no output schema and only sparse annotations, this description covers call semantics, return shape, and important caveats. The missing 'ratio' semantics is the main completeness gap.

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?

With 0% schema description coverage, the description compensates well: it explains results (including position-control x/y and omission for a blank form), path formats, part/rev defaults, and reference field meaning. However, the 'ratio' parameter is never explained, so coverage is strong but not total.

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 clearly it produces a first-article inspection report for a drawing page, using AS9102 Rev B Form 3 structure, with row-level evaluation and optional file output. This is a specific, actionable purpose that separates it from generic drawing or inspection tools even without naming 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?

Describes the main workflow (ballooned characteristics become evaluated rows) and the key branch: pass results for measured inspection, omit results for a blank form. It does not explicitly name alternative tools, but gives clear context for when to invoke it.

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

family_materializeFamily MaterializeA
Destructive

Materialize a whole variant family from ONE design table (issue #138, B1) — "make all the gears" becomes a table, not a loop. For each row, in table order, builds the part with its recipe (A1, #136) and allocates one item + one sequential part number (C1, #140). Subsumes standard-part catalogs: a bearing catalog is a family table keyed by designation, sourced from the ISO corpus.

Two modes (both supported): "instances" (each variant its own released file + part number) and "configurations" (variants share one artifact). Builds into the active document. Returns {schema, family, recipe, mode, key, count, rows, registry}.

table: path to the family table (.csv or .json). registry: optional items.json path (created if absent, written back). mode: optional override of the table's mode (instances|configurations).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo
tableYes
registryNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and readOnlyHint=false, so mutation is known. The description adds meaningful specifics: it allocates item records and sequential part numbers, writes the registry back when absent, builds into the active document, and returns a defined result shape. This is richer than the annotation alone and does not contradict it.

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 well-structured: purpose first, then behavior, modes, output, and parameter details. It is slightly dense with internal issue identifiers (#138, A1, #136, C1, #140) that do little to help an agent select or invoke the tool, but every substantive behavior is covered without bloat.

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 tool with no output schema, the description still documents the return object's keys, the two modes, the active-document side effect, registry write-back, and all parameter meanings. Given the complexity of materializing an entire family, this is complete enough for correct invocation.

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%, so the description carries the full burden, and it succeeds: table is specified as a .csv or .json path, registry as an optional items.json path with create-if-absent behavior, and mode as an optional override with the two accepted values. This adds real semantic meaning beyond the bare schema.

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 names a specific verb and resource: 'Materialize a whole variant family from ONE design table.' It gives a concrete mental model ('make all the gears' becomes a table, not a loop) and distinguishes it from catalog and recipe operations. It is clearly different from related siblings like family_validate and standard_part_designate.

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 description implies when to use the tool—when you have a family table and want to materialize variants—and explains both modes. However, it never explicitly names an alternative tool or states when not to use this one. The usage context is present but the exclusion/alternative guidance is missing.

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

family_validateFamily ValidateA
Read-only

Validate a variant-family design table (issue #138, B1) — a row x column table where row = a variant (keyed by a size designator) and column = a recipe parameter / feature-flag / material. Loads CSV or JSON and checks the recipe, mode, key column, duplicate/missing size keys, and every per-row recipe-door value; each problem names the row+column. Returns {ok, problems}.

table: path to the family table (.csv or .json).

ParametersJSON Schema
NameRequiredDescriptionDefault
tableYes

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the readOnlyHint, the description discloses what the tool loads (CSV or JSON), what it checks (recipe, mode, key column, duplicate/missing size keys, per-row recipe-door values), how problems are reported (row+column), and the return shape ({ok, problems}). This gives the agent a clear behavioral model.

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 efficient, leading with the purpose and then covering input format, validation checks, error reporting, and return value. The internal issue reference '#138, B1' is minor noise, but it does not seriously hurt readability.

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 validation tool with no output schema, the description covers input format, validation scope, error granularity, and return structure. It could go slightly deeper on the structure of the 'problems' list, but it is adequate for confident invocation.

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?

The schema has 0% description coverage, but the description compensates by explaining that 'table' is a path to the family table and accepts .csv or .json. It adds the key semantic detail that the parameter points to a file path, which is absent from the schema.

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 action ('Validate a variant-family design table'), identifies the object (a row x column table with rows keyed by size designator), and details the exact validation checks. This clearly distinguishes it from siblings like family_materialize or recipe_validate.

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 description clearly implies this tool is for validating variant-family design tables, and the readOnlyHint reinforces it as a check rather than a mutation. However, it does not explicitly name alternatives or state when this should be preferred over related validators like recipe_validate, items_validate, or feature_validate.

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

fatigue_checkFatigue CheckA
Read-only

Rate fatigue life (S-N Basquin + Goodman mean-stress correction). σ_a = stress_range/2; infinite-life SF = 1/(σ_a/σ_e + σ_m/σ_uts); finite life from an equivalent fully-reversed amplitude on a log-log S-N line. σ_e/σ_uts come from the material (or overrides). pass = survives cycles (σ_ar ≤ σ_e ⇒ infinite life); a tensile mean ≥ σ_uts fails outright. Returns {stress_amplitude_mpa, mean_stress_mpa, endurance_mpa, uts_mpa, equiv_reversed_mpa, safety_factor, life_cycles, required_cycles, pass, governing_mode, endurance_basis}.

The S-N line runs from (1e3, s1000_fraction·UTS) to (endurance_cycles, σ_e). Both default to the steel convention (0.9 and 1e6); aluminium and other non-ferrous alloys have no true endurance knee, so set endurance_cycles to the life the quoted σ_e was measured at (commonly 5e8).

ParametersJSON Schema
NameRequiredDescriptionDefault
cyclesNo
uts_mpaNo
materialNoSteel-1045
endurance_mpaNo
s1000_fractionNo
mean_stress_mpaNo
endurance_cyclesNo
stress_range_mpaYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, which the description does not contradict. The description adds value beyond annotations by documenting the S-N line construction, the infinite-life criterion, the explicit failure condition (tensile mean ≥ UTS fails outright), and the interpretation of `endurance_cycles` for non-ferrous materials.

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 compact but information-dense. It front-loads the method (S-N Basquin + Goodman), follows with equations, then lists the return fields and concludes with material guidance. Every sentence carries technical value; a slight restructuring could separate the return-fields list for readability, but nothing is wasted.

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?

Input schema covers all 8 parameters and the description explains the core algorithm and key parameter semantics. The return behavior is documented via the output field list. Gaps include lack of explicit unit conventions and no mention of how `endurance_mpa` overrides interact with `material`, but for a fatigue-check tool the description is largely self-sufficient.

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 the meaning of key parameters (`endurance_cycles`, `s1000_fraction`, `cycles`, `pass`, and the return fields). It does not explicitly document every input parameter (e.g., `material`, `uts_mpa`, `endurance_mpa`), but it establishes the relationships between many parameters well enough to infer their roles.

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 verb ('Rate fatigue life') and resource (S-N Basquin + Goodman mean-stress correction). It distinguishes itself from sibling analysis tools by explaining its domain (fatigue) and core methodology, and the detailed equations make it unmistakable from other engineering checks.

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 description provides clear context of when it applies (fatigue life assessment) and gives explicit guidance on non-ferrous alloys vs steel convention. It doesn't explicitly name alternatives, but the material guidance effectively tells the agent how to adapt inputs for different material classes.

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

feature_instantiateFeature InstantiateA
Destructive

Stamp a registered FEATURE TEMPLATE onto a host body at reference geometry supplied BY NAME (PowerCopy/UDF, issue #139) — e.g. a mounting_boss onto a published seat frame, or a bolt_pattern onto an f_ face tag. Validates {refs, inputs} at the door, resolves each reference against the host's CURRENT geometry (an f_ tag / interface name that doesn't resolve fails loudly), then runs the deterministic build — geometry + publish_interface + declare_intent.

template: registered template name (feature_list to browse). host: the handle of the body to stamp onto. refs: reference inputs by name — an interface name, an f_/e_ tag, or a literal {origin, z_axis?, x_axis?} frame, per the template's declared ref kinds. inputs: scalar parameters (typed + unit-bearing + range-checked).

Returns {template, schema, host, refs, inputs, handle, name, interfaces, intent}.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostYes
refsNo
inputsNo
templateYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, it reveals validation at the door, resolution against current geometry, loud failure on unresolved references, and the deterministic build steps: geometry + publish_interface + declare_intent. This gives an agent a solid model of side effects and failure behavior.

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 the core action, uses compact per-parameter definitions, and ends with an explicit return shape. The examples and issue reference add contextual value without padding.

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 no output schema and bare schema property definitions, the description still covers every parameter, the return object, error behavior, and the overall workflow. It provides enough detail to invoke the tool correctly with minimal ambiguity.

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?

The input schema has 0% description coverage, but the description fully compensates by defining each parameter: template as a registered name, host as a body handle, refs as named interfaces/tags/frames, and inputs as typed, unit-bearing, range-checked scalars.

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 opens with a specific verb and resource: 'Stamp a registered FEATURE TEMPLATE onto a host body at reference geometry supplied BY NAME'. It gives concrete examples and clearly differentiates instantiation from related siblings like feature_list and feature_validate.

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 description clearly explains the intended workflow: browse templates via feature_list, supply a registered template name and host handle, and provide references/inputs. It does not explicitly list exclusions, but the context is specific enough to guide tool selection.

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

feature_listFeature ListA
Read-only

List every registered FEATURE TEMPLATE — the PowerCopy/UDF analog of a part recipe: a reusable feature with declared reference-geometry inputs (a frame, an f_/e_ tag, an axis) plus scalar parameters, stamped onto a host by name (issue #139). Returns {schema, count, templates} where each maps to {doc, refs, required, optional, emits}; the directory to browse before picking one with feature_schema / feature_instantiate.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark the tool read-only (readOnlyHint=true) and not open-world, so the description's burden is lighter. It adds valuable behavioral detail by specifying the exact return shape {schema, count, templates} and per-template fields {doc, refs, required, optional, emits}, which goes beyond the annotations. It does not mention pagination or ordering, but that is a minor gap for a read-only listing 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 main action is front-loaded ('List every registered FEATURE TEMPLATE'), followed by compact domain context, return shape, and usage guidance. The PowerCopy/UDF analogy and issue reference add mild noise, but every remaining clause contributes useful 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?

With no parameters and no output schema, the description skillfully supplies the missing return-value contract and sibling relationship, making the tool usable in isolation. It could still mention ordering or scale expectations for a large list, but overall the description is complete enough for correct invocation and interpretation.

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?

The tool has zero parameters, so the baseline is 4 and there is nothing in the schema to document. The description compensates by explaining the structure of returned templates, making the tool's behavior meaningful despite the empty input schema.

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 opens with a specific verb and resource: 'List every registered FEATURE TEMPLATE', and then clarifies the domain concept with concrete inputs (frame, f_/e_ tag, axis) and scalar parameters. It also distinguishes itself from siblings feature_schema and feature_instantiate by positioning itself as the 'directory to browse before picking one.'

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 explicitly gives the usage context: it is the directory to browse before choosing a template via feature_schema/feature_instantiate. This names the relevant alternatives and the order in which they should be used, leaving no ambiguity about when to call feature_list.

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

feature_schemaFeature SchemaA
Read-only

Return one feature template's declared REF+INPUT SCHEMA — its reference geometry (name/kind) and its scalar parameters (type/unit/default/range). Returns {schema, template, doc, refs:[{name, kind, required, doc?}], inputs:[{name, type, unit?, default?, min?, max?, required, choices?, doc?}], emits}. An unknown name fails loudly.

ParametersJSON Schema
NameRequiredDescriptionDefault
templateYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the read-only nature is covered structurally. The description adds genuine value beyond annotations by disclosing the failure behavior ('An unknown name fails loudly'), which tells the agent it should expect errors rather than silent fallback when given an unregistered template name.

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?

Two sentences, purpose first, followed by a compact return-shape spec and the failure caveat. No filler. The inline output-type annotation is verbose but earns its place since there is no output schema to document the return value.

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 single-parameter introspection tool with no output schema and no nested objects, the description fully enumerates the return shape ({schema, template, doc, refs, inputs, emits}), details the fields inside refs and inputs, and states the failure mode. Nothing an agent needs to call it correctly appears to be missing.

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 carries the burden of explaining `template`. It does so indirectly ('one feature template's...') which clarifies that the parameter selects which feature template to introspect, but it never states what form the value takes (name string? registered ID?) or whether it must reference a valid registered template. Adequate but minimal compensation for a zero-coverage schema.

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?

Uses a specific verb ('Return') plus resource ('one feature template's declared REF+INPUT SCHEMA') and scopes precisely to reference geometry and scalar parameters. It self-identifies against sibling schema tool recipe_schema by domain (feature vs recipe) and against feature_list/validate/instantiate by being the introspection tool. No ambiguity about what the tool does.

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 description makes the intent self-evident (inspect a feature template's schema) but never explicitly states when to prefer this over sibling tools such as recipe_schema, feature_list, or feature_validate. There is no direct alternative routing or exclusion guidance, so the agent must infer usage from the tool name and purpose.

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

feature_validateFeature ValidateA
Read-only

Validate a feature instantiation {template, refs, inputs} WITHOUT building it — the cheap structural front door (mirrors recipe_validate). Catches an unknown template, an unknown/missing required reference, a malformed reference value, and every scalar-input failure (missing required, out of range, wrong type, bad unit, unknown key). A tag that doesn't resolve against real geometry is caught at feature_instantiate time. Returns {ok, problems}.

ParametersJSON Schema
NameRequiredDescriptionDefault
refsNo
inputsNo
templateYes

TDQS

A4.7/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description explains the non-building nature, enumerates the exact failure classes it detects (unknown template, missing/malformed references, scalar-input failures), and discloses the return shape {ok, problems}. It also documents a meaningful limitation, which is useful behavioral context beyond the annotations.

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 compact and front-loaded, with each sentence adding distinct value: what it does, what it catches, what it does not catch, and what it returns. There is no repetition of annotations or schema information.

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 no output schema, the description supplies the return contract ({ok, problems}), the full scope of validation, and the boundary with feature_instantiate. An agent has enough information to call the tool correctly and interpret its result.

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: it names {template, refs, inputs} and maps each to its validation concern—template identity, references, and scalar inputs. It does not specify the exact object shape of refs/inputs, but that is reasonably left to the template being validated.

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 verb and resource: 'Validate a feature instantiation {template, refs, inputs} WITHOUT building it.' It also distinguishes itself from the sibling feature_instantiate by explicitly noting that geometry-dependent tags are caught there, not here.

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 positions the tool as a 'cheap structural front door' before building, and explicitly tells the agent what it does not catch ('A tag that doesn't resolve against real geometry is caught at feature_instantiate time'). The mention of recipe_validate as a mirror gives an additional routing signal to an analogous sibling.

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

fem_add_constraintFEM Add ConstraintB

Add a constraint by face/edge tag (Slice 1).

kind: structural: 'fixed' | 'force' | 'pressure' | 'displacement' thermal: 'temperature' | 'heatflux' | 'initial_temperature' refs: list of {handle, tag} dicts; 'tag' may be a face tag (f_...) or edge tag (e_...). Resolved against the live shape so refs survive unrelated geometry edits.

For 'force': force (N), optional direction {handle, edge|tag}. For 'pressure': pressure (MPa). For 'displacement': x/y/z (mm) or x_free/y_free/z_free. For 'temperature' / 'initial_temperature': temperature (°C / K). For 'heatflux': flux_type ('DFlux'|'Convection'|'Radiation'), and DFlux: flux (W/m²); Convection: ambient_temp (°C) + film_coef (W/m²K); Radiation: ambient_temp + emissivity.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
zNo
fluxNo
kindYes
nameNo
refsYes
forceNo
x_freeNo
y_freeNo
z_freeNo
analysisYes
pressureNo
reversedNo
directionNo
film_coefNo
flux_typeNo
emissivityNo
temperatureNo
ambient_tempNo

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already indicate a mutating operation (readOnlyHint=false). The description adds a useful behavioral detail: refs are resolved against the live shape and survive unrelated geometry edits. However, it does not disclose validation side effects, whether existing constraints are replaced, or failure modes.

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 compact and well-structured, front-loading the core purpose and grouping parameter details by kind. The unexplained 'Slice 1' is a minor distraction, but otherwise there is no filler and every section earns its place.

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?

Given 20 parameters, no schema descriptions, and no output schema, the description covers most parameter semantics and units but leaves the required 'analysis' parameter unexplained. It also lacks usage context and return-value expectations, which is a significant gap for a complex mutation tool.

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?

With 0% schema description coverage, the description carries the parameter-semantics burden and compensates well: it explains kind values, refs structure, per-kind parameter combinations, and units. The main gap is that the required 'analysis' parameter is entirely undocumented, and 'name'/'reversed' are not explained.

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 action ('Add') and resource ('constraint') and specifies the selection mechanism (face/edge tags). It clearly distinguishes this from generic sketch constraints by the FEM context, though it does not explicitly contrast it with other FEM setup tools.

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 guidance about when to use this tool versus alternatives like contact_setup, fem_set_material, or other FEM tools. The phrase 'Slice 1' hints at a workflow stage, but the intended sequencing is left entirely to inference.

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

fem_bucklingFEM BucklingC
Destructive

Configure analysis for linear buckling. Apply a unit-magnitude force constraint at the load location; the result factors are the multipliers at which buckling occurs.

ParametersJSON Schema
NameRequiredDescriptionDefault
analysisYes
n_factorsNo

TDQS

C2.9/5.0
Behavior3/5

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

The description discloses that it applies a unit-magnitude force constraint and that the result factors are multipliers for buckling, which adds behavioral context. However, it does not explicitly state that this modifies the analysis or model (destructive hint is true), nor does it mention any side effects or reversibility. The annotation already flags destructiveness, so the description adds some but not 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 two sentences, no fluff, front-loaded with the purpose. Every word contributes to understanding what the tool does.

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

Completeness2/5

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

For a complement tool with two parameters, one required, and no output schema, the description is insufficient. It does not explain typical usage sequence (e.g., after setting material and constraints), what the analysis parameter expects, or how to interpret the result. The sibling list suggests many FEM tools, but the description does not place this in the workflow.

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

Parameters1/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 explain the parameters. It does not mention 'analysis' or 'n_factors' at all. The only hint is that the result factors are multipliers, which relates to n_factors but not explicitly. An agent cannot determine what string to pass for 'analysis' or the meaning of 'n_factors' from this description.

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 'configure' and resource 'analysis' for linear buckling, which distinguishes it from modal analysis and other FEM tools. It clearly indicates the focus on buckling, though it could be more explicit about the difference from fem_new_analysis or fem_run.

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?

No guidance on when to use this tool versus siblings like fem_modal or fem_run. It does not mention prerequisites such as having an existing analysis setup, or that buckling analysis requires a mesh and solver configuration. There are no alternative tool references.

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

fem_buckling_resultsFEM Buckling ResultsA
Read-only

Extract buckling load multipliers from a completed buckling run. Pass analysis, or the job_id of a finished fem_run_submit solve. Returns {buckling_factors: [...], modes: [{mode, factor}, ...]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idNo
analysisNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this by saying it 'extracts' results without suggesting any mutation. It also adds useful behavioral context by specifying the prerequisite of a completed run and by showing the exact return shape, which the agent would otherwise not know without an output schema.

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 with no filler. It front-loads the core purpose, then provides invocation guidance, then the return format. Every sentence earns its place and the structure is easy to scan.

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 result extraction tool with optional parameters and no output schema, the description covers the key elements: what it extracts, how to invoke it, when it is valid, and what it returns. It could be slightly more explicit about whether passing both `analysis` and `job_id` is allowed or how conflicts are resolved, but this is a minor gap.

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 for the bare parameter names. It does so by explaining that `analysis` and `job_id` are alternative identifiers and that `job_id` refers to a finished `fem_run_submit` solve, giving the agent enough semantic grounding for both parameters.

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 ('Extract') and a specific resource ('buckling load multipliers from a completed buckling run'), making the tool's purpose immediately clear. It also distinguishes itself from related FEM tools by focusing specifically on buckling result extraction rather than setup, submission, or generic result retrieval.

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 description clearly states the precondition: the buckling run must be completed, and it tells the agent to pass either `analysis` or the `job_id` of a finished `fem_run_submit` solve. It does not explicitly name alternative result tools like `fem_modal_results` or `fem_thermal_results`, but the context strongly implies when this tool is appropriate.

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

fem_cantilever_demoFEM Cantilever DemoA
Destructive

Run the built-in cantilever FEM demo end-to-end (geometry → mesh → CalculiX).

Dimensions in mm, force in N. Returns {nodes, tets, max_displacement_mm, max_vonmises_mpa, workdir}. A fresh document is created; existing state in the session is NOT overwritten but a new document becomes active.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
widthNo
heightNo
lengthNo
workdirNo
mesh_sizeNo

TDQS

A4/5.0
Behavior4/5

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

Annotations mark the tool as destructive and non-read-only; the description adds concrete context by explaining that a fresh document is created, existing session state is not overwritten, and the new document becomes active. This usefully qualifies what destructive behavior actually occurs rather than contradicting the annotation.

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 compact sentences with no filler. Purpose is front-loaded, followed by units, return shape, and side effects, so every sentence earns its place.

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 demo tool with no required parameters and no output schema, the description covers purpose, units, return values, and session side effects. The only notable gaps are undocumented mesh_size/workdir semantics and no explicit statement about synchronous execution, but these are minor for a demo.

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?

With 0% schema description coverage, the description carries most of the parameter-semantics burden. It provides crucial units ('Dimensions in mm, force in N') that clarify width/height/length/force, but it does not explain mesh_size behavior or the role of workdir beyond including it in the return value.

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 verb ('Run') and resource ('built-in cantilever FEM demo'), then clarifies the full pipeline with 'geometry → mesh → CalculiX'. This makes it easy to distinguish from the many discrete FEM sibling tools like fem_mesh or fem_run.

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 phrase 'built-in ... demo' implies this tool is for running a canned example rather than a custom FEM analysis, but it never explicitly states when to prefer it over alternatives. There is no direct when-to-use or when-not-to-use guidance, only an implied use case.

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

fem_meshFEM MeshA

Create a Gmsh mesh of body, attached to analysis.

char_length: max characteristic element length in mm. 0 = let Gmsh pick. element_order: '1st' or '2nd' (quadratic). Use '2nd' for bending/modal accuracy — linear tets (C3D4) shear-lock and overstiffen thin sections (a cantilever's first natural frequency lands ~50% high with only 1-2 elements through the thickness; 2nd-order tets bring it within ~1% of beam theory). Default lets Gmsh choose. Returns {handle, name, nodes, tets}.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
nameNoMesh
analysisYes
char_lengthNo
element_orderNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, which already signal this is a non-destructive creation operation. The description adds valuable behavioral context: it explains the consequences of using linear tets (shear-locking, overstiffening, ~50% high natural frequency) and the benefit of 2nd-order tets (~1% accuracy). It also discloses the return value shape ({handle, name, nodes, tets}). This goes beyond the annotations without contradicting them.

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 compact and front-loaded with the core action. The element_order guidance is a bit long but earns its place because it directly affects result accuracy. The return value is listed at the end. It could be slightly tighter, but every sentence adds value.

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 mesh-creation tool with 5 parameters and no output schema, the description covers the key decision (element_order), the key sizing parameter (char_length), and the return shape. It does not mention the 'name' parameter or any prerequisites (e.g., that an analysis must already exist), but the required parameters are clear and the tool is a creation step, not a complex workflow. The absence of an output schema makes the return-value disclosure particularly valuable.

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 does: char_length is explained as 'max characteristic element length in mm' with the 0 = auto behavior. element_order is explained with concrete guidance and a default. The required parameters body and analysis are described in the opening sentence. The only minor gap is the 'name' parameter, which is not mentioned, but its default is in the schema.

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 opens with a specific verb and resource: 'Create a Gmsh mesh of `body`, attached to `analysis`.' This clearly distinguishes it from sibling tools like fem_run, fem_modal, and fem_mesh_refinement, which handle different stages of the FEM workflow. The title 'FEM Mesh' is expanded into a concrete action.

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 description gives clear context for when to use this tool: it is the mesh-creation step for an analysis. It also provides guidance on element_order selection ('Use '2nd' for bending/modal accuracy') and explains the default behavior. However, it does not explicitly state when NOT to use it or name alternative tools for meshing (e.g., fem_mesh_refinement), so it falls just 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.

fem_mesh_refinementFEM Mesh RefinementA

Add a local mesh-refinement region to an existing FEM mesh.

mesh: handle of the FEM mesh. refs: list of {handle, face|edge|tag} dicts identifying the elements (faces/edges) to refine on. char_length: characteristic element length (mm) on those elements; should be smaller than the global mesh setting to actually refine.

ParametersJSON Schema
NameRequiredDescriptionDefault
meshYes
nameNoMeshRegion
refsYes
char_lengthYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already convey readOnlyHint=false and destructiveHint=false. The description adds useful context: it is a mutation requiring an existing mesh, and the refinement only takes effect if char_length is below the global setting. It does not disclose side effects, return value, or failure modes, so 3 is appropriate.

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?

One-sentence purpose followed by a tight three-line parameter list. Every sentence earns its place and the key condition for effectiveness is included without redundancy.

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 description covers the prerequisite (existing mesh), semantics of all required parameters, and the units/condition for char_length. It omits the optional name parameter and some details about how refs are resolved or what the operation returns, but no output schema exists and these are secondary for invoking the 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?

With 0% schema description coverage, the description carries the full burden, and it compensates well: mesh is identified as the handle, refs is described as a list of {handle, face|edge|tag} dicts, and char_length gets units (mm) and a behavioral condition relative to the global mesh. Only the optional name is left undescribed, which is minor.

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 names a concrete action ('Add') and a specific resource ('local mesh-refinement region' on an 'existing FEM mesh'). This clearly distinguishes it from general mesh operations like fem_mesh and from analysis/solver 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?

It states the operation is for adding a local region to an existing mesh, implying the mesh must already exist and that global refinement is not the target. The note that char_length should be smaller than the global mesh setting gives a concrete condition. It does not explicitly name sibling alternatives or exclusions, so it is not a 5.

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

fem_modalFEM ModalA
Destructive

Configure analysis for modal (frequency) extraction.

Sets solver AnalysisType='frequency' and EigenmodesCount=n_modes. f_low / f_high (Hz) optionally bound the requested mode range. Caller still calls fem_run, then fem_modal_results to read frequencies.

ParametersJSON Schema
NameRequiredDescriptionDefault
f_lowNo
f_highNo
n_modesNo
analysisYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already signal that this is a mutating operation (readOnlyHint=false, destructiveHint=true). The description adds useful behavioral detail: it only configures solver settings, does not run the analysis, and requires subsequent calls. This goes beyond the annotations without contradicting them.

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?

Three tight sentences: purpose first, then concrete parameter effects, then required follow-up calls. Every sentence earns its place and the structure is highly scannable.

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

Completeness2/5

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

The workflow is well-stated, but the tool has four parameters, no schema descriptions, and no output schema. The required `analysis` parameter is left ambiguous, and there is no guidance on constraints between n_modes and the frequency bounds. The definition is not complete enough for an agent to invoke it reliably.

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 description usefully explains f_low/f_high and n_modes, but the required `analysis` parameter is never semantically defined. With 0% schema description coverage, the description should compensate, but an agent still cannot know what to pass for `analysis` or how it relates to the stated solver setting. This is a major 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 description clearly identifies the tool as configuring modal/frequency extraction, states the specific solver settings it changes, and distinguishes itself from the solve and result-reading siblings in the workflow. It is far from tautological and names the resource it acts on.

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 description gives explicit workflow context: this tool configures, fem_run solves, and fem_modal_results reads results. It does not explicitly exclude alternatives like fem_buckling or thermal analyses, but the modal-specific naming and behavior make the intended use clear enough.

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

fem_modal_resultsFEM Modal ResultsA
Read-only

Extract natural frequencies from a completed modal run. Pass analysis, or the job_id of a finished fem_run_submit solve. Returns {frequencies_hz: [...], modes: [{mode, frequency_hz, max_displacement_mm}, ...]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idNo
analysisNo

TDQS

A4.4/5.0
Behavior4/5

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

With readOnlyHint=true, the safety profile is already clear, and the description matches by saying 'extract' rather than mutate. It adds useful behavioral context by requiring a completed/finished solve and by spelling out the return shape, which is not present in annotations.

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?

Three sentences deliver purpose, usage, and return format with no filler. The description is front-loaded with the core action, and every sentence contributes essential 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?

There is no output schema, so the explicit return structure is valuable and largely completes the picture. The description is slightly incomplete in not stating whether at least one parameter is required and what happens if neither is valid, but the core workflow is well covered.

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 carries the burden for parameters. It clarifies that analysis and job_id are alternative identifiers and that job_id refers to a finished fem_run_submit solve. This goes beyond the bare schema, though it does not define parameter formats or precedence.

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 action and resource: "Extract natural frequencies from a completed modal run." The verb 'extract' plus the resource 'natural frequencies' clearly differentiates this from submission tools like fem_modal and from other result tools like fem_buckling_results or fem_thermal_results.

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 description sets a clear condition: use it only on a completed modal run or a finished fem_run_submit solve. It explains which identifiers to pass (analysis or job_id), but it does not explicitly name alternative result tools or state when not to use them.

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

fem_new_analysisFEM New AnalysisB

Create a Fem::FemAnalysis container. Returns {handle, name}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoAnalysis

TDQS

B3.1/5.0
Behavior3/5

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

Annotations only indicate non-read-only/non-destructive behavior, so the description carries the burden. It does disclose the core side effect (creating a container) and the return contract ({handle, name}), but it omits prerequisites such as an active document and does not mention failure behavior or persistence.

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?

One sentence with no filler; the core action and return value are front-loaded. The description is appropriately sized for a simple factory tool.

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 one-parameter creation tool with no output schema, the description gives the essential operation and return shape. However, it lacks contextual prerequisites (e.g., active document/workbench) and any indication of how the returned handle/name is meant to be used with other FEM tools.

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?

With 0% schema description coverage, the description needed to explain the optional 'name' parameter, but it is entirely absent. The schema itself only supplies a title and default, so the parameter is minimally inferable but not elaborated.

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 ('Create') and identifies the exact resource being made ('Fem::FemAnalysis container'), and states the return payload. It does not explicitly differentiate from sibling FEM tools, but the creation intent is unambiguous relative to run/mesh/material siblings.

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?

No guidance is given for when to call this tool versus sibling FEM tools such as fem_set_material, fem_add_constraint, or fem_run. The need to create an analysis before other FEM operations is only implicit, not stated.

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

fem_result_probeFEM Result ProbeA
Read-only

Probe FEM results at a specific location, instead of only the global max + top-N that fem_results returns. Answers "what is the stress at this point / on this face?" — the agent-friendly form for design iteration.

Pick exactly one mode:

  • POINT: point=[x, y, z] (mm, model coordinates). Interpolates the field barycentrically inside the tet containing the point (method='interpolated'); if the point is outside the mesh it falls back to the nearest node and reports distance_mm (method='nearest_node').

  • FACE: handle= + face=<'f_*' tag or 'FaceN'>. Aggregates the field over the mesh nodes on that CAD face, returning {min, max, mean}.

field: 'auto' (default — every field present in the result) | 'vonmises' | 'displacement' | 'temperature'.

Pass analysis, or the job_id of a finished fem_run_submit solve.

Returns (point mode) {mode:'point', query_point, method, element_id?, node?, distance_mm, vonmises_mpa?, displacement_mm?, displacement_vector?, temperature_c?}; (face mode) {mode:'face', face, node_count, vonmises_mpa?:{min,max,mean}, displacement_mm?:{...}, temperature_c?:{...}}.

ParametersJSON Schema
NameRequiredDescriptionDefault
faceNo
fieldNoauto
pointNo
handleNo
job_idNo
analysisNo

TDQS

A5/5.0
Behavior5/5

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

Annotations provide readOnlyHint=true but the description goes far beyond that: it discloses the interpolation method (barycentric), the fallback to nearest node with distance_mm reporting, the face aggregation behavior returning min/max/mean, and the exact result structure. This gives a complete behavioral model for a read-only probe.

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 long but every section earns its place: purpose, mode selection, mode-specific parameters, field choices, solve context, and return shapes. Bullet formatting and a clear hierarchy make it scannable, and the core purpose is front-loaded.

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?

Given the tool's moderate complexity, zero schema descriptions, and no output schema, the description provides everything needed to call it correctly: exact input formats, mode selection rules, fallback behavior, and full return shape for both modes. There are no critical gaps.

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 the description compensates fully: point is defined as [x, y, z] in mm model coordinates, face requires handle plus a 'f_*' tag or 'FaceN', field lists allowed values including the 'auto' default, and analysis/job_id are explained as the solve context. Every parameter is meaningfully described.

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 clearly states the tool's purpose: 'Probe FEM results at a specific location,' and explicitly contrasts it with the global max + top-N returned by `fem_results`. It answers the specific design question 'what is the stress at this point / on this face?' which distinguishes it from sibling FEM tools.

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 tells the agent when to use this tool instead of `fem_results`, names the sibling explicitly, and explains the two mutually exclusive modes (POINT vs FACE). It also specifies how to pass the required solve context: 'Pass `analysis`, or the `job_id` of a finished fem_run_submit solve.'

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

fem_resultsFEM ResultsA
Read-only

Extract summary results from an analysis.

Pass analysis, or the job_id of a finished fem_run_submit solve (a running or failed job is an error that says so).

Returns {max_vonmises_mpa, max_displacement_mm, max_displacement_vector, top_stress_nodes: [{node, vonmises_mpa, displacement_mm}, ...]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
top_nNo
job_idNo
analysisNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description adds value by disclosing the error condition when the job is running/failed and by spelling out the exact return shape (including the `top_stress_nodes` array), which is beyond what annotations provide.

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 only three sentences, front-loads the purpose, and packs the return format into an inline code block. There is no fluff, and every sentence earns its place.

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?

It covers the main usage paths, the return structure (acts as a faux output schema), and error behavior for unready jobs. It does not explain precedence when both `analysis` and `job_id` are supplied, or the effect of `top_n`, but those are minor gaps for a read-only tool of this complexity.

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?

The description explains the two alternative string parameters (`analysis` and `job_id`) and their relationship to a finished solve, but says nothing about `top_n`. With 0% schema description coverage, it partially compensates for the missing parameter documentation but leaves the meaning of `top_n` implicit.

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 action ('Extract summary results from an analysis') and clearly ties to the FEM domain with the field names (max_vonmises_mpa, max_displacement_mm). This distinguishes it from sibling tools like fem_modal_results or fem_thermal_results by focusing on the general summary result from a finished fem_run_submit solve.

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 tells the agent to pass either `analysis` or the `job_id` of a finished fem_run_submit solve, and warns that a running or failed job produces an error. It does not explicitly name alternative tools for different FEM result types, but the context is clear enough for routine use.

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

fem_runFEM RunA
Destructive

Run the CalculiX solver on an analysis. BLOCKS the MCP channel until the solve finishes (up to 600 s).

Which to reach for: fem_run for small solves — a coarse mesh, linear static, a few thousand nodes — that finish in seconds, where a poll round-trip only adds latency. fem_run_submit for anything that may take a minute or more (fine or 2nd-order meshes, modal/buckling with many modes, nonlinear material or geometry), so the channel stays free while ccx runs.

workdir defaults to <TMPDIR>/ankusdrive_fem. Raises if ccx exits non-zero (with its *ERROR lines), or if a fem_run_submit solve is still running on this analysis or workdir. Returns {workdir, status: 'ok', returncode, analysis_type, result_objects, analysis}.

ParametersJSON Schema
NameRequiredDescriptionDefault
workdirNo
analysisYes

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, the description discloses critical runtime behavior: it blocks the MCP channel up to 600 seconds, raises on non-zero ccx exit with *ERROR lines, raises if a fem_run_submit solve is still running, and specifies the returned fields. This is rich, actionable behavioral context that the annotations alone do not provide.

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 longer than average, but every sentence earns its place: blocking behavior, selection guidance, workdir default, error conditions, and return payload. The most important facts are front-loaded, and the structure flows logically from invocation to error handling to results.

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?

Given the complexity of a blocking solver call, the description covers a great deal: timeout, alternatives, defaults, error modes, and return fields. The main gap is that the required 'analysis' parameter is not explained at all, which prevents the definition from being fully self-sufficient despite strong coverage elsewhere.

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 the undocumented parameters. It explains the workdir default and semantics, but 'analysis' is left opaque — no indication of whether it is an ID, name, path, or how it should be obtained. This is a meaningful gap for a required 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 opens with a precise verb and resource: 'Run the CalculiX solver on an analysis.' It also distinguishes itself from the sibling fem_run_submit by framing it as the synchronous, blocking variant, so an agent can tell them apart immediately without opening any 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 explicitly gives selection criteria: use fem_run for small solves that finish in seconds, and fem_run_submit for anything taking a minute or more. It names the alternative directly and explains the trade-off (poll latency vs. channel availability), leaving no ambiguity about when to choose this tool.

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

fem_run_submitFEM Run SubmitA
Destructive

Run the CalculiX solver on an analysis OFF the MCP channel — the submit→poll form of fem_run, for solves long enough to stall the channel (see fem_run for which to use).

The solver input is written before this returns, so a missing solver, material or mesh fails here, synchronously, exactly as fem_run would. ccx then runs in the background. Poll job_status: once ccx exits, the results are imported into the analysis on your NEXT poll (FreeCAD work runs on the worker's main thread, which a poll gives a turn) — so keep polling until status is 'done'; a job nobody polls never finishes. A ccx error fails the job with its *ERROR lines.

When done, read results with fem_results / fem_result_probe / fem_modal_results / fem_buckling_results / fem_thermal_results passing either analysis or this job_id (don't job_result(discard=True) first if you plan to use the job_id). While the job runs, fem_run or another submit on the same analysis or workdir is refused. Returns {job_id, status, cache_hit}; job_result's result is fem_run's return dict.

ParametersJSON Schema
NameRequiredDescriptionDefault
workdirNo
analysisYes

TDQS

A4.5/5.0
Behavior5/5

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

The description goes far beyond the sparse annotations, explaining synchronous validation failure, background execution, results imported on the next poll, no polling means the job never finishes, ccx *ERROR lines fail the job, and concurrency restrictions. There is no contradiction with the annotations.

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 text is relatively long but well organized, moving from purpose to execution model to lifecycle/result handling. The length is justified for a complex async tool, and no sentence is filler; however, a couple of phrases (e.g. the repeated `analysis` or `workdir` references) could be tightened, keeping it just short of a 5.

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?

Despite having no output schema and minimal param schema, the description covers the full call lifecycle, validation timing, polling protocol, results, concurrency, return dict, and how to read into results tools. Minor gaps remain around the exact meaning of `analysis`, `workdir`, and `cache_hit`, but overall the agent knows what to do.

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?

With 0% schema description coverage, the description carries the full burden, but it only adds context around `analysis` and `workdir` indirectly through the workflow text. It doesn't explicitly define what value should be passed as `analysis`, how `workdir` is used, or the relation between them, so it only partially compensates.

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 opens with a specific verb, resource, and mode: 'Run the CalculiX solver on an analysis OFF the MCP channel — the submit→poll form of fem_run, for solves long enough to stall the channel'. It names fem_run and clearly differentiates the async variant, so an agent can distinguish this tool without opening other schemas.

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 a concrete usage criterion ('solves long enough to stall the channel'), likely sets the threshold for when to pick this over fem_run, and points to fem_run for the alternative. It also includes an explicit exclusion: while a job runs, 'fem_run or another submit on the same analysis or workdir is refused'. This is clear when/when-not guidance.

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

fem_set_materialFEM Set MaterialB

Bind a material to a body in an analysis.

material is a dict with at minimum: {"YoungsModulus": "210000 MPa", "PoissonRatio": "0.30", "Density": "7900 kg/m^3", "Name": "Steel-Generic"} Any extra keys are passed through to the FEM material card.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
nameNoMaterial
analysisYes
materialYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already indicate this is not read-only and not destructive, so the description does not need to repeat that. It adds useful context by showing an example material dict and stating that extra keys are passed through to the FEM material card. However, it does not disclose whether this replaces existing materials on the body, requires a prior analysis, or what happens to the body afterward.

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 short and front-loaded, with a one-line purpose followed by a directly usable example. Every sentence earns its place and there is no filler.

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 4-parameter tool with a nested object and no output schema, the description covers the tricky material parameter well. It still leaves the body/analysis target semantics implicit and does not mention whether the operation overrides existing material assignments, so it is adequate but not complete.

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 carries that burden. It documents the required structure of the material dict with example keys and units, which is valuable. Yet the body and analysis parameters are plain strings with no additional meaning, and name is not explained, so there is room to add more.

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 clear verb-resource pair ('Bind a material to a body in an analysis') that identifies the operation and its object. It does not distinguish itself from the sibling fem_set_nonlinear_material, but the purpose is specific enough that an agent can tell what it does.

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?

No guidance is given on when to use fem_set_material versus alternatives such as fem_set_nonlinear_material or material_select. The context implies it is the standard linear material assignment, but no exclusions or preconditions are stated.

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

fem_set_nonlinear_materialFEM Set Nonlinear MaterialA

Attach an elastoplastic (*PLASTIC) hardening curve to a linear FEM material and switch the CalculiX solve to nonlinear — the material-nonlinearity half of the nonlinear FEM path (contact_setup is the geometric/contact half). No new solver: this promotes the CCX MaterialNonlinearity / GeometricalNonlinearity flags the FEM path already exposes. base_material is the handle from fem_set_material (its YoungsModulus/PoissonRatio stay the elastic branch).

Give the post-yield curve either as yield_points ([[stress_MPa, plastic_strain], ...], first point at plastic_strain 0 = initial yield) or from yield_mpa (+ optional tangent_modulus_mpa linear-hardening slope and max_plastic_strain). With no tangent modulus the curve is elastic–perfectly-plastic and caps the stress at σ_y exactly. hardening: 'isotropic' (monotonic) or 'kinematic' (cyclic/Bauschinger). Set geometric_nonlinearity=true to combine plasticity with large deflection (*NLGEOM). ramp_increments sub-divides the load step so ccx's plastic return-mapping converges. Run fem_run + fem_results after; gate against plastic_collapse (perfectly-plastic stress saturates at σ_y, collapse at M_p).

Returns {handle, name, hardening, yield_points, n_points, solver_material_nonlinear, solver_geometric_nonlinear, ramp_increments}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNonlinearMaterial
analysisYes
hardeningNoisotropic
yield_mpaNo
yield_pointsNo
base_materialYes
ramp_incrementsNo
max_plastic_strainNo
tangent_modulus_mpaNo
geometric_nonlinearityNo

TDQS

A5/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false, so the description carries the burden of explaining the mutation. It does so richly: it promotes CCX flags, preserves the elastic branch of the base material, describes perfectly-plastic behavior (stress caps at σ_y, saturation/collapse), and warns that ramp_increments help convergence. No contradiction with annotations.

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 long but information-dense; every sentence adds value, from the purpose and path relationship to curve formats and post-processing steps. It front-loads the primary action and differentiators, then moves from curve input options to solver flags and workflow.

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 10-parameter tool with no output schema and no property-level schema descriptions, this description is exceptionally complete. It covers required arguments, optional parameter meanings, the return object fields, and integration with sibling tools. The only implicit detail is the source of the 'analysis' argument, but that is inferable from the FEM tool family context.

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%, so the description must compensate for every parameter. It does: yield_points format, yield_mpa alternative, tangent_modulus_mpa meaning, max_plastic_strain, hardening choices, geometric_nonlinearity, and ramp_increments are all explained. This fully covers the bare schema.

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 verb and resource: it attaches an elastoplastic hardening curve to a linear FEM material and switches the CalculiX solve to nonlinear. It differentiates from contact_setup as the geometric/contact half and ties base_material to fem_set_material, so an agent can clearly distinguish this from its siblings.

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 explicitly says when to use this tool (the material-nonlinearity half of the nonlinear FEM path) and names the alternative path (contact_setup for geometric/contact). It also gives a downstream workflow (fem_run + fem_results, gate against plastic_collapse) and explains the two ways to supply the yield curve, making the decision process explicit.

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

fem_set_solverFEM Set SolverB

Add a solver to an analysis. kind: 'ccx' (CalculiX) or 'elmer'.

tunables: dict of solver-property values, e.g. {"GeometricalNonlinearity": "linear", "ThermoMechSteadyState": True, "MatrixSolverType": "default"}. Sensible CCX defaults are filled in if omitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoccx
nameNoSolver
analysisYes
tunablesNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already indicate the tool is not read-only and not destructive, so the description is not required to repeat that. It does add useful behavior: 'Sensible CCX defaults are filled in if omitted,' which clarifies how missing tunables are handled. However, it does not disclose other behaviors such as whether an existing solver is overwritten or what happens if the analysis is invalid, leaving some ambiguity.

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 extremely concise: two sentences plus an example. It front-loads the primary purpose, immediately explains the key 'kind' parameter, and provides a concrete tunables example. There is no wasted wording, making it efficient for an agent to parse.

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 relatively simple configuration tool, the description covers the main purpose and default behavior, but misses crucial workflow context such as requiring an existing analysis, the effect of calling it multiple times, and any return values or error conditions. Given no output schema and no annotation hints about these, the description should provide more guidance.

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?

With 0% schema description coverage, the description must explain the parameters. It does explain 'kind' (ccx or elmer) and 'tunables' with an example, but leaves 'name' and the required 'analysis' unexplained. While 'analysis' might be inferred from context, the lack of explicit explanation for two of four parameters, especially the required one, is a shortfall.

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 clearly states the tool's function: 'Add a solver to an analysis.' It specifies the resource (solver) and the target (analysis), and distinguishes it from siblings by focusing solely on solver configuration, not materials, constraints, or meshing. The mention of 'ccx' and 'elmer' further clarifies the scope.

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?

The description provides no explicit guidance on when to use this tool versus other FEM setup tools like fem_set_material or fem_run. It does not mention prerequisites (e.g., an existing analysis) or workflow position, leaving the agent to infer usage from context. This is a significant gap given the large set of sibling tools.

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

fem_thermal_resultsFEM Thermal ResultsA
Read-only

Extract temperature field summary from a completed thermal run. Pass analysis, or the job_id of a finished fem_run_submit solve. Returns {temperatures_c: {min, max, mean}, top_n_hot_nodes: [...]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
top_nNo
job_idNo
analysisNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description does not contradict that. It adds useful behavioral context by stating the operation extracts from a completed run and by specifying the return shape, including min/max/mean temperatures and top_n_hot_nodes. It does not discuss error behavior, but the annotation lowers the burden.

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 concise sentences with no filler. The action is front-loaded, the usage guidance follows, and the return contract is stated directly.

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 no output schema, the description correctly provides the return structure. It covers the main selector parameters and the prerequisite of a completed thermal run. Minor gaps remain around `top_n` semantics and selector exclusivity, but overall it is sufficient for a read-only result query 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 that `analysis` and `job_id` are alternative selectors and implies `top_n` relates to the returned top_n_hot_nodes. However, it does not explicitly define `top_n`, its default, or what happens when both selectors are supplied or neither is supplied.

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 opens with a specific verb and resource: 'Extract temperature field summary from a completed thermal run.' This clearly differentiates it from sibling tools like fem_modal_results or render_fem_results by focusing on thermal temperature data extraction.

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 explicit context: use this on a completed thermal run by passing either `analysis` or the `job_id` of a finished fem_run_submit solve. It does not explicitly name alternative tools or exclusions, but the timing and selection criteria are clear enough for an agent.

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

fillet_edgesFillet EdgesA

Fillet edges of a shaped Part object. edges accepts tags (e_... from list_edges, preferred), 'EdgeN' strings, or bare 1-based ints. radius is the blend radius in mm (> 0).

Every result is validated before a handle comes back (issue #283): this OCC build's fillet is edge- and order-sensitive enough to produce corrupt geometry with no exception at all — a 20 mm cube filleted on all 12 edges at r=11 returns one solid with a LARGER volume and a 13 mm larger bounding box. The checks are Shape.isValid(), an unchanged solid count, and no growth of the tight bounding box (a fillet only removes or holds the envelope).

per_edge: skip the single-shot apply and add the edges one at a time, validating after each. Slower (one recompute per edge); for geometry already known to be blend-hostile. allow_partial: accept a partial result instead of aborting. Off by default.

Returns {handle, name, volume (mm^3), edges (the 1-based indices actually filleted), checks {valid, solids, envelope_ok, envelope_growth_mm, envelope_tol_mm}, mode ('batch' | 'per_edge'), partial}. When partial is True the reply also carries skipped_edges and a warnings entry saying the solid is NOT the part that was asked for.

On failure the handler retries per edge to find the culprits, removes the failed feature from the document and raises BlendCheckFailed naming the offending edges and the subset that does fillet cleanly. It never returns a handle to corrupt geometry, and never quietly drops a fillet unless allow_partial was asked for.

ParametersJSON Schema
NameRequiredDescriptionDefault
edgesYes
handleYes
radiusNo
per_edgeNo
allow_partialNo

TDQS

A4.3/5.0
Behavior5/5

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

The description discloses exact validation checks (Shape.isValid, solid count, bounding-box envelope), failure retry/removal behavior, the BlendCheckFailed error, and the guarantee to never return corrupt geometry or silently drop fillets. This goes far beyond the sparse annotations.

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 text is long but deliberately structured: operation, parameters, validation rationale, option behavior, return contract, failure contract. The concrete 20 mm cube example justifies the validation section, and no sentence appears wasted.

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?

Given no output schema and no annotated parameter descriptions, the description covers inputs, modes, return fields, validation, and failure paths comprehensively. The only meaningful gap is that the required `handle` parameter is never explained as the target object reference.

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?

With 0% schema description coverage, the description compensates well by defining edge input formats, radius units and positive constraint, and both boolean modes. The required `handle` parameter is still unexplained as the identifier of the Part being modified.

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 first sentence names a concrete action and object: 'Fillet edges of a shaped Part object.' Edge-selection formats and validation behavior clarify what this tool does, but the description does not explicitly distinguish it from close siblings like partdesign_fillet or chamfer_edges.

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 for its options: per_edge is recommended for 'geometry already known to be blend-hostile' and allow_partial changes abort behavior. However, it never states when a user should prefer a sibling tool or when fillet_edges should not be used.

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

fit_checkFit CheckA
Read-only

Classify a hole/shaft pair. hole and shaft are {nominal, plus, minus} (signed deviations) or {nominal, tol}. Returns {fit_class:'clearance'| 'transition'|'interference', min_clearance, max_clearance, nominal_clearance, prob_interference} (prob from a normal model with half-band = 3-sigma).

ParametersJSON Schema
NameRequiredDescriptionDefault
holeYes
shaftYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations include readOnlyHint=true, so the read-only nature is covered. The description adds valuable context beyond annotations by disclosing the output schema (complete list of fields) and the probabilistic model (normal, half-band = 3-sigma). No contradictory information; the description enriches the behavioral profile without restating the annotation.

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 compact, two sentences, with the purpose front-loaded. It packs input format and output details efficiently without verbosity or repetition. Every word adds value.

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?

Given there is no output schema, the description fully specifies the return values and their types, and it explains the input format. It does not mention error handling or interpretation of clearances, but the core information needed to call the tool correctly is present. It is adequate for an agent to use without additional docs.

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% (parameters are empty objects), so the description carries the full burden. It specifies the structure of 'hole' and 'shaft' as {nominal, plus, minus} or {nominal, tol}, which is essential for correct invocation. This goes beyond the schema, though it omits units or precision, so it is not perfect but highly compensating.

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 ('Classify') and resource ('a hole/shaft pair'), and clearly states the output structure. It distinguishes itself from related siblings like tolerance_stackup or fit_class by being explicit about the classification logic and return fields.

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 description implies usage (classify a hole/shaft pair) but does not explicitly contrast with alternatives such as the 'fit_class' sibling or mention when not to use it. There is no guidance on selecting this over related tools like tolerance_stackup, so an agent may not know when this is the preferred tool.

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

fit_classFit ClassA
Read-only

ISO 286 limits for a fit code (e.g. 'H7/g6'), in mm. v1 covers a hole-basis H with shaft clearance letters (h, g, f, e). Returns {basic_size, fit, hole:{upper_dev,lower_dev,min,max}, shaft:{...}, fit_class, min_clearance, max_clearance, prob_interference}. Errors on an out-of-table size (>500 mm) or an unsupported code (non-H hole or interference shaft letter).

ParametersJSON Schema
NameRequiredDescriptionDefault
fitNoH7/g6
basic_sizeYes

TDQS

A3.9/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses the exact return shape, coverage limits (v1), and failure conditions. This tells an agent what will happen on unsupported inputs, which is precisely the behavioral context not present in the annotations or 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?

The description packs scope, return fields, and error behavior into two compact sentences. It is dense but every clause contributes; the only inefficiency is the long parenthetical list of outputs, which is necessary because no output schema exists.

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 no output schema, the description compensates by enumerating the returned fields and specifying error cases. It leaves minor ambiguity about the extent of basic_size values and does not discuss alternatives, but for a two-parameter lookup tool it is nearly complete.

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 the fit code format via example and units ('in mm') and implies basic_size limits through the >500 mm error condition, but it does not explicitly describe basic_size as a positive number or elaborate on the meaning of all returned fields in relation to the parameters.

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 operation as returning ISO 286 limits for a fit code and gives a concrete example ('H7/g6'), which makes the purpose unmistakable. It also scopes the supported cases (hole-basis H, clearance letters h/g/f/e), though it does not explicitly contrast it with sibling tools like fit_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?

The description implies when it applies: hole-basis H fits with shaft clearance letters h/g/f/e, and it states what triggers an error (out-of-table size >500 mm, unsupported code). However, it never names an alternative tool or says when not to use it versus siblings such as fit_check or tolerance_stackup.

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

fit_pageFit Drawing to PageA
Destructive

Auto-fit a drawing to its sheet: recentre the views so the part AND its placed dimensions sit inside the printable border (clear of the title block). The projection group's Automatic scale already sizes the part; its dimensions extend a fixed margin beyond it which can run off an edge — call this after placing dimensions to slide everything inside. margin mm is the border inset. Returns {scale, fits, envelope, border}; fits=False means the part + dims are too large even when centred (use a larger sheet).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageYes
marginNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false; the description adds behavioral context by explaining that views are recentred and the drawing is slid inside the border. It also discloses the failure condition (fits=False means the content is too large even when centred), which goes beyond the annotations.

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?

Four sentences front-load the core purpose and each sentence contributes operational detail: what is fitted, why it's needed, the margin parameter, and the return contract. The description is dense but not bloated.

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?

There is no output schema, so the description compensates by listing the return keys {scale, fits, envelope, border} and explaining the fits=False failure mode. The only material gap is the undocumented page parameter, but for a low-complexity two-parameter tool this is mostly complete.

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 carry the burden for parameters. It explains margin as 'the border inset', but the required page parameter is only named 'Page' in the schema and is not described in the prose. This leaves one required parameter underspecified.

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: 'Auto-fit a drawing to its sheet' and describes what it does—recentre views so the part and dimensions sit inside the printable border. This clearly distinguishes it from sibling drawing tools like add_projection_group or add_dimension, which have different purposes in the same workflow.

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?

Provides explicit timing guidance: 'call this after placing dimensions to slide everything inside'. It also explains the precondition that the projection group's Automatic scale sizes the part while dimensions extend beyond it, giving context for why this tool is needed. It doesn't name alternative tools, but the workflow context is clear enough.

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

fluid_propsFluid PropsA
Read-only

Thermophysical properties of a fluid at (T, P) from CoolProp's equation of state (issue #100). name is a fluid (e.g. 'water', 'air', 'R134a', 'CO2', 'nitrogen'), T_K absolute temperature [K], P_Pa pressure [Pa, default 1 atm). Returns {ok, density [kg/m³], viscosity [Pa·s], cp [J/kg·K], conductivity [W/m·K], prandtl, kinematic_viscosity [m²/s], fidelity, valid_range_ok, source, warnings, coolprop_available}. This is the DEFAULT fluid-property source behind the convection/CFD screens; explicit caller props still override. Degrades cleanly when the (opt-in) CoolProp extra is absent: air/water return ≈20 °C constants (fidelity='constant_fallback'); other fluids return {ok:false, reason, install}. CoolProp (BSD-3) is cited as the source.

ParametersJSON Schema
NameRequiredDescriptionDefault
T_KYes
P_PaNo
nameYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true and openWorldHint=false, but the description adds rich behavioral detail: the CoolProp equation-of-state source, clean degradation to constant-fallback values for air/water, and a structured error tuple for unsupported fluids. This goes well beyond what annotations convey, so the agent knows exactly how the tool behaves in different environments.

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 information-dense and front-loaded with the core purpose, but it is relatively long. Almost every sentence earns its place, including the fallback behavior and return payload, though the parenthetical '(issue #100)' is incidental and adds little for an agent selecting the tool.

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 no output schema, the description compensates by enumerating the return fields with units, explaining the fallback fidelity, and identifying the source citation. For a read-only property lookup with three parameters, this is complete enough for an agent to call it correctly and interpret results confidently.

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?

The schema has 0% description coverage, so the description must carry the meaning of the parameters. It does: 'name' is explained with fluid examples, 'T_K' is specified as absolute temperature in K, and 'P_Pa' is given as pressure in Pa with a default of 1 atm. This fully compensates for the bare schema.

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 opens with a specific verb and resource: 'Thermophysical properties of a fluid at (T, P) from CoolProp's equation of state.' It names the core inputs, example fluids, and the full return tuple, making the tool's function unmistakable. It also distinguishes its role by noting it is the 'DEFAULT fluid-property source behind the convection/CFD screens.'

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 explicitly states when this tool is used ('DEFAULT fluid-property source behind the convection/CFD screens') and when its results should not take precedence ('explicit caller props still override'). It also describes the fallback behavior when CoolProp is absent, giving an agent clear expectations about when the tool still returns useful values versus an error.

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

fracture_checkFracture CheckA
Read-only

Rate brittle fracture (LEFM): K = Y·σ·√(π·a) vs K_IC. a is crack length in mm; Y (geometry_factor) defaults 1.12 (edge crack), 1.0 for a centre crack. K_IC from the material (or override). Critical crack a_c = (K_IC/(Y·σ))²/π. Returns {k_applied_mpa_sqrt_m, k_ic_mpa_sqrt_m, geometry_factor, safety_factor, margin, critical_crack_mm, pass}; a crack past a_c gives SF<1 and margin<0.

ParametersJSON Schema
NameRequiredDescriptionDefault
materialNoSteel-1045
stress_mpaYes
crack_len_mmYes
geometry_factorNo
fracture_toughness_mpa_sqrt_mNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark it read-only, and the description adds substantial behavioral detail: the formula, the default geometry factor values for edge vs centre cracks, the material-derived K_IC with override option, and explicit pass/fail semantics via safety_factor and margin. This goes well beyond the structured metadata.

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 compact yet information-dense, front-loading the core formula before parameter details and the return payload. Every clause contributes to correct invocation or interpretation; there is no filler or repetition.

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?

There is no output schema, so documenting the exact return fields and the pass/fail condition is essential and fully handled. The formula, parameter defaults, units, and result interpretation together give an agent everything needed to call and evaluate 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%, so the description must carry the parameter meaning, and it does: σ is stress, a is crack length in mm, geometry_factor Y has documented defaults, and K_IC comes from material or override. Every parameter is given functional context beyond its name and type.

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 verb and resource: 'Rate brittle fracture (LEFM)' with the governing K vs K_IC comparison. It is clearly distinct from sibling tools like fatigue_check or plastic_collapse, and the formula and return values leave no ambiguity about what the tool computes.

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 intended use is implied by the LEFM brittle-fracture framing, but the description does not explicitly say when to use this tool versus related analysis tools such as fatigue_check, plastic_collapse, or bearing_life. No alternatives or exclusion conditions are named.

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

fsi_channel_pressureFSI Channel PressureA
Read-only

Fully-developed plane-channel pressure drop Δp = 12·μ·U·L/h² (NO solver) — the fluid load that physically sources the pressure-loaded-plate FSI anchor. For laminar flow between parallel plates a gap gap_mm apart with mean velocity velocity_m_s over length length_mm, the exact plane-Poiseuille wall pressure drop feeds fsi_plate_deflection/fsi_interface_balance as pressure_pa. The Reynolds number Re = ρ·U·h/μ flags when the laminar (exact) assumption holds (Re ≲ 1400). Default fluid is water at 20 °C (μ=1e-3 Pa·s, ρ=1000).

Returns {pressure_pa, pressure_drop_pa, reynolds, regime, velocity_m_s, wall_shear_pa, fidelity, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
gap_mmYes
mu_pa_sNo
length_mmYes
rho_kg_m3No
velocity_m_sYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses that this is an exact analytical calculation with no solver, that Reynolds number is used to flag validity, and that the output includes fidelity, warnings, and an escalate_to field. This gives the agent a clear picture of the tool's safety and limitations.

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?

Every sentence contributes: the governing formula, the FSI purpose, the laminar validity condition, fluid defaults, and the return object. The description is dense but not padded, and the core calculation is front-loaded.

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 no output schema, the description enumerates the exact return fields. It also provides the governing equation, applicability limits, parameter defaults, and downstream integration. An agent has sufficient information to invoke the tool correctly and interpret its result.

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%, so the description carries the full burden. It maps velocity_m_s, length_mm, and gap_mm to the formula, explains the physical meaning of mu_pa_s and rho_kg_m3, gives water-at-20°C defaults, and includes units. Every parameter receives meaning beyond its bare name.

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 opens with a specific calculation: fully-developed plane-channel pressure drop via an exact formula. It also names the downstream consumers (fsi_plate_deflection and fsi_interface_balance), clearly distinguishing this analytical tool from the many solver-based siblings in the 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?

The description defines the applicable regime (laminar plane-Poiseuille flow, Re ≲ 1400) and emphasizes that this is a no-solver analytical source for FSI pressure loads. It does not explicitly name alternative tools for non-laminar cases, but the validity condition and downstream coupling provide strong contextual guidance.

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

fsi_interface_balanceFSI Interface BalanceA
Read-only

Partitioned wet-interface force balance (NO solver) — the FSI analogue of the optics energy-balance gate. The fluid presses a uniform pressure_pa over the length_mm×width_mm strip, so the total traction is F = pressure·area; a converged partitioned solve must hand the solid exactly this load and the solid's support reactions must carry it (Newton's third law across the coupling surface). Pass the measured fluid_force_n (∮p·dA over the OpenFOAM wet patch) and/or solid_reaction_n (Σ ccx reaction at the clamp); the relative residual |F_fluid − R_solid|/F_fluid is the conservation error. With neither supplied it returns the reference analytic load (residual 0) the real solve closes on.

Returns {area_mm2, reference_load_n, fluid_force_n, solid_reaction_n, residual_n, relative_residual, balanced, fidelity, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
width_mmYes
length_mmYes
pressure_paYes
fluid_force_nNo
solid_reaction_nNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description aligns by stating 'NO solver' and 'returns the reference analytic load'. It adds useful behavioral context: the computation is analytic, the residual formula is given, and the no-input fallback behavior is disclosed. It does not detail every output field's meaning, but the core behavior is transparent.

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 well-organized: it front-loads the core purpose, then explains the physics, the optional inputs, and the fallback behavior. The output list is compact. It could be slightly shorter, but every sentence earns its place.

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 analytic check with 5 parameters and no output schema, the description covers the essential context: what the tool computes, how the residual is defined, what inputs are optional, and what the return object contains. It does not explain the meaning of every output field (e.g., fidelity, escalate_to), but the core usage is 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 description coverage is 0%, so the description must compensate. It explains the physical meaning of pressure_pa, length_mm, width_mm (uniform pressure over a strip, F = pressure·area), and clarifies the optional fluid_force_n and solid_reaction_n inputs. This adds real semantic value beyond the bare schema.

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 verb and resource: it performs a partitioned wet-interface force balance, computing a reference analytic load and comparing supplied fluid/solid forces. It also distinguishes itself from a solver and names its FSI analogue (optics energy-balance gate), making its role clear among many FSI 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?

The description explains when to use it: to check conservation across a partitioned FSI coupling surface, and it clarifies the optional inputs (fluid_force_n and/or solid_reaction_n) and the no-input case. It does not explicitly name alternative tools or state when not to use it, but the context is clear enough for an agent to select it appropriately.

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

fsi_plate_deflectionFSI Plate DeflectionA
Read-only

Exact small-deflection tip/centre deflection of a uniform-pressure-loaded thin plate strip (NO solver) — the closed-form twin the coupled OpenFOAM→CalculiX FSI solve (fsi_pressure_plate_submit) is gated against. The wetted strip is width_mm×length_mm; the fluid pressure pressure_pa (Pa) acts normal to it, giving the line load q = pressure·width. Section is the solid rectangle I = width·thickness³/12 unless an explicit i_mm4 is given. E from youngs_gpa or a Materials-DB material. support='cantilever' (clamped one edge): δ_tip = q·L⁴/(8·E·I), root moment q·L²/2, reaction q·L; 'clamped- clamped': centre δ = q·L⁴/(384·E·I), reaction q·L/2 each. Valid while δ ≲ thickness (small-deflection); past that escalate to an NLGEOM follower-pressure ccx solve.

Returns {support, pressure_pa, line_load_n_per_mm, total_load_n, I_mm4, tip_disp_mm, root_moment_nmm, reaction_n, max_stress_mpa, youngs_mpa, slenderness, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
i_mm4No
supportNocantilever
materialNo
width_mmYes
length_mmYes
youngs_gpaNo
pressure_paYes
thickness_mmYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true and openWorldHint=false, so the safety profile is already covered. The description adds valuable behavioral context: it is a closed-form calculation (no solver), it returns a rich result set including fidelity, band_pct, valid_range_ok, warnings, and escalate_to, and it explicitly states the validity limit (δ ≲ thickness). It does not describe failure modes or edge cases (e.g., what happens if material and youngs_gpa are both missing), but the annotations plus the validity-range disclosure carry most of the burden. A 4 is appropriate because the description adds meaningful behavioral context beyond the annotations without contradicting them.

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 well-organized: it opens with the core purpose and solver-free nature, then explains the physical model, then the support-specific formulas, then the validity limit and escalation path, and finally the return fields. Every sentence earns its place. It is longer than a typical description, but the complexity of the tool (8 parameters, two support conditions, a validity gate) justifies the length. A 4 because it is slightly long but highly structured and information-dense.

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?

Given the tool's complexity (8 parameters, two support conditions, a validity gate, and a rich return set), the description is remarkably complete. It covers the physical model, the formulas, the validity limit, the escalation path, and the return fields. There is no output schema, so the description's listing of return fields is valuable. Minor gaps: it doesn't specify units for all return fields (e.g., `line_load_n_per_mm` is clear, but `band_pct` and `fidelity` are not explained), and it doesn't state what happens if both `youngs_gpa` and `material` are omitted. These are small gaps against an otherwise thorough description, so a 4 is fair.

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 does: it explains the physical meaning of `pressure_pa` (fluid pressure acting normal to the strip, giving line load q = pressure·width), `width_mm`×`length_mm` as the wetted strip, `i_mm4` as an explicit second moment of area overriding the default I = width·thickness³/12, `youngs_gpa` or `material` as E sources, and `support` with its two enum-like values ('cantilever' and 'clamped-clamped') and their formulas. This is substantial semantic enrichment. It doesn't document every parameter (e.g., `thickness_mm` is implied but not explicitly described), but the coverage is strong enough for a 4.

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 verb ('deflection'), a precise resource ('thin plate strip'), and the exact scope ('small-deflection tip/centre deflection of a uniform-pressure-loaded thin plate strip'). It explicitly distinguishes itself from the coupled FSI solve by naming the sibling tool `fsi_pressure_plate_submit` and positioning itself as the closed-form twin. This is a clear, specific, and well-differentiated purpose.

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 explicitly states when to use this tool: for exact small-deflection closed-form results without a solver, and when to escalate: 'past that escalate to an NLGEOM follower-pressure ccx solve.' It also names the alternative tool (`fsi_pressure_plate_submit`) and frames this tool as the gating check. This is explicit when/when-not guidance with a named alternative.

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

fsi_pressure_plate_submitFSI Pressure Plate SubmitA

Partitioned fluid-structure-interaction solve on the preCICE OpenFOAM↔ CalculiX stack, asynchronous (OFF the MCP channel) — the real coupled-field twin of the analytic fsi_plate_deflection / fsi_interface_balance oracles. A flexible flap clamped at a channel floor deflects under the flow: OpenFOAM (pimpleFoam) writes the wet-interface Force, ccx_preCICE returns the Displacement, and preCICE drives the implicit coupling to convergence each time window. preCICE is LGPL-3.0 and the two heavy solvers run ONLY as subprocesses; degrades to {ok:false, reason, install, stack} when the stack is absent (build via scripts/install-solvers.sh fsi).

Physics knobs: inlet_velocity_m_s, nu_m2_s, rho_kg_m3 (fluid), youngs_pa/poisson/density_kg_m3 (solid), end_time_s/time_window_s/ max_iterations (coupling). Geometry/mesh come from the validated vendored template (no FreeCAD touch). Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result for {ok, time_windows, tip_disp_m, tip_history, coupling_converged, case_dir} — the tip displacement is the field the fsi_plate_deflection oracle gates.

ParametersJSON Schema
NameRequiredDescriptionDefault
nu_m2_sNo
poissonNo
timeoutNo
rho_kg_m3No
youngs_paNo
end_time_sNo
density_kg_m3No
time_window_sNo
max_iterationsNo
inlet_velocity_m_sNo

TDQS

A4.6/5.0
Behavior5/5

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

The description reveals substantial behavior beyond annotations: the tool is asynchronous (off MCP channel), solvers run only as subprocesses, preCICE licensing is stated, and the tool degrades to an error dict when the solver stack is missing. None of these are in the annotations, so this description earns high marks for 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 long but dense and information-rich. It is front-loaded with the core purpose and differentiates the tool from siblings before diving into physics details. Every sentence contributes, though the license information and some implementation detail is borderline; no filler is present.

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?

Given that the tool has no output schema and minimal annotations, the description carries the burden of explaining return values and runtime behavior. It covers the degradation dict, the job_id/status/cache_hit return, the poll-able result structure, and the install path, making it complete enough for agents to call the tool correctly.

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?

Although the schema has 0% description coverage, the description compensates by grouping parameters into fluid, solid, and coupling categories, and clarifies that geometry is fixed. The only noticeable gap is that `timeout` is not mentioned at all, so a complete parameter map is not provided.

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 clearly states the tool performs a partitioned fluid-structure-interaction solve on the preCICE OpenFOAM↔CalculiX stack. It is explicitly labeled the 'real coupled-field twin' of the analytic fsi_plate_deflection / fsi_interface_balance oracles, which differentiates it from the main alternative 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?

The description gives clear context: this is the asynchronous, high-fidelity dual of the analytic oracles and must be paired with job_result polling. It does not explicitly state 'use X instead of Y when ...', so it lacks a hard exclusion criterion, but the twin/oracle contrast makes the intended usage reasonably clear.

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

gdt_checkGD&T CheckA
Read-only

Check a measured feature against a GD&T tolerance zone. control: position | flatness | straightness | circularity | cylindricity | perpendicularity | parallelism | angularity | concentricity | runout | total_runout | profile_line | profile_surface. actual is the measured deviation; for position pass offset={x,y} to use the diametral 2*hypot(x,y). mmc_bonus adds bonus tolerance. Returns {control, zone, effective_zone, actual, margin, pass, datum_refs}.

ParametersJSON Schema
NameRequiredDescriptionDefault
zoneYes
actualNo
offsetNo
controlYes
mmc_bonusNo
datum_refsNo

TDQS

A3.5/5.0
Behavior3/5

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

Annotations declare readOnlyHint=true and openWorldHint=false, so the agent knows this is a safe read-only calculation. The description adds useful behavioral details: how position offset works (diametral 2*hypot(x,y)), mmc_bonus adds bonus tolerance, and the return object shape. It doesn't disclose edge cases like what happens when actual is null or how datum_refs are used, but the core behavior is transparent.

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 compact and information-dense, front-loading the purpose and then listing controls and key parameter semantics. The control list is long but necessary for a tool with no enums in the schema. The return shape is stated in one line. Slightly dense but efficient.

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 read-only calculation tool with no output schema, the description covers the main inputs and return shape. However, it doesn't explain what 'zone' means precisely, how datum_refs affect the check, or what happens when actual is null. Given the tool's complexity (GD&T logic), a bit more context on interpretation of pass/margin would help, but the essentials are present.

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 does: it explains control (the GD&T control type), actual (measured deviation), offset (for position, pass {x,y} for diametral 2*hypot(x,y)), mmc_bonus (adds bonus tolerance), and the return fields. It doesn't explain zone or datum_refs in detail, but the core parameters are semantically enriched beyond the bare 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?

The description clearly states the tool checks a measured feature against a GD&T tolerance zone, with a specific verb ('Check') and resource ('measured feature against a GD&T tolerance zone'). It lists the supported control types, which distinguishes it from generic analysis tools. However, it doesn't explicitly differentiate from sibling tools like tolerance_stackup or fit_check, though the GD&T focus is fairly specific.

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 description implies usage: it's for checking a measured feature against a tolerance zone, and the control list tells the agent which GD&T controls are supported. It doesn't explicitly state when to use this vs alternatives like tolerance_stackup or fit_check, nor does it mention prerequisites (e.g., needing a measured feature or datum references). The context is clear enough for a domain-aware agent but lacks explicit routing guidance.

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

gear_ratingGear RatingA
Read-only

Rate spur-gear tooth bending (Lewis): sigma=Ft/(bmY). Pass tangential_force_n, or power_w + pinion_speed_rpm. Returns {tangential_force_n, pitch_dia_mm, pitch_line_velocity_m_s, lewis_form_factor, bending_stress_mpa, allowable_bending_mpa, bending_sf, pass}. First-order screen, not full AGMA. The allowable defaults to the material's fatigue endurance (else 0.3·UTS); allowable_bending_mpa overrides it with an AGMA/spec number.

ParametersJSON Schema
NameRequiredDescriptionDefault
teethYes
power_wNo
materialNoSteel-4140-QT
module_mmYes
face_width_mmYes
pinion_speed_rpmNo
lewis_form_factorNo
tangential_force_nNo
allowable_bending_mpaNo

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the readOnlyHint, the description discloses the underlying model formula, the default allowable rule ('defaults to the material's fatigue endurance (else 0.3·UTS)'), the override behavior of allowable_bending_mpa, and the limitation that this is not a full AGMA analysis. It also enumerates the return fields, giving the agent a clear behavioral picture.

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?

Three dense sentences, with the formula front-loaded, followed by inputs, outputs, and limitations. No filler; every clause contributes 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 9-parameter engineering tool with no output schema and no parameter descriptions, this text supplies the formula, output keys, default behavior, and model limitations. It leaves a few edge details implicit—such as explicit units and what happens if both tangential_force_n and power_w+pinion_speed_rpm are supplied—so it is strong but not fully exhaustive.

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?

With 0% schema description coverage, the description compensates well by defining the formula variables and explaining the key input alternatives: tangential_force_n vs power_w + pinion_speed_rpm, plus the allowable_bending_mpa override. However, a few parameters such as teeth, module_mm, and the input role of lewis_form_factor are only implicit.

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 specific verb and resource ('Rate spur-gear tooth bending (Lewis)') and reinforces it with the Lewis formula and pass/fail output, so an agent can tell this is a gear bending rating calculation. It does not explicitly name a sibling or alternative tool, which keeps it from a 5.

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 concrete input-combination guidance: 'Pass tangential_force_n, or power_w + pinion_speed_rpm,' and states the model's boundary with 'First-order screen, not full AGMA.' It does not explicitly point to an alternative sibling tool, but the usage context is clear enough for selection.

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

get_interfaceGet InterfaceA
Read-only

Read back a single published interface FRAME by name from a component (issue #139). The reference-by-name primitive feature templates ride on: an unpublished name fails loudly. Returns {handle, name, frame}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
handleYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds a very actionable behavioral detail: an unpublished name 'fails loudly'. It also states that the return payload is {handle, name, frame}, a clause beyond the annotations. This provides extra transparency that helps an agent anticipate failure modes and success output.

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 three short sentences with mostly valuable content; the issue number and the awkward phrase 'reference-by-name primitive feature tokens ride on' introduce some noise but the core purpose, failure mode, and return shape are front-loaded. It is compact and the main information appears in the first sentence.

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 tool that has only two required primitive parameters, no output schema, and no nested objects, the description gives the essential contract: it reads a single published interface, names the failure case, and declares the return object. It leaves some room for interpretation around the 'frame' type, but the tool's core API is sufficiently documented for safe invocation.

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?

The input schema has no parameter descriptions (0% coverage), and the description adds only the context that the interface is read 'by name from a component'. This clearly implies 'name' is the frame name and 'handle' identifies the component, but the description does not explicitly tie each property to its role, nor does it explain the format or constraints. It is iterated enough for knowledgeable agents but does not fully dart the parameters.

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 names a specific verb ('Read back'), a precise resource ('single published interface FRAME'), and a lookup key ('by name'), which clearly distinguishes it from writing/baking alternatives like publish_interface. The read intent is unambiguous and the tool's scope is tightly defined.

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 description implies this tool is meant for reading by name from a component and that unpublished names fail loudly, but it does not explicitly state when to prefer this tool over sibling read tools or casting operations. There is no 'use this when' or alternative compensation, so the agent must infer the appropriate context. Only also mention of 'reference-by-name primitive feature templates' is a faint clue to one use case.

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

get_objectGet ObjectA
Read-only

Dump a handle's properties + shape stats. Useful when no dedicated tool exposes what you need.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes

TDQS

A3.5/5.0
Behavior3/5

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

The readOnlyHint annotation already signals this is a read operation, lowering the burden on the description. The description adds a bit of return behavior by saying it dumps properties and shape stats, but it does not explain output format, failure behavior, or whether the shape stats are computed live. No contradiction with annotations.

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?

Two short sentences deliver the core purpose and usage context with no filler. The main action is front-loaded, and every word earns its place.

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?

Given a simple read-only tool with one parameter and annotations covering safety, the description is close to adequate. However, with no output schema, it leaves 'properties' and 'shape stats' undefined and does not mention error conditions or whether a valid handle is required, so some information is missing.

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?

With 0% schema description coverage, the description must compensate for the lone 'handle' parameter, but it only repeats the word handle without explaining what a handle is, how to obtain one, or what object types are accepted. This is minimal guidance at best.

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 action ('Dump') and a resource ('a handle's properties + shape stats'), making the tool's function clear. It partially distinguishes from the large sibling set by framing itself as a fallback when no dedicated tool exists, though it does not name any sibling.

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?

'Useful when no dedicated tool exposes what you need' gives a clear condition for when to use the tool. It does not explicitly enumerate alternatives or exclusions, but the fallback framing provides adequate selection guidance.

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

granular_screenGranular ScreenA
Read-only

Closed-form granular/powder-mechanics oracles — banded correlations, NO external solver (the FreeCAD-free analytic twins the YADE DEM solve is gated against). These are correlations, not exact theory, so each returns fidelity='correlation' + an honest [low, high] band; the band IS the oracle. Dispatch on problem:

'packing' (regime='random_close'|'random_loose'|'fcc'[, coordination]) — monodisperse sphere solid-volume fraction φ. RCP ≈ 0.637 (band 0.60–0.66), the random pile a real settle must hit, well below the crystalline FCC/HCP 0.7405. 'beverloo' (outlet_m, particle_d_m[, bulk_density_kg_m3 | material]) — flat-bottom hopper discharge W = C·ρ·√g·(D−k·d)^2.5 [kg/s]; flow ∝ outlet to the 2.5 power, independent of fill height. 'beverloo_exponent' (outlet1_m, flow1_kg_s, outlet2_m, flow2_kg_s [, particle_d_m]) — recover the log-log flow exponent from two (outlet, flow) points; granular 2.5 (band 2.2–2.8) vs Torricelli 2.0. 'repose' (friction_coeff[, saturation]) — poured-pile repose angle θ ≈ atan(μ) + ±25% band. 'repose_monotone' (mu_low, repose_low_deg, mu_high, repose_high_deg) — the steeper-with-friction monotonicity gate.

SI units (m, kg/m³, kg/s, degrees). Escalate to dem_pack_submit / dem_flow_submit (the real YADE solve) for polydisperse mixes, non-spherical grains, cohesion, or geometry this monodisperse idealization can't see.

ParametersJSON Schema
NameRequiredDescriptionDefault
mu_lowNo
regimeNorandom_close
mu_highNo
problemNopacking
materialNo
outlet_mNo
outlet1_mNo
outlet2_mNo
flow1_kg_sNo
flow2_kg_sNo
saturationNo
coordinationNo
particle_d_mNo
friction_coeffNo
repose_low_degNo
repose_high_degNo
bulk_density_kg_m3No

TDQS

A5/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and openWorldHint=false, but the description goes further by disclosing that each result includes fidelity='correlation' and an honest [low, high] band, that the band IS the oracle, and that these are not exact solutions. It also clarifies the idealized monodisperse scope and the lack of an external solver.

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?

Despite being long, the description is tightly packed: it front-loads the core nature ('Closed-form granular/powder-mechanics oracles'), then uses a clear dispatch structure for each mode. Every sentence contributes either semantics, units, formulas, or escalation guidance, so the 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.

Completeness5/5

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

With 17 parameters, no output schema, and minimal annotations, this description provides a remarkably complete picture: modes, formulas, parameter requirements, bands, units, and escalation path. It even states the return convention (fidelity and a low/high band), making the tool callable with little ambiguity.

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 carries the full burden, and it succeeds. It maps each `problem` dispatch to the relevant parameters, gives formulas, units, and example values (e.g., RCP ≈ 0.637, FCC/HCP 0.7405), and explains what each mode computes. This is essential value beyond the bare schema.

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 purpose: closed-form granular/powder-mechanics correlations with banded uncertainty estimates. It clearly distinguishes itself from the DEM/YADE solvers by naming the analytic twin nature and listing exact dispatch modes ('packing', 'beverloo', 'beverloo_exponent', 'repose', 'repose_monotone').

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 explicitly tells the agent when to use this tool versus alternatives: 'Escalate to dem_pack_submit / dem_flow_submit (the real YADE solve) for polydisperse mixes, non-spherical grains, cohesion, or geometry this monodisperse idealization can't see.' It also explains that this is a screening/correlation tool, not exact theory.

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

grid_convergenceGrid ConvergenceA
Read-only

Grid Convergence Index — how much of a solved number is the MESH (no solver, milliseconds). Give it the same quantity solved on 2-3 systematically refined meshes, FINEST FIRST, and it fits the observed order of convergence, Richardson-extrapolates to zero cell size, and returns the percentage band inside which the mesh-independent answer lies. Roache's GCI as codified in ASME V&V 20.

This is the honest band_pct for a result with no analytic oracle — the verification counterpart to every validation ratio in the solver families — and it is deliberately family-agnostic: three CFD drag coefficients, three FEM peak stresses and three modal frequencies are all valid input; only you know what the mesh size means. cfd_mesh_independence_submit is the driver that produces the three CFD values for you.

Describe the meshes with either cell_sizes (representative cell length, same order as values) or cell_counts (total cells; h = N^(-1/dimensions)). With THREE values the order is measured and the safety factor is 1.25; with TWO it must be assumed (assumed_order, default 2.0) and the factor triples to 3.0 — a much wider band, which is the honest price of the missing mesh.

Watch three fields before quoting the band: monotonic False means the solutions oscillate and the extrapolation is not meaningful (usually an unconverged level, not a mesh effect); asymptotic_ratio far from 1 means the meshes have not reached the range where the theory holds, so gci_pct is a LOWER bound; order_clamped True means the fitted order was unphysical and a clamped one was used.

Returns {n_levels, values, cell_sizes, refinement_ratios, observed_order, order_used, order_clamped, extrapolated_value, gci_pct, gci_coarse_pct, band_pct, relative_error_pct, monotonic, asymptotic_ratio, safety_factor, converged_fit, fidelity, warnings}.

ParametersJSON Schema
NameRequiredDescriptionDefault
valuesYes
cell_sizesNo
dimensionsNo
cell_countsNo
assumed_orderNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only state readOnlyHint/openWorldHint; the description discloses substantial behavioral nuances: no solver/milliseconds, assumed vs measured order, safety factors, clamping, lower-bound behavior, and monotonicity caveats. It also clarifies the returned band is an honest estimate without an analytical oracle.

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 long but front-loaded and every section earns its place: definition, inputs, caveats, and return fields. It could be slightly tightened, but for a complex numerical tool with no output schema the level of detail is justified.

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 no output schema and bare input schema, the description is self-sufficient: it specifies mesh order, mesh-size meanings, two/three-mesh behavior, quality flags to inspect, and the complete return field list. No critical calling context 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?

Despite 0% schema description coverage, the description explains every parameter: values as the same quantity on 2-3 meshes, cell_sizes vs cell_counts semantics including the h=N^(-1/dimensions) relation, and assumed_order. This fully compensates for the bare schema.

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 names a specific computation (Grid Convergence Index/Richardson extrapolation) with concrete output (band_pct, gci_pct), and distinguishes it from solver families as a verification tool. The opening sentence and 'no solver' signal make its role unmistakable among hundreds of sibling tools.

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 explicitly says to feed 2-3 systematically refined meshes, finest first, and contrasts it with cfd_mesh_independence_submit, which produces the input CFD values. It also gives conditional guidance for two vs three meshes and when the band is untrustworthy (monotonic false, asymptotic_ratio far from 1, order_clamped true).

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

harmonic_responseHarmonic ResponseA
Read-only

Exact SDOF harmonic frequency response (NO solver) — the FRF screen and the oracle the Elmer harmonic_response_submit sweep is gated against. Bridges beam_modal (f_n) and random_vibration (Q = 1/(2ζ)): with r = f/f_n, |H| = 1/√((1−r²)²+(2ζr)²), phase = atan2(2ζr, 1−r²), peak amplification Q = 1/(2ζ√(1−ζ²)) at f_peak = f_n·√(1−2ζ²), half-power bandwidth ≈ 2ζ·f_n. With frequency_hz the response at that drive is returned; static_deflection_mm scales it to an absolute amplitude_mm. fidelity='exact'; ζ ≥ 1/√2 has no peak (flagged). Escalate to harmonic_response_submit for a real meshed FRF (multi-mode, geometry-true).

Returns {natural_frequency_hz, damping_ratio, q_factor, f_peak_hz, half_power_bandwidth_hz, frequency_ratio, amplification, phase_deg, amplitude_mm, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
frequency_hzNo
damping_ratioYes
natural_frequency_hzYes
static_deflection_mmNo

TDQS

A4.9/5.0
Behavior5/5

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

The annotations only say readOnlyHint=true, so the description carries the burden of explaining behavior. It adds substantial context: no solver, exact analytic formulas, the no-peak condition for ζ ≥ 1/√2, optional frequency scaling with `frequency_hz`, and absolute amplitude scaling via `static_deflection_mm`. No contradiction with annotations.

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 structured: a one-line summary, formula block, condition, escalation note, and return field list. Every section earns its place for an exact-spec oracle, though the formula-heavy middle could be slightly trimmed without losing core meaning.

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?

Despite having no output schema, the description enumerates all return fields including validity flags and escalation hints. It also covers limits, the exact fidelity mode, the no-peak edge case, and the relationship to the meshed sibling tool, so an agent has what it needs to call and interpret the 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%, so the description must compensate. It maps `frequency_hz` and `static_deflection_mm` to concrete behavior, uses `natural_frequency_hz` and `damping_ratio` in the formulas, and clarifies units through parameter names and output fields. This is far more than the bare schema provides.

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 opens with a specific verb and resource: 'Exact SDOF harmonic frequency response (NO solver)'. It clearly distinguishes the tool from `harmonic_response_submit` by calling this one an analytic oracle rather than a meshed solver, so an agent can tell them apart immediately.

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 explicitly says to escalate to `harmonic_response_submit` for a real meshed, multi-mode FRF and explains how this tool bridges `beam_modal` and `random_vibration`. That gives clear when-to-use and when-not-to-use guidance with named alternatives.

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

harmonic_response_submitHarmonic Response SubmitA
Destructive

Harmonic forced response (FRF) via Elmer StressSolve Harmonic Analysis (SIMULATION_NEXT Tier B2), asynchronous — a plane-stress cantilever driven by a harmonic tip traction, swept one quasi-static point + n_sweep points across ±span_pct% of its first resonance, with Rayleigh β tuned to damping_ratio at f₁. Requires ElmerSolver; when absent this returns {ok:false, reason, install} rather than raising.

Three gates from the in-phase (real) response: f1_ratio — Re(H) = 0 exactly AT resonance, so the swept tip response's sign-flip locates f₁ vs the Euler-Bernoulli beam_modal closed form (within ~2%, plane-stress vs beam theory); static_ratio — the quasi-static point vs the exact tip compliance F·L³/(3EI) (within ~5%); q_ratio — max|Re|/static vs Q/2 = 1/(4ζ), the exact SDOF light-damping identity (within ~15%, sweep-sampled). Cross-links harmonic_response (the SDOF oracle) and random_vibration (same Q). Also accepts a prepared case_dir.

Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for {ok, f1_solved_hz, f1_eb_hz, f1_ratio, static_solved_m, static_exact_m, static_ratio, peak_over_static, q_factor, q_ratio, frf:[[f_hz, tip_re_m]], case_dir}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nxNo
nyNo
sifNocase.sif
n_sweepNo
poissonNo
case_dirNo
height_mNo
length_mNo
span_pctNo
youngs_paNo
traction_paNo
damping_ratioNo
density_kg_m3No

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, the description discloses asynchronous submission, dependency failure behavior, three validation gates with expected tolerances, and the exact return/polling structure. It adds substantial behavioral context and does not contradict the annotations.

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 information-rich, with the main purpose front-loaded and every sentence adding either behavioral, validation, or return-value detail. It is long, but not wasteful; no filler is present.

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?

Given the tool's complexity and lack of an output schema, the description is notably complete: it explains what simulation is run, what external resources are required, which validation metrics are produced, how to poll results, and the exact keys returned in the final job result.

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 n_sweep, span_pct, damping_ratio, and case_dir meaningfully, but leaves the remaining nine parameters to be inferred from names/defaults. This is partial compensation rather than complete coverage.

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 clearly identifies the tool as a harmonic forced response (FRF) analysis via Elmer StressSolve Harmonic Analysis, with a specific plane-stress cantilever setup and swept-frequency approach. It also distinguishes itself from related siblings by cross-linking harmonic_response (the SDOF oracle) and random_vibration (same Q).

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 description states the external requirement (ElmerSolver), the fallback behavior when it is absent, the asynchronous polling path via job_result, and the optional case_dir input. It does not give an explicit 'use this instead of X' rule, but the context makes the intended usage clear enough.

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

helixHelixA

Generate a Part::Helix curve. radius, pitch, height in mm. angle (deg) is the cone angle (0 = cylindrical helix, >0 = conical).

Returns a handle to a 1D helical curve. To get a 3D helical solid (e.g. for threads), use the curve as the spine of a sweep.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoHelix
angleNo
pitchNo
heightNo
radiusNo

TDQS

A4.3/5.0
Behavior3/5

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

Annotations indicate the tool is not read-only and not destructive, and the description adds that it returns a handle to a 1D curve. However, it does not disclose side effects such as whether a new object is added to the active document or how it interacts with the current modeling context.

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 compact and front-loaded: it states what the tool does, defines parameters and units, then gives the key usage note about sweeping. Every sentence carries useful information with no filler.

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 tool with five parameters, no output schema, and sparse annotations, the description covers the essential purpose, parameter units, angle semantics, return type, and how to use the result for a solid helix. This is sufficient for an agent to select and call the tool correctly.

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 well by defining radius, pitch, and height in mm, and explaining that angle is the cone angle in degrees with 0 meaning cylindrical and >0 meaning conical. Only the 'name' parameter is left undocumented, which is conventional.

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 opens with 'Generate a Part::Helix curve', which is a specific verb + resource. It distinguishes this from sibling curve/solid tools by stating it produces a 1D helical curve rather than a solid.

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 description explains that the result is a 1D curve and that to obtain a 3D helical solid, such as threads, the curve should be used as the spine of a sweep. This gives clear contextual guidance, though it does not explicitly name alternative tools like add_thread.

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

hertz_contactHertz ContactA
Read-only

Exact Hertzian point-contact peak pressure (NO solver) — the screening twin of a frictional CONTACT PAIR solve. Sphere of radius_mm on a flat (default) or on a second sphere radius2_mm (negative for a conforming socket). Each body's elastics from youngs#_gpa+poisson# or a Materials-DB material#; body 2 defaults to body 1. Reduced modulus 1/E = (1−ν₁²)/E₁ + (1−ν₂²)/E₂, effective radius 1/R = 1/R₁ + 1/R₂; contact radius a = (3FR/4E*)^(1/3), peak pressure p₀ = 3F/(2πa²) = 1.5× mean, approach δ = a²/R. Half-space theory: valid while a ≪ R and p₀ below first sub-surface yield (~1.6·σ_y) — past that escalate to the nonlinear fem_set_nonlinear_material contact path.

Returns {e_star_mpa, effective_radius_mm, contact_radius_mm, peak_pressure_mpa, mean_pressure_mpa, approach_mm, a_over_R, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
load_nYes
poisson1No
poisson2No
material1No
material2No
radius_mmYes
radius2_mmNo
youngs1_gpaNo
youngs2_gpaNo

TDQS

A4.8/5.0
Behavior5/5

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

The description discloses the closed-form equations used, effective radius/reduced modulus conventions, half-space validity limits, and the exact return dictionary keys. Since annotations only provide readOnlyHint, this text carries and fully satisfies the transparency burden.

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 text is dense but purposeful: identity and scope are front-loaded, formulas carry real information, and the output list saves the agent from guessing return values. It is longer than average, but that length is justified by the tool's physics complexity.

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?

Given no output schema and no parameter descriptions, the definition still covers inputs, geometry/loading, material selection, governing equations, validity limits, escalation path, and all return keys. The only omissions are minor default/precedence details that do not materially compromise the agent's ability to invoke it.

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?

With 0% schema parameter coverage, the description explains `radius_mm`, negative `radius2_mm` for conforming sockets, `youngs#_gpa`/`poisson#` vs `material#`, and body-2-defaulting-to-body-1. It leaves a small gap: body-1 material defaults and precedence when both elastic property groups are provided are not stated.

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 opening sentence names the exact computation: 'Exact Hertzian point-contact peak pressure' with explicit '(NO solver)', and identifies it as the screening twin of a frictional CONTACT PAIR solve. This clearly distinguishes it from the nonlinear/FEM path and other analysis tools.

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 provides an explicit validity boundary: valid while a≪R and p0 below first sub-surface yield, and says to 'escalate to the nonlinear fem_set_nonlinear_material contact path' beyond that. This tells an agent when to use the screening tool versus a heavier solver.

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

h_estimateHeat Transfer Coefficient EstimateA
Read-only

Screening convection coefficient h (NO solver) — the honest h_conv to feed thermal_lumped / thermal_transient_1d / a convection BC, instead of a guess. geometry picks the correlation: natural (velocity_m_s = 0) 'vertical_plate' | 'horizontal_cylinder' (Churchill–Chu); forced (velocity_m_s > 0) 'flat_plate' (averaged laminar/mixed Nu) | 'cylinder_crossflow' (Hilpert). characteristic_mm is the plate height/length or cylinder diameter. Film-temp air properties built in; another fluid needs explicit k_w_mk + nu_m2_s + pr (+ beta_per_k for natural). emissivity > 0 adds the linearized radiation screen into h_total_w_m2k.

This is a focusing estimate, not a gate: fidelity='correlation' with band_pct the literature scatter (±15–20 %). Escalate to the conjugate solve cht_channel_submit (or a meshed convection BC via thermal_transient_submit) when the thermal margin is within ~2× band_pct. Returns {geometry, mode, correlation, h_conv_w_m2k, h_rad_w_m2k, h_total_w_m2k, nusselt, reynolds, rayleigh, prandtl, film_temp_c, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
prNo
fluidNoair
k_w_mkNo
nu_m2_sNo
geometryYes
beta_per_kNo
emissivityNo
t_ambient_cNo
t_surface_cYes
velocity_m_sNo
characteristic_mmYes

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint annotation by disclosing that this is 'NO solver', a 'focusing estimate, not a gate', with correlation-level fidelity and ±15–20% scatter. It also discloses the return payload and escalation behavior, giving the agent a realistic picture of the tool's limits.

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 dense but front-loaded: it opens with the core purpose and distinction, then systematically covers geometry, parameters, escalation, and return values. Every sentence contributes useful information, and the return-field list is justified because no output schema exists.

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 screening tool with 11 parameters, no output schema, and no enum constraints, this description covers the physical correlations, parameter semantics, built-in fluid properties, radiation option, fidelity, escalation path, and return shape. An agent has enough context to call it correctly and interpret results.

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?

With 0% schema description coverage, the description compensates strongly: it explains geometry correlation selection, characteristic_mm meaning, natural vs forced velocity modes, required fluid properties for non-air fluids, and emissivity's radiation contribution. Only t_surface_c and t_ambient_c are left to self-evident naming, so a near-perfect but not exhaustive score is appropriate.

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: 'Screening convection coefficient h (NO solver)'. It explicitly differentiates itself from solver siblings like cht_channel_submit and thermal_transient_submit by framing itself as the 'honest h_conv to feed' those tools, making its role clear.

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 when-to-use and when-not-to-use guidance: use as a screening estimate instead of a guess, and escalate to cht_channel_submit or thermal_transient_submit when the thermal margin is within ~2× band_pct. This names the alternatives and the condition that selects them.

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

holeHoleA

Drill a parametric Hole from a sketch (one or more circles).

sketch: handle of a sketch placed on a face of an existing body feature. depth_type: 'Dimension' (use depth) or 'ThroughAll'. cut_type: 'None' | 'Counterbore' | 'Countersink' | 'Counterdrill'. When non-None, cut_diameter (head clearance) and cut_depth apply. threaded=True applies a tap. thread_type / thread_size are COUPLED enums — valid thread_size values DEPEND on thread_type ('M4' fits 'ISOMetricProfile' but not 'UNC'). Use list_thread_options() to discover thread_type values and list_thread_options(thread_type=...) for that type's valid sizes. intended_for ('print'|'machine'|'drawing'): drives ModelThread default when threaded=True so the caller doesn't have to know what ModelThread means. print → ModelThread=True. Required for 3D-printed threaded holes — the screw must engage the printed thread geometry; a smooth pilot won't tap itself. machine → ModelThread=False. CAM software reads thread metadata and drives a physical tap. Modeling thread bloats files and fights patterns/fillets. drawing → ModelThread=False. Drawings annotate threads symbolically. Explicit model_thread overrides intended_for. through ('wall'|'body'): preferred over depth_type/depth. 'wall' ray-casts to the first exit boundary and drills exactly one wall thick — critical on shelled bodies where 'body' (ThroughAll) would destroy the cavity. Implies direction='into_body'. Result carries wall_depth_mm. direction (preferred over reversed): 'into_body' picks the Reversed value that actually removes material; 'away_from_body' picks the value that removes none. Hole and Pocket interpret the raw flag differently. reversed: legacy raw flag, used only if neither through nor direction is set. strict: raise instead of warning on a degenerate hole (see below).

Returns {handle, name, volume, removed_volume, volume_ratio}, plus warnings ONLY when the hole consumed the whole body or removed nothing (the same two degenerate outcomes as boolean_op's cut). Warn-don't-fail is the default; pass strict=True in a scripted recipe to turn both into an error instead. direction='away_from_body' is an explicit request to remove nothing, so it never warns and never raises.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoHole
depthNo
sketchYes
strictNo
throughNo
cut_typeNoNone
diameterNo
reversedNo
threadedNo
cut_depthNo
directionNo
depth_typeNoThroughAll
thread_sizeNo
thread_typeNo
cut_diameterNo
intended_forNo
model_threadNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations are minimal (destructiveHint: false), so the description carries the full burden, and it excels. It discloses that direction='away_from_body' removes no material and that reversed is a legacy raw flag that differs between Hole and Pocket. It explains that 'through=wall' ray-casts to the first exit boundary and drills exactly one wall thick, critical behavior. It details the degenerate outcomes (consumed whole body or removed nothing) and the strict vs warn-don't-fail behavior, which is beyond annotations. No contradiction with annotations.

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 lengthy but well-structured with a header line and parameter definitions in a clear list format, making it easy to scan. It is front-loaded with the core purpose and then details each parameter in order. While it is very detailed, each sentence provides valuable information and earns its place—there is minimal filler. It is longer than ideal for conciseness but the structure compensates, so a 4 is appropriate.

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 tool with 17 parameters and no output schema, the description is exceptionally complete. It explains the return value structure (handle, name, volume, removed_volume, volume_ratio, plus warnings) despite no output schema, which is a quality addition. It covers parameters that are not self-evident from the schema (e.g., strict, through, direction, intended_for) and provides usage guidance that would prevent common errors. The description is a comprehensive manual for the 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 description coverage is 0%, and the description compensates fully. It explains the meaning of depth_type ('Dimension' vs 'ThroughAll'), cut_type ('None' | 'Counterbore' | 'Countersink' | 'Counterdrill'), and how cut_diameter/cut_depth apply when non-None. It clarifies the coupled enums thread_type/thread_size and that valid values depend on each other (e.g., 'M4' fits 'ISOMetricProfile' but not 'UNC'). It interprets intended_for's values ('print' → ModelThread=True, 'machine'/'drawing' → False) and explains that 'through' and 'direction' override depth_type/depth/reversed.

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?

Clearly states it drills a parametric hole from a sketch (one or more circles), with an explicit verb ('Drill') and resource ('a parametric Hole from a sketch'). It distinguishes from siblings like 'pocket' (different operation) and 'boolean_op' (more general) by specifying 'parametric Hole' and the sketch-based input. The description goes beyond the title and schema to clarify that the sketch must be placed on a face of an existing body feature, which is a specific prerequisite.

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?

Provides extensive guidance on when to use specific parameters: through is 'preferred over depth_type/depth' and crucial for shelled bodies; direction is 'preferred over reversed'; intended_for is described with explicit use cases (print vs machine vs drawing) and alternatives (list_thread_options is named for discovering thread enums). It clearly states when to use 'through' versus 'depth_type' and when to use 'intended_for' versus manual thread settings. Exclusions are implied by naming alternatives like list_thread_options.

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

impact_dynamics_submitImpact Dynamics SubmitA

Transient DROP / IMPACT dynamics — the solve drop_impact escalates to. Meshes body, flies it at velocity_m_s (or the free-fall speed of drop_height_mm — exactly one) along direction into a fixed rigid floor through penalty contact, and integrates the motion with CalculiX *DYNAMIC. Async: returns a job — poll job_result. Degrades to {ok:false, reason, install} when ccx is absent.

direction is the way the part TRAVELS: '-z' (default), '+x', … or any 3-vector — [-1,-1,-1] is a corner drop (the floor turns, the part is not re-meshed). Material from material or explicit youngs_mpa/poisson/density_kg_m3 (required, no defaults — the answer scales with √(E·ρ)). yield_mpa arms the stress criterion; plastic=True (+ tangent_mpa, bilinear) lets it yield instead. deceleration_limit_g arms the fragility criterion. method: 'implicit' (default; HHT-α, ccx steps adaptively — right for ms-scale drops) | 'explicit' (central difference at the stable step — for stress-wave events ≲ 100 µs; first-order tets). time_step_s on an implicit run switches to a FIXED step: several times faster where contact comes on smoothly, but ccx stops if an increment diverges (a flat face landing all at once does). duration_s defaults to free flight + 10 wave round trips along the drop — enough for a stiff body; a compliant one needs more, and the gate says so. samples is the single output cadence ccx allows (force history AND stress frames; default sized to the mesh). contact: 'auto' (default) | 'face' | 'node' — measured: ccx's face-to-face penalty never engages a corner strike (the part falls through) and its node-to-face one locks up on a broad flat landing, so 'auto' uses face contact down to a 45° edge and node contact for anything sharper. engagement_lag_mm reports how far the strike point sank before the contact pushed back.

Validated against the exact St-Venant bar (bar_impact): face force ρ·c₀·v₀·A, contact duration 2L/c₀, restitution 1 and the plastic-wave cap all within ~1–3 %. A real part is banded (~20 %): peak force depends on the penalty stiffness and mesh, a stress peak AT the strike point is mesh-dependent, and a sharp wave front rings ~20 % high. No friction, failure or erosion.

Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result for {ok, returncode, solver, case_dir, nodes, tets, method, direction, velocity_m_s, drop_height_mm, duration_s, time_step_s, mass_g, strike_node, contact_faces, contact, strike_alignment, plastic, bar_stress_mpa, peak_force_n, peak_force_median3_n, peak_force_time_s, peak_g, impulse_n_s, contact_start_s, contact_duration_s, separated, arrested, rebound_velocity_m_s, restitution, energy_end_ratio, energy_min_ratio, mass_check, samples, contact_samples, engagement_lag_mm, peak_von_mises_mpa, peak_stress_node, peak_stress_time_s, peak_stress_location_mm, force_history, gate} where gate is {pass, score, fidelity:"solve", band_pct, checks, utilisation, warnings} — a run that ends before the fall is arrested, or whose energy grows, FAILS.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
gap_mmNo
methodNoimplicit
contactNoauto
gravityNo
plasticNo
poissonNo
samplesNo
materialNo
directionNo-z
yield_mpaNo
duration_sNo
youngs_mpaNo
tangent_mpaNo
time_step_sNo
velocity_m_sNo
density_kg_m3No
char_length_mmNo
drop_height_mmNo
max_time_step_sNo
deceleration_limit_gNo
contact_stiffness_mpa_mmNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false, openWorldHint=false, destructiveHint=false — they carry almost no behavioral burden. The description discloses: async job submission, degradation to {ok:false, reason, install} when ccx is absent, the fact that 'auto' contact switches based on edge angle, the fixed-step divergence failure mode, the ~20% banding accuracy caveats, and the gate failure conditions (run ends before arrest or energy grows). It also discloses that no friction/failure/erosion is modeled. This is exemplary behavioral disclosure.

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 long but information-dense; every sentence adds a distinct fact. It is front-loaded with the core purpose and async behavior, then parameter semantics, then validation/accuracy caveats, then return shape. The only minor deduction is that the return-value enumeration is very long and could arguably be summarized, but it is valuable for an agent parsing job_result.

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 22-parameter async solver with no output schema, the description is remarkably complete: it covers input semantics, defaults, failure modes, accuracy expectations, validation basis, and the full return payload including the gate object. The only thing not detailed is the exact job_status polling mechanics, but the description explicitly says 'poll job_result' and sibling job_status/job_result tools exist. Nothing an agent needs to call this correctly 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%, so the description carries the full burden of explaining 22 parameters. It explains the velocity_m_s vs drop_height_mm exclusivity ('exactly one'), the direction semantics ('the way the part TRAVELS', with corner-drop example), material vs explicit youngs/poisson/density, yield_mpa and plastic/tangent_mpa, deceleration_limit_g, method, time_step_s, duration_s default logic, samples, contact modes, and engagement_lag_mm. Nearly every parameter is given meaning beyond its name and type.

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 opens with a specific verb and resource: 'Transient DROP / IMPACT dynamics — the solve `drop_impact` escalates to.' It clearly distinguishes this tool as the async submit variant of drop_impact, and the first sentence names the sibling it escalates from. The scope (meshes body, flies it at velocity or drop height into a fixed rigid floor, integrates with CalculiX *DYNAMIC) is concrete and unambiguous.

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 explicitly states when to use this tool vs alternatives: it is the solve that `drop_impact` escalates to, and it is async ('returns a job — poll job_result'). It also gives method-selection guidance ('implicit' for ms-scale drops, 'explicit' for stress-wave events ≲ 100 µs), and explains when fixed time_step_s is appropriate. The contact mode guidance ('auto' vs 'face' vs 'node') is also usage-oriented. This is rich, actionable routing information.

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

inspection_planInspection PlanA
Read-only

The characteristic list for a drawing page as data: every dimension, feature control frame, and feature note, ballooned, with nominal, limits, and a suggested measurement method per row.

The method follows the tolerance rather than a guess: the gauge-maker's ratio:1 rule (default 10:1 — the instrument must resolve a tenth of the tolerance band) walked down a per-family instrument ladder, so a loose feature isn't sent to the CMM and a tight bore isn't signed off with a caliper. A bore takes the pin/bore gauge ladder (a micrometer can't reach inside one); a GD&T control referencing a datum frame is CMM work; a datum-free form control is surface-plate work. The required resolution is exact arithmetic, the instrument mapping is shop convention — hence fidelity='correlation'.

Returns {ok, characteristics, count, by_method, unmeasurable, retired, next_balloon, fidelity, band_pct, basis}. ok=False means a characteristic cannot be inspected as drawn — an untoleranced size the inspector has no limits to accept or reject against (code no_tolerance), or a band finer than any instrument on its ladder (code no_instrument) — with unmeasurable naming which and why.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageYes
ratioNo

TDQS

A4.6/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint/openWorldHint annotations, explaining the 10:1 gauge-maker's ratio rule, the per-family instrument ladder, the GD&T/datum routing logic, and exact failure modes (no_tolerance, no_instrument) with the `unmeasurable` field. It also enumerates the full return payload, so an agent knows exactly what will happen.

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 dense but not padded: the first sentence states the deliverable, the middle paragraph justifies the method, and the final paragraph defines the return envelope and failure codes. It is front-loaded and every sentence earns its place.

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?

No output schema exists, and while the description lists all return keys and thoroughly explains ok=False and `unmeasurable`, secondary keys like by_method, retired, next_balloon, band_pct, and basis are left to inference. For a complex planning tool this is almost complete, but a brief clarification of those remaining fields would remove all ambiguity.

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% and there are only two parameters, so the description must carry the load. It interprets `ratio` as the gauge-maker's resolution ratio with a default of 10:1 and clarifies that the mapping is exact arithmetic; `page` is identified as the drawing page being characterized, though its exact identifier format is left implicit.

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 opens with a precise definition: 'The characteristic list for a drawing page as data' and enumerates exactly what is included: every dimension, feature control frame, feature note, ballooned, with nominal, limits, and a suggested measurement method per row. This clearly distinguishes it from report/annotation-style sibling tools like fai_report or balloon_drawing.

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 description does not explicitly name alternatives or say 'use this instead of X,' but it gives strong contextual signals about when this tool is appropriate: it applies to a drawing page, follows a tolerance-to-instrument mapping, and returns a plan with unmeasurable reasons. This is clear context, though explicit exclusions would earn a 5.

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

interface_align_checkInterface Align CheckA
Read-only

Gate: verify declared interface pairs coincide in world space — the "do the OTHER interfaces line up?" check for multi-interface mates. After the primary mate seats a part, this confirms its secondary interfaces (a second bolt pattern, a bore axis) actually meet the parent's.

pairs: [{child, child_iface, parent, parent_iface}, ...] (child/parent are link names in the assembly). Returns misaligned pairs [{..., gap_mm}], empty if every pair coincides within tol_mm.

ParametersJSON Schema
NameRequiredDescriptionDefault
pairsYes
tol_mmNo
assemblyYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already disclose readOnlyHint=true and openWorldHint=false. The description adds meaningful behavioral detail by specifying that it returns misaligned pairs with gap_mm values and returns an empty list when all pairs coincide within tol_mm. No contradiction with annotations.

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 compact and front-loaded, starting with 'Gate:' to orient the agent. Each clause adds relevant information—purpose, context, parameter structure, and return behavior. The informal style is slightly unpolished but does not waste words.

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 gate tool with no output schema, the description supplies the return shape (misaligned pairs with gap_mm) and tolerance semantics, which is sufficient for an agent to call it correctly. Missing details like explicit assembly parameter documentation are minor and do not impede use.

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 does explain the structure of 'pairs' as [{child, child_iface, parent, parent_iface}] and clarifies child/parent as link names, and references tol_mm in the return condition. However, the 'assembly' parameter is only explained by its name, and the field types or units are not fully specified.

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 verb 'verify' and resource 'declared interface pairs coincide in world space', and explicitly positions this as the 'do the OTHER interfaces line up?' check for multi-interface mates. This clearly distinguishes it from a primary mate operation and other gate tools.

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 temporal context: 'After the primary mate seats a part, this confirms its secondary interfaces'. This tells an agent when to use the tool, but it does not name alternative tools or state explicit exclusions, so it falls 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.

interference_checkInterference CheckA
Read-only

Pairwise interference: compute volume of intersection between every pair of parts. Returns [{a, b, interference_mm3}, ...] descending by volume. Empty list = no interference.

ParametersJSON Schema
NameRequiredDescriptionDefault
assemblyYes

TDQS

A4.3/5.0
Behavior5/5

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

The readOnlyHint and openWorldHint annotations already signal a safe, closed-world read operation. The description adds the full output contract: descending list of {a, b, interference_mm3} entries and the empty-list sentinel meaning no interference. This is substantive context beyond the annotations.

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 four short lines that front-load the operation, then give the output shape, sort order, and empty-list meaning. Every sentence earns its place.

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 simple read-only analysis with one parameter, the description covers the operation and return semantics well, especially given there is no output schema. The main missing piece is clarification of the assembly parameter's value format, plus possible error or prerequisite conditions.

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 only parameter, 'assembly', has no schema-level description and the tool description never explains how to reference an assembly (name/path/ID) or what format is accepted. With 0% schema description coverage, the description needed to compensate for this gap but does not.

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 names a specific operation ('compute volume of intersection') over a precise scope ('every pair of parts'), and the phrase 'Pairwise interference' distinguishes it from nearby analysis tools like min_clearance or envelope_check. It is not a tautology of the title.

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 context for when the tool applies: detecting and quantifying pairwise overlaps between parts in an assembly. However, it does not explicitly name alternatives or state when not to use it, 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.

items_check_manifestItems Check ManifestA
Read-only

Reference-integrity guard (#140 C1): check every item-reference in a manifest ({"item":""} on a component/instance) resolves against an items.json registry. Returns {ok, problems} — a dangling item-ref is caught before a merge, removing the "a part is its filename" fragility.

ParametersJSON Schema
NameRequiredDescriptionDefault
manifestYes
registryYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already mark the tool as read-only and closed-world; the description adds the return contract {ok, problems}, the exhaustive 'check every item-reference' behavior, and the purpose of catching dangling refs pre-merge. This goes beyond the annotation safety profile without contradicting it.

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 compact, front-loads the action and return shape, and keeps the rationale in a short second sentence. Some jargon (#140 C1, 'a part is its filename' fragility) is cryptic, but the text is not bloated.

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 simple read-only checker with no output schema, it includes the return shape, domain-level input semantics, and a concrete usage scenario. The main gap is the exact string format for manifest and registry parameters, but the tool's low complexity and read-only annotations reduce the risk.

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 explain the parameters. It usefully describes manifest as containing {"item":"<id>"} references and registry as an items.json registry, but it does not clarify whether these strings are paths, raw JSON, or registry contents, leaving ambiguity for an agent.

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 names a specific verb ('check') and resource ('every item-reference in a manifest') against an items.json registry, and includes the exact reference shape. It does not explicitly name sibling tools, but the 'reference-integrity guard' framing makes its role distinct from generic validation tools.

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 trigger: a dangling item-ref should be caught 'before a merge'. This tells an agent when the check is valuable, though it doesn't explicitly contrast with alternatives like items_validate or validate_manifest.

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

items_newNew ItemA

Allocate a non-significant sequential part number and register a new item in an items.json sidecar (created if absent), writing it back. The reserved rev / lifecycle fields are seeded with held defaults (the #141 state machine, not C1).

registry: path to the items.json sidecar (created if it does not exist). item: the new item's stable logical id (what manifests reference). files: optional list of artifact paths the item maps to. metadata: optional free-form, queryable attributes (where "meaning" lives).

Returns {part_number, item, registry}.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemYes
filesNo
metadataNo
registryYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark this as non-read-only, and the description adds meaningful side-effect details: the sidecar is created if absent, written back, and rev/lifecycle fields are seeded with held defaults rather than C1. It does not cover error or concurrency behavior, but it goes well beyond the structured annotations.

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 leads with the core operation, then a tight parameter list, then a one-line return shape. The only minor issue is the cryptic parenthetical '#141 state machine, not C1,' which is somewhat insider-specific but not disqualifying.

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?

Inputs, optionality, the side-effect of writing the registry, and the return shape are all covered, which is sufficient for invoking the tool despite the lack of an output schema. Missing duplicate-item behavior and exact part-number formatting are secondary gaps.

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%, so the prose is the only source of parameter meaning. It explains registry as the sidecar path, item as the manifest-stable logical id, files as an optional artifact mapping list, and metadata as queryable free-form attributes—far exceeding the bare type/title schema.

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 opening sentence names a concrete action ('Allocate a non-significant sequential part number and register a new item') against a specific resource ('an items.json sidecar'), and adds behavior ('created if absent, writing it back'). This clearly separates it from item validation/resolution siblings like items_validate, items_resolve, and items_check_manifest.

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 description gives clear context: this tool is for creating a new item and registering it in the items registry, with 'new item' making the selection obvious. It does not explicitly name sibling alternatives or state when not to use it, but the creation intent is unmistakable.

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

items_resolveItems ResolveA
Read-only

Resolve an item-reference (an item id) to its artifact file(s) against an items.json registry — identity, not a bare path, so renaming/moving a file updates the item's files[] without breaking references. Returns {ok, files}, or {ok:false, problems} on a dangling reference (an unknown item id).

ParametersJSON Schema
NameRequiredDescriptionDefault
itemYes
registryYes

TDQS

A3.8/5.0
Behavior4/5

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

The description adds return-shape details ({ok, files} or {ok:false, problems}) and the dangling-reference failure mode, and explains the identity-based resolution behavior beyond the readOnlyHint annotation. No contradiction with annotations.

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?

Two focused sentences, front-loaded with the action and resource, and every clause carries useful information. No redundant restatement of the tool name.

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 read-only tool, the description covers purpose, return values, and failure behavior, and annotations cover safety. The main gap is parameter format detail, but the description is otherwise adequate.

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?

The input schema has 0% description coverage, and the description partially compensates by identifying item as an item id and registry as an items.json registry. However, it does not explain how to provide the registry (path vs content) or the item id format, leaving ambiguity for invocation.

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 precise action—resolve an item-reference to artifact file(s)—and adds identity semantics and the registry source, distinguishing it from path-based or manifest-resolution tools. It is specific enough to differentiate from siblings like items_validate and where_used.

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?

No explicit when-to-use or alternatives are given. The description defines what the tool does but does not tell an agent when to prefer it over items_validate, items_check_manifest, or project_resolve_manifest.

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

items_validateItems ValidateA
Read-only

Validate an items.json registry (the PLM item/document/file split, #140 C1). Checks the schema stamp ("ankusdrive.items/1"), each item record's shape, that part numbers are unique, and the held reserved rev/lifecycle fields. An item is the logical part (part_number + rev + lifecycle + metadata), distinct from its file artifact(s); part numbers are non-significant + sequential, with meaning in queryable metadata.

registry: path to the items.json sidecar.

Returns {ok, problems, schema, count} — ok is True iff problems is empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
registryYes

TDQS

A4.4/5.0
Behavior4/5

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

The description discloses the exact return shape {ok, problems, schema, count} and the success condition (ok is True iff problems is empty), which goes beyond the readOnlyHint annotation. It also details the validation checks performed, giving the agent a concrete model of behavior. It does not mention missing-file error handling, but the read-only safety profile is already covered by annotations.

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 action, then follows with specific checks, domain context, and the return value. It includes some extra background (the '#140 C1' reference and part-number semantics) that could be trimmed, but each part contributes to understanding the tool's scope. Overall it remains well organized and not bloated.

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 tool with one string parameter and no output schema, the description covers the essential ground: what is validated, the input meaning, and the return format. It does not enumerate every possible problem type or describe behavior when the registry file is missing, but an agent has enough information to select and invoke this 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?

The input schema provides only the parameter name 'registry' as a string with zero description coverage. The description fills this gap completely by stating it is 'path to the items.json sidecar', which is essential information for the agent to invoke the tool correctly. This goes well beyond the schema.

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 opens with a clear verb+resource: 'Validate an items.json registry', then enumerates the exact checks (schema stamp, record shape, unique part numbers, reserved rev/lifecycle fields). This is specific enough to clearly distinguish it from sibling item tools like items_resolve or items_new, even without naming them.

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 description gives clear context: this tool is for validating the items.json sidecar, with an explicit single parameter (path to the registry). It does not name alternatives or exclusions, such as when to prefer items_check_manifest, but it is unambiguous about its purpose and input.

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

job_listJob ListA
Read-only

List every async job this worker session. Returns {count, jobs:[{job_id, kind, status, elapsed_s}]} in submit order, plus main_thread_queue:{queued, ran, failed, drains, pending} — the diagnostic for a shape optimization that looks stuck. Those builds run on the worker's main thread, and that queue is drained once per request: pending high with drains climbing means the work is slow; drains flat means nothing is polling, so nothing is advancing.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true, and the description consistently describes a pure listing operation. It goes well beyond the annotations by disclosing submit ordering, session scoping, the 'drained once per request' behavior, and the meaning of pending versus drains for diagnosing a stalled optimization.

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 the core purpose and then provides a compact return-shape specification. The second sentence earns its place by explaining the non-obvious main_thread_queue diagnostics rather than padding with redundant prose.

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?

There is no output schema, so the description must explain return values, and it does: the count, jobs array fields, ordering, and the main_thread_queue diagnostic. For a parameterless read-only tool, this is enough for an agent to know what it will get and how to interpret it.

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?

The tool has zero parameters, so there are no param semantics for the description to clarify; baseline 4 applies. The description instead usefully documents what the returned fields mean, which is the relevant information for a no-argument tool.

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 opens with a specific verb and resource: 'List every async job this worker session,' which clearly establishes scope. It also states the return shape, making the tool's function unambiguous. The session-scoped, all-jobs framing distinguishes it from siblings like job_result or job_status, which focus on individual jobs.

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 description provides a clear use context: it is 'the diagnostic for a shape optimization that looks stuck,' including how to interpret main_thread_queue counters. It does not explicitly name alternatives such as job_result or job_status or state when not to use this tool, so it falls 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.

job_resultJob ResultB
Read-only

Fetch an async job's outcome. Returns {job_id, kind, status, elapsed_s, result (when done) | error (when failed)}; while running neither is set. discard=True frees a terminal job (and its cache entry) once you have it.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes
discardNo

TDQS

B3.1/5.0
Behavior1/5

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

The annotations declare readOnlyHint=true, indicating the tool should not modify state, yet the description says 'discard=True frees a terminal job (and its cache entry),' which is a destructive side effect. This directly contradicts the annotation and makes the behavioral contract inconsistent and confusing.

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 two sentences with no filler. It front-loads the action, packs the return shape into compact syntax, and addresses the optional discard behavior without repetition.

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 two-parameter tool with no output schema, the description covers the return shape and the discard side effect well. However, the contradiction with readOnlyHint=true and the lack of explicit connection to submit/job_status tools leave the overall picture incomplete and internally inconsistent.

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?

With 0% schema description coverage, the description compensates for the discard parameter by explaining that True frees the terminal job and its cache entry. job_id is left to its name and the return snippet, which is likely sufficient but not elaborated, so the compensation is only partial.

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 and resource: 'Fetch an async job's outcome,' and then lists the exact return payload, making the tool's purpose clear. It does not explicitly differentiate itself from the sibling job_status tool, so differentiation is implicit rather than named.

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 description implies the tool is the follow-up call after an async submit and describes terminal-state behavior, so a competent agent can infer when to use it. However, it never names alternatives such as job_status for progress checks or job_list for enumeration, leaving usage guidance implied rather than explicit.

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

job_statusJob StatusA
Read-only

Lightweight poll of any async job (from an *_submit tool). Returns {job_id, kind, status: 'running'|'done'|'failed', elapsed_s, meta} (+ error when failed) WITHOUT the result payload — cheap to call in a loop.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

TDQS

A4.7/5.0
Behavior5/5

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

The annotations already declare readOnlyHint=true, but the description adds significant behavioral context: the exact return shape, status enum, elapsed_s, meta, an error field on failure, and the explicit guarantee that the result payload is omitted. This tells the agent exactly what will and will not happen when invoking the tool.

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 a single compact sentence with no wasted words. It front-loads the tool's purpose and immediately covers the key behavioral facts: cheap, loop-friendly, no payload.

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 simple one-parameter polling tool, the description is complete. It explains what the tool does, when to use it, what the return fields are, and what is intentionally absent. No output schema exists, but the description covers the return contract sufficiently.

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%, but there is only one parameter, job_id, whose purpose is self-evident. The description adds meaning by specifying that the job_id comes from any *_submit tool, which is enough context for an agent to supply it correctly.

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 verb ('poll') and resource ('async job from an *_submit tool'), and clearly distinguishes itself from result-fetching tools by noting it returns status without the result payload. It is unmistakably different from job_result and job_list even without opening their schemas.

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 description gives clear context: use this for lightweight polling of async jobs and it is cheap to call in a loop. It implies the alternative is fetching the result payload elsewhere, but it does not explicitly name job_result or state when not to use this tool.

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

journal_exportJournal ExportA
Read-only

Export a past session from the on-disk journal (off by default; on with ANKUSDRIVE_JOURNAL_DIR) as session_transcript would have: the replay script, the recorded environment, and the ordered call ledger with each result's SHA-256. Read-only. session: an id or "latest"; omit to list sessions. workspace: default is the one current when the session ended. provenance=False skips solver version probes. A redacted journal (ANKUSDRIVE_JOURNAL_REDACT) exports an audit record, not a runnable script. More options: ankusdrive journal export.

Returns {enabled, dir, live_session, sessions} when listing, else {session, workspace, env, script, ledger, warnings, prerequisites, truncated, redacted, integrity, provenance, ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNo
workspaceNo
provenanceNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already provide readOnlyHint=true and openWorldHint=false. The description adds substantial behavioral detail: it is read-only, exports specific artifacts, includes a provenance probe toggle, and explains that a redacted journal exports an audit record rather than a runnable script. It also details the return structure for both listing and export modes. No contradiction with annotations, and the description enriches beyond the basic hints.

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 packed with information but every sentence earns its place. It starts with the core purpose, then explains parameters, redaction behavior, and return structure, all in a compact, organized way. There is no fluff or redundancy. It is dense yet readable, and the structure naturally leads from purpose to usage to output.

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?

Given there is no output schema, the description includes a detailed return specification for both listing and export scenarios, covering fields like 'enabled', 'dir', 'live_session', 'sessions', and the export payload with 'warnings', 'integrity', 'provenance', etc. It also mentions configuration prerequisites (journal directory and redaction). Nothing critical for an agent to invoke the tool correctly 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%, meaning the schema only provides parameter names and defaults. The description compensates fully: 'session' is explained as an id or 'latest', with omitting it triggering listing; 'workspace' defaults to the one current when the session ended; 'provenance' defaults to true and can be set to false to skip solver version probes. All three parameters receive meaningful explanation beyond the schema.

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 clearly states the verb 'Export' with a specific resource ('past session from the on-disk journal'), and details the exact contents (replay script, environment, call ledger with SHA-256). It also explicitly references the sibling tool 'session_transcript' to distinguish itself, saying it exports 'as session_transcript would have' from the journal. This leaves no ambiguity about what the tool does.

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 description provides clear context: it explains when listing occurs (session omitted) and the effect of the 'provenance' parameter. It references 'session_transcript' as a comparison point, implying a relationship, but it does not explicitly state when to use this tool over alternatives or when not to use it. There are no explicit exclusions or conditions beyond the journal being enabled. This is clear context without explicit when-not/alternative routing, hence a 4.

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

laminate_propertiesLaminate PropertiesA
Read-only

Effective stiffness, thermal warp, and first-ply failure of a bonded multi-layer composite stack (NO solver) — the closed-form screening twin a layered multi-material CalculiX fem_run static solve is gated against (e.g. 1 metal layer + 1 plastic layer, or any [(material, thickness), …]).

layers is the stack bottom→top; each entry is a mapping with a thickness (mm) and either a corpus material name or explicit E/youngs_mpa/ youngs_gpa (+ optional nu/poisson, yield_mpa, cte/cte_per_k, density_kg_m3, thermal_conductivity_w_mk); explicit values override the card. width_mm scales EI / first-ply. Optional delta_T (K) gives the bimetal thermal curvature; force_n (in-plane, total across width) and/or moment_nmm (about the neutral axis) give the first-ply margin.

Computes the in-plane modulus (Voigt rule-of-mixtures parallel, Reuss series through-thickness); the transformed-section neutral axis, EI_eff, and flexural modulus E_flex = 12·EI/(b·h³); the CLT A/B/D matrices per unit width (B ≠ 0 ⇒ bending–extension coupling / warp warning); mass-averaged ρ, stiffness-weighted in-plane CTE, series/parallel thermal conductivity; the transformed-section bimetal curvature (= Timoshenko's two-layer formula exactly, also reported); and per-layer extreme-fibre stress → margin to yield → governing layer + load to first yield. A single-material stack reduces to that material's E / EI; a symmetric stack gives B = 0; ΔT = 0 or zero CTE-mismatch gives zero curl. Escalate to a layered fem_run solve for thick stacks, anticlastic curvature, free-edge interlaminar stress, or non-isotropic plies.

Returns {n_layers, width_mm, total_thickness_mm, layers, E_inplane_mpa, E_through_mpa, neutral_axis_mm, EI_eff_nmm2, E_flex_mpa, A_matrix, B_matrix, D_matrix, coupling_ratio, asymmetric, rho_eff_kg_m3, cte_eff_per_k, k_through_w_mk, k_inplane_w_mk, delta_T, thermal_curvature_per_mm, radius_of_curvature_mm, timoshenko_curvature_per_mm, applied_force_n, applied_moment_nmm, kappa_applied_per_mm, axial_strain, layer_stresses, first_ply, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
layersYes
delta_TNo
force_nNo
width_mmNo
moment_nmmNo

TDQS

A5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses that this is a closed-form/no-solver calculation and lists exactly what is computed: Voigt/Reuss moduli, neutral axis, EI_eff, CLT A/B/D matrices, bimetal curvature, and per-layer first-ply margins. It also flags special cases (B != 0 => warp warning, symmetric stack => B=0, delta_T=0 => zero curl) and returns a fidelity/warnings/escalate_to block, so side effects and limitations are unusually clear.

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 long, but it is dense and every segment earns its place: purpose, input semantics, computed outputs, special-case behavior, and escalation path. The front-loaded first sentence names purpose and solver scope before any parameter or output details, and the output enumeration is justified because there is no output schema.

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?

Given no output schema, the description supplies a full return-key list with units embedded and explains formulas to the point that an agent can predict results. It covers valid inputs, defaults, special cases, and the boundary of applicability. The only thing not enumerated is the closed set of material names, but sibling material_list/material_get tools cover that.

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%, so the description carries the full burden, and it succeeds. It defines layers as bottom-to-top entries with thickness and either a corpus material name or explicit E/youngs_mpa/youngs_gpa plus optional mechanical properties, and notes that explicit values override the card. It also assigns meaning to width_mm, delta_T, force_n, and moment_nmm, including their units and mechanical role.

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 opens with a specific verb and resource: 'Effective stiffness, thermal warp, and first-ply failure of a bonded multi-layer composite stack' and immediately flags 'NO solver', distinguishing it from a CalculiX fem_run static solve. It is immediately recognizable as a closed-form screening tool, not a generic analysis utility.

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 names fem_run as the alternative and gives explicit escalation conditions: 'Escalate to a layered fem_run solve for thick stacks, anticlastic curvature, free-edge interlaminar stress, or non-isotropic plies.' It also says it is the 'screening twin' that a fem_run solve is 'gated against', so an agent knows when to call this cheap screening path first.

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

lifecycle_apply_changeLifecycle Apply ChangeA
Destructive

Apply a change to a RELEASED item, dispatching on the F3 predicate (#141 C2) — the sanctioned way to change a frozen part. An F3-preserving change opens a new revision on the SAME part number (rev A->B, back to in_work); an F3-breaking change allocates a NEW part number as a new item (new_item required) carrying a supersedes back-link, leaving the released item untouched.

registry: path to the items.json sidecar (written back on success). item: the released item id being changed. after: the proposed new metadata (attribute object). new_item: id for the new item when the change is F3-breaking. extra_f3 / actor / note: optional, as in lifecycle_classify_change / lifecycle_transition.

Returns {ok, disposition, item, part_number, rev, ...}, or {ok:false, problems} (e.g. the item is not released, or an F3-break lacks new_item).

ParametersJSON Schema
NameRequiredDescriptionDefault
itemYes
noteNo
actorNo
afterYes
extra_f3No
new_itemNo
registryYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark the tool as destructive, and the description adds meaningful detail: it writes back the registry sidecar, opens a new revision on the same part number for F3-preserving changes, allocates a new part number with a supersedes link for F3-breaking changes, and leaves the released item untouched. This goes well beyond the annotations.

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 well-organized: core behavior first, then parameter list, then return/error summary. The parenthetical domain reference '#141 C2' is jargon-heavy, but the rest earns its place and is not padded.

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 output schema, the description explains side effects, success returns, and failure cases such as the item not being released or an F3-break lacking new_item. It is nearly complete; the only small gap is that extra_f3 semantics are delegated to sibling tools rather than defined inline.

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%, so the description carries full parameter documentation. It explains registry as the sidecar path written back on success, item as the released id, after as the proposed metadata object, new_item as the id for F3-breaking, and references sibling semantics for extra_f3/actor/note. All seven parameters are meaningfully covered.

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 action ('Apply a change to a RELEASED item') and the exact resource/scope, with the distinctive F3 predicate dispatch. It is clearly distinguished from lifecycle_transition and lifecycle_classify_change by being 'the sanctioned way to change a frozen 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?

The description clearly scopes use to RELEASED/frozen items and explains when an F3-breaking change requires new_item. It references sibling tools for optional parameters, but it does not explicitly say when to prefer lifecycle_transition or classify_change instead. Context is clear, though exclusions are only implied.

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

lifecycle_classify_changeLifecycle Classify ChangeA
Read-only

The deterministic Form/Fit/Function predicate (#141 C2): compare an item's before/after attributes and decide rename-vs-revise. A change touching a Form/Fit/Function (public, interface-defining) attribute breaks interchangeability => "new_part_number" (allocate a new number); a change to only internal/hidden attributes is interchangeable => "revise" (bump the revision, same part number).

before / after: attribute objects (the item's interface-defining + internal attributes, before and after the proposed change). extra_f3: optional map of extra attribute name -> F3 leg ("form"/"fit"/ "function") for domain-specific interface attributes.

Returns the verdict {disposition, f3, changed, f3_changed, categories, reason} where disposition is "revise" / "new_part_number" / "noop".

ParametersJSON Schema
NameRequiredDescriptionDefault
afterYes
beforeYes
extra_f3No

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark the tool as read-only; the description adds deterministic behavior and the exact verdict structure. It also explains the classification logic and the role of Form/Fit/Function attributes, which goes beyond the structured annotations. No contradiction with annotations.

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 well-organized: decision logic first, outcome rules second, then parameter details, then return shape. The parenthetical '#141 C2' is minor noise, but otherwise every sentence adds useful information without redundancy.

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 classifier with no output schema, the description covers all parameters, decision outcomes, and lists the returned verdict fields. The main gap is that 'noop' is mentioned as a possible disposition but not explained, and some verdict fields like 'f3' and 'categories' are listed without definitions.

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?

With 0% schema description coverage, the description carries the full parameter documentation burden. It explains that before/after are attribute objects representing interface-defining and internal attributes, and fully describes extra_f3 as a map from attribute names to form/fit/function legs. Slightly more detail on the internal shape of before/after objects would make it perfect.

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 deterministic predicate and the decision it produces: 'decide rename-vs-revise'. It clearly defines the input resource (before/after attributes) and the two meaningful outcomes, which distinguishes it from lifecycle_transition and lifecycle_apply_change.

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 intended use is evident: classify whether a proposed attribute change breaks interchangeability. It explicitly explains when 'new_part_number' vs 'revise' is the correct outcome, giving clear context for when to call it, though it does not name alternative tools or exclusion conditions.

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

lifecycle_editableLifecycle EditableA
Read-only

The cheap "is this editable?" check a builder runs before writing (#141 C2). An item is editable only in lifecycle state in_work; in_review, released and obsolete are frozen (released = immutable, the API-stability guarantee).

registry: path to the items.json sidecar. item: the item id to check.

Returns {ok, editable, state}.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemYes
registryYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false. The description adds meaningful behavior beyond that: the lifecycle-state rule, the released-is-immutable API guarantee, and the return shape {ok, editable, state}. No contradiction with annotations.

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 compact and front-loaded, with the core purpose in the first sentence and a clean param/return breakdown. The parenthetical '#141 C2' is internal context that adds little for an agent, but it does not undermine usability.

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 two-parameter read-only check with no output schema, the description covers invocation context, lifecycle semantics, and return shape. An agent has everything needed to call it correctly and interpret the result.

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?

The input schema provides only parameter names and titles, with 0% description coverage. The description compensates by defining registry as 'path to the items.json sidecar' and item as 'the item id to check'. This is sufficient for simple parameters, though examples or format hints would be even better.

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 the exact purpose: 'The cheap "is this editable?" check a builder runs before writing'. It names the lifecycle states and the specific criterion (editable only in in_work), which clearly distinguishes this read-only predicate from lifecycle_transition and lifecycle_apply_change 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?

It gives clear context for when to use the tool: before writing, as a cheap check. It also explains that in_review, released, and obsolete are frozen. It does not explicitly name alternatives or when-not-to-use conditions, but the usage context is unambiguous.

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

lifecycle_transitionLifecycle TransitionA
Destructive

Move an item through the lifecycle state machine in_work -> in_review -> released -> obsolete, guarded by a transition table (#141 C2). An illegal edge (e.g. skipping review, or re-opening a released item in place) is rejected loudly; releasing stamps the item's first revision and freezes it.

registry: path to the items.json sidecar (written back on success). item: the item id to transition. to: the target lifecycle state. actor / note: optional provenance recorded in the item's transition log.

Returns {ok, state, rev}, or {ok:false, problems} on an illegal transition.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYes
itemYes
noteNo
actorNo
registryYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description reveals key side effects: the registry is written back on success, releasing stamps the first revision and freezes the item, and illegal transitions fail loudly. It also discloses the return contract, including the error shape, which is substantial behavioral detail.

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 well-structured with purpose first, then parameter semantics, then return behavior. It is slightly dense and includes an internal reference (#141 C2) that adds no agent value, but nearly every sentence earns its place.

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 mutating lifecycle tool with no output schema and no parameter enums, the description is complete: it explains legal transitions, illegal edge cases, side effects, parameter meanings, and return shapes. An agent has enough to call this correctly without needing external context.

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%, yet the description documents every parameter: registry is the items.json sidecar path, item is the item id, to is the target lifecycle state, and actor/note are optional provenance written to the transition log. 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?

The description opens with a specific action and resource: 'Move an item through the lifecycle state machine' and names the exact legal flow in_work -> in_review -> released -> obsolete. It also gives concrete examples of illegal transitions, which makes the tool's domain unmistakable and separates it from vague sibling names like lifecycle_apply_change.

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 description provides clear context for when to use this tool: whenever an item needs to advance through the lifecycle state machine. It also implies constraints by saying illegal edges are rejected, but it does not explicitly contrast with lifecycle_editable, lifecycle_classify_change, or lifecycle_apply_change, so exclusions are left mostly to inference.

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

linear_patternLinear PatternA

Repeat a PartDesign feature linearly along a direction.

direction: 'X'|'Y'|'Z' for body origin axes, or {handle, edge: tag|'EdgeN'} for an edge-aligned direction. length: total span (mm) covered by the pattern. occurrences: number of copies (>=2). Includes the original.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoLinearPattern
lengthNo
featureYes
reversedNo
directionNoX
occurrencesNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations declare readOnlyHint false and destructiveHint false, so the description needs to clarify mutation semantics. It adds that occurrences 'Includes the original' and that it repeats a feature, which is useful. However, it does not describe side effects like whether the original is preserved or how the pattern interacts with existing geometry, and it omits the 'reversed' parameter's behavioral impact. With annotations already covering the safety profile, the description adds moderate value.

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 concise and front-loaded with the core action. It then presents parameter details in a structured, scannable format with clear examples. There is minimal wasted text, and the important constraint (occurrences >=2, includes original) is emphasized. Slightly more structure (like separating parameter definitions) could improve readability, but overall it's efficient.

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?

Given six parameters and no output schema, the description covers the most semantically complex ones but omits 'feature' (required) and 'reversed'. It also does not explain what the tool returns or any prerequisites (e.g., must have a selected PartDesign feature). While an agent may infer return behavior from the name, the missing required parameter semantics is a notable gap. It is adequate for a moderately complex tool but not fully complete.

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 direction (with syntax for axes and edge-aligned), length (units), and occurrences (minimum count, includes original). It does not explain 'feature' (the required parameter) or 'reversed', leaving those ambiguous. This is partial compensation: it covers three key parameters but misses two, including the required one.

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 clear, specific action: 'Repeat a PartDesign feature linearly along a direction.' It identifies the resource (PartDesign feature) and the operation (linear repetition), and distinguishes visually from siblings like polar_pattern or mirrored by the explicit linear-direction emphasis. An agent can immediately understand the tool's purpose 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 Guidelines3/5

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

The description explains the direction syntax and constraints but does not explicitly state when to use this tool over alternatives like polar_pattern or mirrored. It implies linear pattern usage but offers no exclusion or selection guidance. An agent may infer it from the name and direction options, but the description itself lacks explicit 'when to use vs. when not to use' guidance.

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

list_assembly_partsList Assembly PartsB
Read-only

List parts of an assembly: name, type, linked-target name, position, volume.

ParametersJSON Schema
NameRequiredDescriptionDefault
assemblyYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the description adds the returned field names, which is useful context about the output. However, it does not disclose whether nested subassemblies are included, error behavior for invalid assembly names, or whether position/volume refer to global or local coordinates.

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 a single sentence that starts with the action and resource, then lists output fields. No filler or redundancy; every word contributes.

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

Completeness2/5

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

For a one-parameter tool, the description omits critical details about the input's meaning and preconditions. It lacks any mention of what constitutes an 'assembly' in this context, whether the assembly must be open, or how the returned data is structured (e.g., a list of objects with those fields).

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

Parameters1/5

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

With 0% schema description coverage, the description must explain the 'assembly' parameter. It only mentions 'assembly' generically without clarifying whether it is a name, ID, path, or must reference a currently loaded document. An agent cannot determine how to populate this required parameter correctly.

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 verb ('List') and resource ('parts of an assembly'), and names the output fields (name, type, linked-target name, position, volume), making the purpose unambiguous and easily distinguishable from sibling list tools like list_faces or feature_list.

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?

No guidance is given about when to use this tool versus alternatives, nor any exclusions or prerequisites. It does not state whether it includes subassemblies or when a user would choose it over list_faces or feature_list, leaving the agent to infer from the name alone.

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

list_documentsList DocumentsA
Read-only

List all open documents: [{name, label, file_path, dirty, active, object_count}, ...].

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark this as read-only, and the description adds meaningful behavioral context by showing the exact list of returned fields and that it covers all open documents. Since there is no output schema, this field-level detail is especially valuable.

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?

A single, front-loaded sentence states the action, scope, and output shape with no unnecessary words. Every element earns its place.

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 parameterless read-only listing tool with no output schema, this description is complete: it defines what is listed and the exact object fields returned. An agent has everything needed to invoke and interpret the result.

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?

The tool has zero parameters, so there is nothing for the description to clarify beyond what the empty schema already shows. The baseline of 4 applies because no parameter documentation burden exists.

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 ('List all open documents') and specifies the exact return shape with fields. This clearly distinguishes it from sibling tools like list_workspaces, list_objects, and job_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?

The phrase 'all open documents' gives clear context for when to call this tool: when an inventory of currently open documents is needed. It does not explicitly name alternatives or exclusions, but the resource scope is unambiguous.

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

list_edgesList EdgesB
Read-only

List all edges of a shaped object with stable tags + descriptors.

Returns [{tag, index, kind, length, centroid, axis?, radius?}, ...]. Same stability story as list_faces.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so read-only behavior is covered. The description adds the return structure and mentions 'stable tags', but does not clarify what 'stable' means or describe error cases (e.g., missing handle, object without edges). It extends beyond annotations but leaves behavioral gaps.

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 concise—two sentences—and front-loads the purpose. The return format is given in a structured pseudo-code block, which is efficient and scannable. No unnecessary words are used.

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 return fields are listed, but 'kind', 'axis?', and 'radius?' are not explained. The 'handle' parameter is not described, and since there is no output schema, the description carries the full burden of explaining outputs. It references list_faces for stability, providing some context, but gaps remain for a fully self-contained understanding.

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 only parameter, handle, is listed in the schema without any description. The description does not explain what handle refers to (likely an object handle), and with 0% schema coverage, it should compensate. This is a notable omission for a single-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 states a clear verb-resource pair: 'List all edges of a shaped object' and explicitly mentions 'stable tags + descriptors'. It distinguishes itself from list_faces by referencing the same stability story, but doesn't compare to other edge-related tools like query_faces or resolve_face. Overall, the purpose 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 Guidelines2/5

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

No explicit when-to-use guidance is given. The only hint is 'Same stability story as list_faces,' which implies consistency but doesn't tell an agent when to pick this over alternatives. There are no exclusions or alternative tool mentions, leaving the choice to inference.

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

list_face_rolesList Face RolesA
Read-only

Read back the semantic face roles declared on a part (see annotate_face).

Each entry re-resolves its stored tag against the CURRENT geometry, so a drifted or deleted face is reported rather than silently resolving wrong.

Returns a list (sorted by name) of dicts: name (str) the annotation key role (str) inlet | outlet | sealing | wetted | ambient | mating tag (str) the f_* face tag the role is bound to present (bool) whether that tag still resolves on the current shape index (str) 'FaceN' on the current shape (only when present) meta (dict) the verbatim metadata (only when set)

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses a key behavioral trait: each entry re-resolves its stored tag against the current geometry, so drifted or deleted faces are reported via a 'present' flag rather than silently misresolving. It also documents the exact output fields, giving the agent full transparency about what to expect.

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 structured with a purpose sentence, a behavioral note, and a tidy bulleted return-format list. Every sentence carries information; there is no filler. The most important facts are front-loaded, and the return fields are laid out clearly.

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 description provides behavioral details and a complete return schema, which is commendable given there is no output schema. The only gap is the implicit mapping of the 'handle' parameter to the part, which could have been stated in one short clause. Otherwise, an agent has everything needed to call the tool correctly.

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 has zero description coverage for the only parameter 'handle'. The description mentions 'a part' but does not explicitly state that the handle parameter identifies that part. This is an important gap because the agent needs to know what value to supply. The description does not compensate for the missing schema documentation.

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 starts with a clear verb and resource: 'Read back the semantic face roles declared on a part'. It distinguishes itself from geometry-related siblings by focusing on semantic roles and explicitly referencing annotate_face as the corresponding write operation. The purpose is unambiguous and specific.

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 description states the tool's context well: it is the read counterpart to annotate_face. However, it does not explicitly name alternative tools like list_faces or query_faces, nor does it provide when-not-to-use guidance. The context is clear enough for an agent to infer when to call this tool, but explicit exclusions are missing.

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

list_facesList FacesA
Read-only

List all faces of a shaped object with stable tags + geometric descriptors.

Returns [{tag, index, kind, area, centroid, normal?, axis?, radius?}, ...]. Tags survive geometry edits as long as the face's surface kind, area, centroid, and (where meaningful) normal/axis/radius do not change. Use the tag in subsequent calls instead of the FaceN index.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes

TDQS

A3.8/5.0
Behavior4/5

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

The description adds meaningful behavioral detail beyond the readOnlyHint and openWorldHint annotations: it explains that tags are stable across geometry edits only as long as key geometric descriptors remain unchanged, and it lists the optional fields in the return value. This helps the agent understand the semantics of the returned tags.

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 compact and front-loaded: it states the action, the return format, the stability behavior, and the recommended usage in three focused sentences. No filler or redundant restatement of the tool name or annotations.

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 simple read-only list tool with one parameter and no output schema, the description covers the return shape, optional fields, and tag stability. The only notable gap is the lack of explicit explanation for the 'handle' parameter, but the overall context is sufficient for the agent to understand the tool's behavior.

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 has one required parameter, 'handle', with no description beyond its title, and schema coverage is 0%. The description discusses faces of a 'shaped object' but never explicitly explains that the handle identifies that object, leaving a meaningful semantic 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 clearly states that the tool lists all faces of a shaped object and returns stable tags plus geometric descriptors. It is specific about the resource (faces) and the output, though it does not explicitly differentiate itself from sibling tools like query_faces or classify_face_sides.

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 description gives clear context: tags survive geometry edits under stated conditions, and the tag should be used instead of the FaceN index in subsequent calls. It does not explicitly mention alternative tools or exclusions, but it provides actionable guidance for when and how to use the returned data.

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

list_objectsList ObjectsA
Read-only

List objects in the active document. Returns [{name, type, label}, ...].

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, and the description is consistent with that. The description adds useful behavioral detail by specifying the active-document scope and the exact return field names, but it does not disclose behavior such as error handling when no document is active or ordering/pagination.

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 a single compact sentence that states the operation, scope, and return format without unnecessary filler. Every element earns its place.

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-parameter read-only listing tool with no output schema, the description is largely complete: it names the scope and the returned tuple. It could be more explicit about prerequisites, such as requiring an open document, and about what 'objects' encompasses, but the core invocation context is sufficiently covered.

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?

The tool has zero parameters and the schema has full coverage, so the parameter-semantics baseline is 4. The description adds relevant context by stating that the result is a list of objects with name, type, and label fields, which meaningfully supplements the empty 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?

The description states a specific action ('List objects') and a clear resource scope ('in the active document'), and it includes the return shape. It is clear enough to be distinguished from sibling tools like list_faces or list_documents, but it does not explicitly call out those alternatives.

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?

The description implies the tool is for retrieving objects from the active document, but it provides no guidance on when to prefer this over sibling listing tools such as feature_list, list_faces, or list_edges. There is no explicit when-not-to-use or alternative routing.

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

list_thread_optionsList Hole Thread OptionsA

Discover the COUPLED ThreadType / ThreadSize enums on the hole tool.

Call with no args to list valid thread_type values. Call with thread_type=... to list the valid thread_size values for that type (the coupling: thread_size='M4' is valid for 'ISOMetricProfile' but not for 'UNC'). Use this BEFORE calling hole(threaded=True, thread_type=..., thread_size=...) to avoid a failed enum-value call.

Returns either {thread_types: [...]} or {thread_type, thread_sizes: [...]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
thread_typeNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only provide readOnlyHint=false, openWorldHint=false, destructiveHint=false, which are not very informative. The description compensates by disclosing the tool's behavior: it returns either {thread_types: [...]} or {thread_type, thread_sizes: [...]}, and it is a discovery/enumeration tool that should be called before hole to avoid failures. It doesn't mention error cases or rate limits, but the return shape and the coupling behavior are well disclosed. A 4 is appropriate because the description adds meaningful behavioral context beyond the sparse annotations.

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 compact and front-loaded. The first sentence states the core purpose, the second explains the two calling modes, the third gives the usage context, and the fourth states the return shape. Every sentence earns its place, and there is no redundant filler. The structure is easy to scan and 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 simple discovery tool with one optional parameter and no output schema, the description is nearly complete. It covers the two calling modes, the return shapes, the coupling semantics, and the recommended usage before hole(). The only thing missing is an explicit note about what happens if an invalid thread_type is passed (e.g., error vs empty list), but this is a minor gap given the tool's simplicity and the strong usage guidance provided.

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 carries the full burden of explaining the single parameter. It does this well: it explains that thread_type is optional, that omitting it lists thread_type values, and that providing it lists valid thread_size values for that type. It also gives a concrete example of the coupling. The only minor gap is that it doesn't explicitly state the parameter's type constraints beyond the example, but the schema already declares it as string|null, so the description adds the crucial semantic meaning.

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 clearly states the tool's purpose: discover the coupled ThreadType/ThreadSize enums on the hole tool. It specifies the exact resource (hole tool enums) and the two modes of operation (no args lists thread_type values; with thread_type lists valid thread_size values). This distinguishes it from siblings like feature_list or recipe_list, which list different kinds of options.

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 explicitly says when to use this tool: BEFORE calling hole(threaded=True, thread_type=..., thread_size=...) to avoid a failed enum-value call. It also explains the two calling patterns and the coupling behavior with a concrete example (M4 valid for ISOMetricProfile but not UNC). This is strong usage guidance that leaves no ambiguity about when to invoke it.

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

list_workspacesList WorkspacesA
Read-only

List the live workspaces (freecadcmd processes) and the pool limits. Each entry is {name, alive, idle_s, current}. Use to see who is holding a slot before claiming or closing one. Returns {current, max, idle_reap_s, workspaces: [...]}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations provide readOnlyHint: true exemplifying non-destructive behavior. The description adds the critical context that this tool shows who holds slots before claiming/closing, and the return object shape. With annotations covering safety, this additional context makes it fully transparent for an agent.

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 concise and well-structured: a single sentence stating purpose flagged with crucial usage guidancechers, followed by brief return format. No extraneous words; it maximizes information density.

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?

Given it has no parameters and no output schema, the description covers the return format and usage context comprehensively. It is sufficient for an AI agent to invoke correctly without additional information.

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?

The tool has no parameters, and schema description coverage is 100% (empty object). The description explains the fields in the output (name, alive, idle_s, current) and the return structure, which is valuable as there is no output schema. This compensates for the absence of parameter details.

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 the tool lists live workspaces (freecadcmd processes) and pool limits, defining each entry's fields and the return object. It clearly distinguishes from siblings by naming the resource (workspaces) and providing a specific verb. It avoids ambiguity and conveys a specific 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?

The description includes 'Use to see who is holding a slot before claiming or closing one,' which clearly indicates context for use. It does not explicitly mention when not to use alternatives, but given the tool's specificity and the absence of closely related siblings (e.g., use_workspace, close_workspace), the usage guidance is sufficient.

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

loftLoftA

Loft (additively) between two or more sketches.

sketches: ordered list of sketch handles. The first becomes the Profile, the rest become Sections. closed: True connects the last section back to the first (toroidal). ruled: True uses straight ruled surfaces between adjacent sections.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoLoft
ruledNo
closedNo
reversedNo
sketchesYes

TDQS

A3.9/5.0
Behavior4/5

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

The description adds behavioral context beyond the annotations by stating that the operation is additive and by explaining the effects of closed and ruled: closed connects the last section back to the first toroidally, and ruled uses straight surfaces. It does not describe reversed or the full consequences of sketch ordering beyond profile/section assignment, but it provides meaningful behavior insight.

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 compact and well-structured: a one-sentence purpose statement followed by a tight parameter list. Every line provides useful information, and there is no filler or repetition of schema titles.

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 description covers the core operation and the most important parameters, but there is no output schema and the reversed parameter is left unexplained. It also does not mention prerequisites or when loft should be chosen over related sibling tools. This makes it adequate for straightforward calls but not fully complete for an agent selecting among many modeling tools.

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?

With 0% schema description coverage, the description must carry the parameter documentation burden. It explains sketches (ordered list, first becomes Profile, rest become Sections), closed (toroidal), and ruled (straight surfaces), but it omits reversed entirely and does not add value to name beyond the schema default. This is partial compensation for the schema gap, not 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?

The description opens with a specific verb-plus-resource statement: 'Loft (additively) between two or more sketches.' This clearly identifies both the operation and the input, and 'additively' helps distinguish it from subtractive or other modeling operations. It also conveys that the tool involves multiple sketches, which separates it from single-profile operations like pad or revolve.

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 description implies when to use the tool: when geometry must be created by lofting between multiple sketches. However, it does not explicitly name alternatives such as sweep, pad, or revolve, nor does it state when those should be preferred. This is useful but only implied usage guidance, not explicit routing.

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

make_assemblyMake AssemblyB

Create an App::Part container to hold linked parts. Returns {handle, name}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoAssembly

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already mark this as non-read-only and non-destructive, and the description adds that it returns {handle, name}. However, it does not disclose side effects like whether it requires an active document or how the new container is attached to the current document context.

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 a single efficient sentence, front-loaded with the action and resource, and it includes the return value. There is no filler or redundant restatement of the tool name.

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 simple one-parameter tool, the description covers the core action and return format. It omits the prerequisite of an active document and any note about how the assembly container relates to the current document, which are relevant given the surrounding document-management sibling tools.

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%: the description never mentions the 'name' input parameter. The schema's default and title make the parameter self-explanatory, but the description was expected to compensate for the low coverage and does not.

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 ('Create') and resource ('App::Part container to hold linked parts'), which clearly states what the tool does and differentiates it from siblings like add_part or merge_assembly. Including the return shape ({handle, name}) further pins down its role.

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?

The description gives no when-to-use guidance, prerequisites, or contrast with alternatives such as add_part or merge_assembly. It only states the action itself, so an agent gets no help deciding between assembly creation and part insertion.

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

make_bodyMake BodyB

Create a PartDesign Body. Subsequent sketches/features go inside it.

Returns {handle, name}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoBody

TDQS

B3.2/5.0
Behavior2/5

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

With readOnlyHint=false and destructiveHint=false, the annotations indicate this is a mutating operation but not destructive. The description adds that the body acts as a container and mentions the return value, but it doesn't disclose whether the body is automatically added to the active document, whether existing bodies are affected, or any prerequisites (e.g., must have an active document).

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 extremely concise, using two purposeful sentences. It front-loads the primary action and immediately follows with the container context and return value, with zero filler.

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 simple creation tool with one optional parameter and no output schema, the description covers the essential behavior. However, it omits any mention of document requirements (e.g., active document needed) or naming rules, which an agent might need for robust invocation.

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?

The input schema has only one optional parameter 'name' with a default, and schema description coverage is 0%. The description doesn't explicitly explain the 'name' parameter, but given its simplicity and default, the baseline of 4 applies because the description compensates adequately for a single self-evident 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 clearly states the action: 'Create a PartDesign Body' and specifies its role as a container for subsequent sketches/features. This distinguishes it from sibling tools like make_sketch or pad, though it doesn't explicitly name them as alternatives.

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?

The description implies usage context ('Subsequent sketches/features go inside it') but provides no explicit when-to-use or when-not-to-use guidance, nor does it reference sibling tools such as make_sketch or add_part as alternatives. This leaves the agent to infer the appropriate sequencing.

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

make_datum_planeMake Datum PlaneB

Create a Datum Plane in a Body.

base: 'XY' | 'XZ' | 'YZ' for body origin planes. Pass a face_tag dict {handle, tag} for attachment to a face on another shape. offset: shift along the plane normal in mm.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseNoXY
bodyYes
nameNoDatumPlane
offsetNo

TDQS

B3.2/5.0
Behavior3/5

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

The description is consistent with the annotations: readOnlyHint=false and destructiveHint=false align with 'Create.' It adds useful context beyond annotations by describing face-tag attachment and offset direction/units. It does not disclose side effects, return values, or behavior around duplicate names, so transparency is partial.

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 compact and front-loaded, with no filler. The core operation appears first, followed by concise parameter-level guidance for base and offset.

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

Completeness2/5

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

For a mutating tool with no output schema and 0% schema description coverage, this description is not complete enough. It omits the meaning of the required body parameter and the name parameter, and it doesn't specify the exact face_tag dict structure or what the tool returns. The schema-type mismatch further reduces confidence in correct invocation.

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 carry parameter semantics. It does explain base choices, face attachment, and offset units, but it leaves body and name undocumented. It also conflicts with the schema by telling the agent to pass a face_tag dict for base when base is typed as a string, which could mislead invocation.

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 clear verb and resource: 'Create a Datum Plane in a Body.' This unambiguously states what the tool does and is distinct from sibling creation tools like make_sketch or add_primitive. It doesn't explicitly contrast it with related tools, so it stops short of a top score.

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 description explains the two base modes (origin planes and face attachment) and the offset behavior, which gives usable invocation guidance. However, it doesn't explicitly state when to prefer this tool over alternatives or mention prerequisites. Usage guidance is implied rather than explicitly scoped.

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

make_drawing_pageMake Drawing PageC

Create a TechDraw page using a built-in A4 landscape template by default. template: optional absolute path to a .svg template.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoPage
templateNo

TDQS

C2.9/5.0
Behavior3/5

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

Annotations include readOnlyHint=false and destructiveHint=false, but these are not contradictory (since creating a page is a mutating but non-destructive action). The description adds minimal behavior: it creates a page, uses a default template, and allows an optional template path. It does not disclose what happens to existing pages, whether the created page becomes active, or how it connects to the document context. Given the annotations are not rich, the description carries the burden; it provides some context but lacks deeper behavioral details.

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 concise, one sentence for the main purpose and one for the template parameter. Information is front-loaded with the core action and default. However, the description could be slightly more structured by separating the parameter explanation, but it is efficient and without fluff.

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

Completeness2/5

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

This is a creation tool with no output schema, no required parameters, and two optional parameters. The description does not explain the context: when to create a drawing page (e.g., before adding views or dimensions), how it integrates with the document (which document is used?), or what the result is (e.g., page object? becomes active?). The sibling list includes many drawing tools, and the description does not help the agent understand how this tool fits into a typical workflow. Given its simplicity, the description is incomplete for effective use.

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%, meaning the description must explain the parameters. It does mention 'template: optional absolute path to a .svg template' which clarifies the template parameter beyond the schema's generic string type. However, it does not describe the 'name' parameter at all—its purpose is implicit (page name) but not stated. With two parameters and zero schema descriptions, this is a significant gap; the description only partially compensates.

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 clear action ('Create a TechDraw page') with a specific resource, and adds the default template detail ('A4 landscape template by default'). It distinguishes itself from related drawing siblings like add_projection_group or export_drawing by focusing on page creation, though it doesn't explicitly name alternatives. The purpose is clear and not a tautology.

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?

The description provides no guidance on when to use this tool versus alternatives—for example, when to use add_projection_group or export_drawing. It does not explain prerequisites such as having an active document or a body to draw, nor exclusion cases (e.g., when a custom template is needed vs default). The only hint is the optional template parameter, but no explicit scenario is given.

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

make_sketchMake SketchB

Create a sketch in a Body, attached to a plane.

plane: 'XY' | 'XZ' | 'YZ' for origin planes, or a datum-plane handle. Returns {handle, name}.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
nameNoSketch
planeNoXY

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already indicate mutation, no destructive effect, and no open-world changes. The description adds the plane options and the return value {handle, name}, which is helpful given no output schema. It doesn't cover side effects or prerequisites, but annotations cover the safety profile.

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?

Two sentences with no filler. The plane options and return value are efficiently packed. It could be expanded, but it does not waste words.

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

Completeness2/5

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

For a 3-parameter tool with no output schema and 0% schema coverage, the description is too thin. It omits body and name semantics, and doesn't connect to follow-on sketch tools or prerequisites. It tells the agent what it returns but not the full invocation contract.

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%, so the description must document parameters. It explains 'plane' with allowed values and datum-plane handle, but 'body' and 'name' are left undocumented. Body is required and likely a handle, yet no hint is given; name's role is absent.

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 (create), resource (sketch), and context (in a Body, attached to a plane). It distinguishes from close_sketch and geometry-add tools by indicating this creates the sketch container itself, though it does not explicitly name sibling tools.

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 description implies this is the entry point for sketching (create before adding geometry) but gives no explicit when-to-use or alternative routing. It doesn't mention that add_sketch_geometry/add_sketch_constraint are needed after, nor when to use a datum plane vs origin plane.

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

mass_propertiesMass PropertiesA
Read-only

Mass properties of a shaped object: volume (mm³), surface area (mm²), centroid, bounding box, inertia tensor. If density (kg/mm³) is given, also returns mass (kg). Steel = 7.9e-6, aluminum = 2.7e-6, ABS = 1.05e-6.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes
densityNo

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already indicate a read-only operation, and the description adds useful behavior: it names the exact output fields, explains the conditional mass calculation when density is provided, and gives concrete typical density values. It does not disclose error behavior or handle requirements, but for a read-only property query the extra context is solid.

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 concise and front-loaded with the output list, followed by the conditional mass behavior and useful material density values. Each sentence earns its place; the only minor issue is that the first sentence is a noun phrase rather than an explicit verb-led statement.

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 no output schema, the description provides a helpful list of return fields and unit annotations. It covers the main thing an agent needs: what the tool returns and how the optional density parameter affects the result. It does not elaborate on handle semantics or error cases, but for a simple read-only calculation tool the description is largely 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 description coverage is 0%, so the description must compensate. It does explain the density parameter well, including units (kg/mm³) and example values, but it does not explain the required handle parameter at all. Since one of two parameters is meaningfully clarified but the required one is left undocumented, this is only a partial pass.

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 identifies the resource ('shaped object') and enumerates the computed properties: volume, surface area, centroid, bounding box, inertia tensor, and optional mass. It does not use a strong main verb like 'calculates' or 'returns' until the second sentence, and it does not explicitly differentiate from sibling tools, so it stops short of a 5.

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?

No guidance is given about when to use this tool versus alternatives such as bounding_box, measure_distance, or other analysis tools. The density examples imply a practical use case, but there is no explicit context, prerequisite, or exclusion.

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

material_getMaterial GetA
Read-only

Look up a material by name (e.g. 'AL6061-T6'). Returns the full property card as SI quantity strings (YoungsModulus, PoissonRatio, Density, yield_strength, fracture_toughness, thermal_conductivity, cte, rough_cost, refractive_index where applicable, source, basis). The structural keys are FEM-card-compatible, so the result feeds fem_set_material directly. On a miss returns {ok:false, reason} with a did_you_mean suggestion.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark it read-only and not open-world, but the description adds substantial behavioral detail: the exact return keys, SI quantity strings, the fact that structural keys are FEM-card-compatible, and the miss behavior with {ok:false, reason} and did_you_mean suggestions. This goes well beyond the annotation-only safety signal.

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 compact, front-loaded with the primary action, and every sentence adds value: the parameter example, the return field list, the compatibility note, and the miss behavior. No filler or redundant phrasing.

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 single-parameter read-only lookup with no output schema, the description fully covers what an agent needs: how to call it, what to expect in the result, how to handle misses, and how the output integrates with fem_set_material. There is no missing prerequisite or edge-case ambiguity.

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% for the single 'name' parameter, so the description carries the full burden. It explains the parameter means a material name and gives a real-world example ('AL6061-T6'), which is sufficient for an agent to know what to pass. It doesn't specify case sensitivity or exact-match rules, but for a simple string that's acceptable.

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 opens with a specific verb 'Look up' and resource 'material by name', includes a concrete example ('AL6061-T6'), and lists the returned fields. It differentiates itself from siblings like material_list and material_select by stating it returns a full property card and names the compatible downstream tool fem_set_material, making its role unambiguous.

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 clearly implies the use case: when you need a material's full property set, especially to feed directly into fem_set_material. It does not explicitly say when not to use it or mention alternatives, but the context is strong enough for an agent to choose it over material_list/material_select in a lookup scenario.

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

material_listMaterial ListA
Read-only

List available materials, optionally filtered to one category ('aluminum' | 'steel' | 'titanium' | 'magnesium' | 'polymer' | 'glass'). Returns {count, category, materials:[{name, category}, ...]} sorted by name.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, and the description adds meaningful behavioral detail: it returns a count, category, materials array, and sorted-by-name ordering. It also enumerates the accepted categories, giving the agent concrete expectations beyond 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.

Conciseness5/5

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

One dense, well-structured sentence that front-loads the purpose, then states the optional filter, return shape, and sort order. Every element earns its place with no repetition or filler.

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 single-optional-parameter list tool with no output schema, the description is complete: it documents allowed parameter values, the response structure, and ordering. An agent has everything needed to call it 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?

The schema provides only a string/null category with no descriptions or enums. The description compensates fully by listing the allowed category values ('aluminum' | 'steel' | 'titanium' | 'magnesium' | 'polymer' | 'glass') and clarifying that filtering is optional. This is essential information for correct invocation.

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 ('List available materials') and clearly distinguishes this from siblings like material_get and material_select. The optional category filter and return shape further clarify exactly what the tool does.

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 description gives clear context: call this to list available materials, optionally constrained to one category. It does not explicitly name when to prefer material_get or material_select instead, but the list-oriented wording makes the appropriate use case reasonably obvious.

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

material_selectMaterial SelectA
Read-only

Ashby-style selection: filter the corpus, then rank survivors.

criteria keys are min_/max_ (e.g. min_yield_mpa, max_density_g_cc, min_service_temp_c). rank_by: specific_strength | specific_stiffness | strength | stiffness | cost | density. Returns {rank_by, count, criteria, candidates:[{name, score, yield_mpa, density_g_cc, youngs_gpa, cost_usd_kg}, ...]} best-first; an empty filter returns no candidates rather than the closest miss.

ParametersJSON Schema
NameRequiredDescriptionDefault
rank_byNospecific_strength
criteriaNo

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses significant behavioral traits: the exact return shape, best-first ordering, and the edge case that an empty filter returns no candidates instead of the closest miss. It also defines the criteria key convention (min_<accessor>/max_<accessor>) with concrete examples. This gives an agent a precise expectation of the tool's behavior.

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 dense but efficiently organized: a one-sentence summary, then a compact breakdown of criteria keys, rank_by values, and return format. Every sentence adds new, useful information. The structure is front-loaded with the core concept and then technical details, making it easy to scan.

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 description is notably complete for a tool with no output schema and minimal parameter documentation: it covers criteria syntax, ranking options, return structure, ordering, and an edge case. Still, it does not explicitly mention the default rank_by or that criteria is optional (both in the schema), and the candidate score field is left unexplained. These are minor gaps given the overall richness.

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?

The input schema has 0% description coverage, and the description compensates well by fully enumerating rank_by options and explaining criteria keys with examples. It also documents the output fields, which helps infer parameter meaning. However, it does not list all possible accessors or specify value types/units, so parameter semantics are strong but not exhaustive.

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 opens with 'Ashby-style selection: filter the corpus, then rank survivors,' which clearly states the tool's purpose with a specific verb and resource. It further differentiates itself from material_get and material_list by describing a multi-step selection workflow. The rank_by and criteria key syntax reinforce the intended functionality.

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 description clearly conveys when to use the tool: when you want to filter a corpus of materials by property thresholds and rank the survivors. However, it does not explicitly mention alternative tools like material_list or material_get or provide any exclusions for when not to use this tool. The context is clear but lacks explicit routing guidance.

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

measure_angleMeasure AngleA
Read-only

Angle (degrees) between two planar faces or two straight edges.

a, b: object handles. a_ref, b_ref: REQUIRED sub-shape references, one per handle. Both must be the SAME kind:

  • face tags ('f_*' from list_faces/query_faces, or 'FaceN', or 1-based int) -> angle is between the faces' outward normals. Faces must be planar.

  • edge tags ('e_*' from list_edges, or 'EdgeN', or 1-based int) -> angle is between the edges' tangent directions. Edges must be straight. Mixing a face ref with an edge ref, a non-planar face, or a curved edge raises.

Units: degrees. Returns:

  • angle_deg: raw angle between the two direction vectors, 0..180.

  • supplement_deg: 180 - angle_deg (the complementary angle; use this for the acute reading when angle_deg is obtuse).

  • kind: "face" or "edge". Two adjacent box faces -> angle_deg 90. Two opposite parallel box faces -> angle_deg 180, supplement_deg 0. Read-only: measures, creates no geometry.

ParametersJSON Schema
NameRequiredDescriptionDefault
aYes
bYes
a_refYes
b_refYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations carry readOnlyHint=true, and the description confirms and expands on it: 'Read-only: measures, creates no geometry.' It adds error-raising behavior for mixed ref kinds, non-planar faces, and curved edges, plus the angle_deg/supplement_deg semantics and worked examples. This goes well beyond what the annotations provide.

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 in the first sentence, and the longer body is justified: every section (param formats, error conditions, return values, examples) adds information required because the schema and output schema are empty. No filler sentences present.

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?

Complete despite 4 undocumented required params and no output schema: it documents all parameters, the return object (angle_deg, supplement_deg, kind), units, error conditions, and worked examples. An agent can call this tool correctly without opening any other reference.

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?

With schema description coverage at 0%, the description carries the full burden and succeeds: it defines a and b as object handles and specifies accepted formats for a_ref/b_ref ('f_*', 'FaceN', 1-based int; 'e_*', 'EdgeN'), the same-kind constraint, and the raising conditions for invalid combinations.

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 and resource: 'Angle (degrees) between two planar faces or two straight edges.' The scope is unambiguous — angle measurement only — and the tool's identity is clear against siblings like measure_distance and min_clearance even without naming them.

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?

Provides extensive how-to guidance (same-kind refs, tag formats, error conditions) but says nothing about when to choose this tool over alternatives such as measure_distance or min_clearance. No exclusions or routing conditions are given, so tool-selection guidance is implied rather than explicit.

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

measure_distanceMeasure DistanceA
Read-only

Minimum distance between two entities, in mm. The workhorse measurement tool: lets a blind agent verify gaps, clearances, and contact.

Args: a: handle of the first object. b: handle of the second object. a_ref: optional sub-shape selector on a to measure FROM instead of the whole solid -- an f_* face tag, an e_* edge tag, or a literal "FaceN"/"EdgeN" (1-based). Omit to use the whole shape. b_ref: optional sub-shape selector on b (same forms as a_ref).

Measures the minimum (closest-approach) distance, so distance_mm = 0 means the two entities touch or interpenetrate. This does NOT report overlap volume -- use min_clearance / interference_check for penetration depth.

Returns a dict (no handle; this is a measurement): distance_mm: float -- minimum gap in mm (0.0 when touching/intersecting). point_on_a: [x, y, z] mm -- closest point on a (or its sub-shape). point_on_b: [x, y, z] mm -- closest point on b (or its sub-shape). touching: bool -- True when distance_mm < 1e-7.

ParametersJSON Schema
NameRequiredDescriptionDefault
aYes
bYes
a_refNo
b_refNo

TDQS

A5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description explains the closest-approach semantics, that 0.0 means touching/intersecting, the touching threshold of 1e-7, and that the return is a dict with no handle. These are meaningful behavioral details that help an agent interpret results and avoid misuse.

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 well-structured: a one-line summary, then Args, behavior notes, and a Returns dict. Every sentence adds information, and the most important distinction (closest-approach vs overlap volume) is called out clearly. It is thorough without being bloated.

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 measurement tool with no output schema and no parameter descriptions in the schema, this definition fully covers what an agent needs: parameters, return fields, units, edge cases, and exclusions. There are no critical gaps that would prevent correct invocation or interpretation.

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 carries the full burden of parameter documentation. It explains that a and b are handles, and precisely defines a_ref and b_ref as optional sub-shape selectors with allowed forms (f_* face tags, e_* edge tags, or literal FaceN/EdgeN) and the default behavior when omitted. This far exceeds what the bare input schema provides.

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 operation: 'Minimum distance between two entities, in mm', with a clear resource (two entities) and the measurement outcome. It also differentiates from siblings by noting this does NOT report overlap volume and explicitly names min_clearance / interference_check for that purpose, so an agent can distinguish it from related measurement tools.

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 explicitly says when to use the tool: 'lets a blind agent verify gaps, clearances, and contact.' It also gives an explicit when-not and alternative: 'This does NOT report overlap volume -- use min_clearance / interference_check for penetration depth.' This is clear routing guidance beyond what the schema or annotations provide.

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

mechanism_kinematicsMechanism KinematicsA
Read-only

Closed-form planar mechanism kinematics — exact, NO external solver (the static pre-check / gate for mechanism_simulate_submit). Pick mechanism:

  • 'fourbar': link lengths crank/coupler/rocker/ground -> {mobility_dof (=1), grashof: {condition, type, input_crank_fully_rotates, shortest}, reachable, n_reached, coupler_path [[x,y]...], reachable_bbox_mm}. config 'open'|'crossed'.

  • 'slider_crank': crank_mm/conrod_mm (+ wrist_offset_mm) -> {stroke_mm (exactly 2·R in-line, independent of conrod), x_tdc_mm, x_bdc_mm, inline_stroke_exact}.

  • 'gruebler': n_links (incl. ground) + joints ([{type}...]) -> {mobility_dof}.

Returns the per-mechanism dict above. Raises on an unknown mechanism or a link set that cannot close.

ParametersJSON Schema
NameRequiredDescriptionDefault
crankNo
configNoopen
groundNo
jointsNo
planarNo
rockerNo
couplerNo
n_linksNo
n_stepsNo
crank_mmNo
conrod_mmNo
mechanismNofourbar
wrist_offset_mmNo

TDQS

A4.4/5.0
Behavior4/5

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

With readOnlyHint=true and openWorldHint=false, the safety profile is already annotated. The description adds meaningful behavioral context: exact closed-form calculations, no external solver, static gating role, and exception behavior for unknown mechanisms or impossible link sets. These go beyond the annotations and help set expectations.

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 the key distinction and then organized into compact mechanism-specific bullets. Every sentence adds necessary mapping or output information, and the structured format makes it easy for an agent to quickly extract the relevant input/output contract.

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?

Since there is no output schema, the description does well by detailing return dicts for all three mechanisms plus failure behavior and its relationship to mechanism_simulate_submit. Minor gaps remain around n_steps semantics and the allowed values for joint types, but the core invocation contract is largely 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 description coverage is 0%, so the description carries the burden of explaining parameters. It explicitly maps crank/coupler/rocker/ground and config to fourbar, crank_mm/conrod_mm/wrist_offset_mm to slider_crank, and n_links/joints to gruebler. However, it does not explain the planar or n_steps parameters, and joint type values are left underspecified.

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 clearly states the tool computes closed-form planar mechanism kinematics and explicitly identifies itself as the static pre-check/gate for mechanism_simulate_submit. It distinguishes the three supported mechanism variants and specifies exactly what each returns, leaving no ambiguity about the tool's 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?

The description places the tool as the exact, solver-free static pre-check before mechanism_simulate_submit, which gives clear when-to-use context relative to its main sibling. It does not explicitly enumerate exclusion criteria or detail when to prefer each mechanism variant, but the mechanism breakdown implies the selection logic.

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

mechanism_simulate_submitMechanism Simulate SubmitA

Simulate a rigid-link mechanism's DYNAMICS with PyBullet, asynchronously (the MBD family; requires the mbd extra — pip install 'ankusdrive[mbd]'). Use mechanism_kinematics first for the exact closed-form gates (DOF, Grashof, stroke).

links is a tree: [{name, box_mm:[lx,ly,lz], mass_g, parent (link index, −1 = fixed base), joint_type ('revolute'|'prismatic'|'fixed'), joint_axis:[x,y,z], joint_at_mm:[x,y,z] (in the parent frame), com_mm:[x,y,z]}]. drivers: [{link, rate_dps}] (revolute) or [{link, rate_mm_s}] (prismatic). Optional obstacles ([{box_mm, at_mm}]) for through-motion contact, base, gravity (m/s², default [0,0,−9.81]), dt_s, duration_s. gears ([{link_a, link_b, ratio, axis?, max_force?}]) couples two revolute links by ω_b = −ω_a/ratio (ratio = Nb/Na for an Na/Nb external mesh) — the moving image of the gear-train ratio gate.

Returns immediately. If PyBullet is absent: {ok:false, reason, install, mobility_dof, n_links}. Otherwise {job_id, status, cache_hit, mobility_dof}; poll job_result(job_id) for {trajectories, orientations (per-link world quaternion, sampled with trajectories), max_torques, collisions_through_motion (with the sim time of each contact), reachable_envelope {bbox_mm}, mobility_dof}.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseNo
dt_sNo
gearsNo
linksYes
driversNo
gravityNo
obstaclesNo
duration_sNo
loop_closuresNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only convey non-read-only/non-destructive. The description adds the essential behavioral contract: the call returns immediately, the PyBullet-missing fallback shape, the job_id/status return, and the requirement to poll job_result. This is exactly the behavioral context an agent needs beyond the sparse annotations.

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: purpose, prerequisite, parameter semantics, then output contract. Inline code formatting aids scannability. Some phrases such as 'the moving image of the gear-train ratio gate' add jargon without clear value, and the block is long, though 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?

Given no output schema and no parameter descriptions, the description supplies nearly everything: install prerequisite, workflow order, async/polling behavior, error fallback, and the full job_result payload. It would be fully complete if the `loop_closures` parameter were documented.

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 does the heavy lifting. It gives units and structure for links, drivers, obstacles, base, gravity, dt_s, duration_s, and the gear formula. The only gap is `loop_closures`, which appears in the schema but is never explained in the description.

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 precise operation: simulating rigid-link mechanism DYNAMICS with PyBullet asynchronously. It distinguishes itself from the sibling mechanism_kinematics by explicitly directing users to run kinematics first for closed-form gates, so an agent can tell which tool to select.

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?

Provides explicit workflow guidance: use mechanism_kinematics first for DOF/Grashof/stroke gates, then submit the dynamics simulation. Also states the required `mbd` extra installation and the async pattern of returning immediately and polling job_result.

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

merge_assemblyMerge AssemblyA

Construct-up an assembly from a manifest JSON (the coordinator's one call): create the doc, link each component by file path, place it, recompute, and run the gates. Component files resolve relative to the manifest's directory; links auto-reload, so re-running picks up updated components (deterministic, idempotent).

manifest shape: { "name": "gearbox", "root": "gearbox.FCStd", "components": {"": {"file": "rel/part.FCStd", "object": ""?, "envelope": {"min":[...],"max":[...]}?}}, "instances": [{"component":"", "name":""?, "placement": [x,y,z] | {position,axis,angle_deg}, "mate": {"child_iface","parent","parent_iface", "verify_align":{"child_iface","parent_iface"}?}?}], "mates": [{"child","parent","child_iface","parent_iface", "verify_align":{...}?}]? }

Placement positions anchors; mate-by-frame positions everything else by aligning published interface frames (see publish_interface).

Any component carrying a PERFORMANCE contract (declare_performance, #226) is gated on it too, with no manifest opt-in: the merge consults the verdict verify_performance last RECORDED on that part and never measures, so it stays synchronous and deterministic. A requirement measured as NOT met fails the merge; a requirement with no verdict yet is neither passed nor failed and rides in report["performance"]["skipped"] — "unverified" is never read as "fine".

Returns {assembly, doc, root, placed, gates:{interference, bom, envelope, interface_align?, typed?, requirements?, mobility?, performance?}, ok, requirements?, mobility?, performance?, children?, library?}. The performance gate and report block are absent entirely when no component declares a contract.

ParametersJSON Schema
NameRequiredDescriptionDefault
manifestYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations are minimal (not read-only, not destructive), so the description carries the burden—and it does so richly. It discloses that a document is created, components are linked by path, links auto-reload, behavior is deterministic and idempotent, and performance gating consults last-recorded verdicts rather than measuring live. The nuanced 'skipped not fine' semantics are explicitly spelled out.

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 long but front-loaded with the primary action, and every section earns its place: manifest schema, link/recompute behavior, performance gate semantics, and return shape. There is minimal fluff; even the warning 'unverified is never read as fine' is essential behavioral nuance. The structure makes a complex contract digestible.

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 no output schema, the description lists the full return object and notes when the performance block is absent. It also documents the manifest format and key behavioral guarantees. An agent has nearly everything needed to select and invoke the tool correctly; only malformed-manifest error handling is not mentioned, which is not essential for invocation.

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?

The schema only provides a required string 'manifest' with zero description coverage. The tool description fully compensates by specifying the entire manifest JSON shape, including components, instances, placements, mates, optional fields, and the performance contract handling. Field semantics such as placement anchoring versus mate-by-frame alignment are explained, making the single parameter unambiguous.

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 opens with a specific verb and resource—'Construct-up an assembly from a manifest JSON'—and then details the exact pipeline (create, link, place, recompute, run gates). It clearly distinguishes merge_assembly from sibling assembly tools like make_assembly or add_part by positioning it as the coordinator's one-call entry point.

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 description gives clear context: it is the coordinator's one call, safe to re-run due to idempotency, and automatically gates on performance contracts without opt-in. It does not explicitly name alternative tools or exclusion cases, so it stops short of a 5, but the context is strong enough for an agent to decide when this is appropriate.

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

min_clearanceMin ClearanceA
Read-only

Closest approach between two solids — the measured gap, richer than the binary interference_check. a and b are object handles. All lengths mm, volumes mm³.

Returns a dict: status: "clear" (a positive gap separates them), "contact" (faces/edges touch, gap ~ 0), or "interference" (the solids interpenetrate / share material). clearance_mm: minimum distance between the two solids (mm). 0.0 when they are touching or interfering. overlap_volume_mm3: volume of interpenetration (mm³). Present ONLY when status == "interference". point_on_a: [x,y,z] of the closest point on a. Present when status is "clear" or "contact" (omitted for "interference"). point_on_b: [x,y,z] of the closest point on b. Present when status is "clear" or "contact" (omitted for "interference").

ParametersJSON Schema
NameRequiredDescriptionDefault
aYes
bYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the tool is known to be safe and deterministic. The description adds significant behavioral detail: it defines the three possible statuses, the meaning of clearance_mm (0.0 when touching/interfering), the conditional presence of overlap_volume_mm3, and the omission of point fields for interference. This gives a complete picture of the output behavior beyond the annotations.

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 well-structured with a clear initial summary, followed by a formatted list of return fields. It front-loads the core purpose and units, then details the output. Some verbose wording could be trimmed, but every sentence adds value, and the layout aids comprehension.

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?

Given the tool's complexity (multiple output statuses and conditional fields), the description is thorough in explaining return values, units, and the meaning of statuses. It lacks an explicit output schema, but the description covers the essential behavioral aspects. It does not mention edge cases like invalid handles or numerical precision, but these are less critical for a read-only query.

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 parameters are just strings with no schema documentation. The description explains that `a` and `b` are 'object handles' and that all lengths are in mm, which is essential context for invoking the tool correctly. This compensates well for the lack of schema detail, though it could further specify the expected format of the handles (e.g., IDs vs paths).

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 clearly states a specific verb ('measured gap') and resource ('between two solids'), and explicitly differentiates from the sibling `interference_check` by noting it is 'richer than the binary interference_check'. This distinguishes it from similar geometric query tools.

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 description implies when to use it (when a richer measure than binary interference is needed) but does not explicitly state when not to use it or mention alternatives beyond indirectly referencing `interference_check`. It provides clear context for typical use cases but lacks formal exclusions.

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

mirroredMirroredA

Mirror a PartDesign feature across a plane.

plane: 'XY'|'XZ'|'YZ' for body origin planes, a datum-plane handle string, or {handle, face: tag|'FaceN'} for a face-defined mirror plane.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoMirrored
planeNoYZ
featureYes

TDQS

A3.9/5.0
Behavior3/5

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

The annotations already indicate this is a mutating operation (readOnlyHint=false) and not destructive (destructiveHint=false). The description adds useful behavioral detail about the accepted plane forms, but it does not disclose side effects, prerequisites, or how the mirrored feature relates to the original.

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 compact and well-structured: one sentence states the operation, and the second provides the only non-obvious parameter syntax. There is no filler, and the key information is front-loaded.

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 3-parameter mutation tool with no output schema, the description covers the core operation and plane syntax adequately. However, an agent still lacks guidance on how to reference the input feature and what the result of the operation will be, making the definition sufficient but not complete.

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 carries the documentation burden. It explains the plane parameter's allowed formats in detail, which is valuable, but it does not clarify the required 'feature' parameter or the optional 'name' parameter beyond their schema titles.

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 ('Mirror') and a specific resource ('a PartDesign feature'), and further clarifies the operation by describing the plane types accepted. This clearly distinguishes it from sibling feature-modification tools like pad, pocket, linear_pattern, or polar_pattern.

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 description gives clear context: this tool is used when mirroring a PartDesign feature across a plane, and it explains the plane options. It does not explicitly name alternatives or exclusions, but it provides enough context that an agent can correctly select it without misleading guidance.

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

moldability_checkMoldability CheckA
Read-only

Geometry-aware moldability DFx screen — resolves the model handle's solid, samples local wall thickness per face via inward chords (the same machinery as optics_moldability_check), then grades it through the pure-Python moldability screen: WALL-THICKNESS QUALITY (recommended-band range / uniformity / sink risk, cooling tied to the thickest wall) + the CTE SHRINKAGE estimate for the resin. Low-fidelity gate — escalate_to= 'molding_fill_submit'.

material drives the recommended-wall band, the CTE shrinkage, and cooling (degrades gracefully when the corpus lacks the issue #106 fields). nominal_mm anchors the range check (else the sampled-wall mean). The same shrinkage/thickness overrides as moldability_screen apply.

Returns the moldability_screen verdict {thickness:{…}, shrinkage:{…}, pass, score, fidelity, band_pct, warnings, escalate_to} plus {n_faces, n_wall_samples}.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYes
materialNo
fail_ratioNo
nominal_mmNo
warn_ratioNo
alpha_per_kNo
sink_factorNo
t_ambient_cNo
t_solidify_cNo

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, and the description adds substantial non-obvious behavior: local wall-thickness sampling via inward chords, the pure-Python screening logic, graceful degradation when corpus fields are missing, and the exact returned verdict plus sample counts. Nothing contradicts the read-only annotation.

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 dense but every sentence earns its place: purpose, method, fidelity level, key parameter effects, and return shape. It front-loads the core behavior and uses code formatting for parameter names and output keys, making it easy to scan.

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?

Given no output schema, the description compensates by spelling out the return structure. It covers the main behavior, key parameters, fidelity, escalation, and degradation. Minor gaps remain around the threshold/override parameters, but overall an agent can call and interpret this tool correctly without outside documentation.

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 does explain `material` (drives wall band, CTE shrinkage, cooling) and `nominal_mm` (anchors range check), and references 'same shrinkage/thickness overrides as moldability_screen apply.' However, it does not explain fail_ratio, warn_ratio, alpha_per_k, sink_factor, t_ambient_c, or t_solidify_c, leaving meaningful gaps for a 9-parameter tool.

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 precise verb-resource pair: it resolves the model handle's solid, samples wall thickness, and grades it through the moldability screen. It also distinguishes itself from nearby siblings by explicitly invoking optics_moldability_check machinery, returnable moldability_screen verdict fields, and escalation to molding_fill_submit.

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 description clearly positions this as a 'Geometry-aware moldability DFx screen' and 'Low-fidelity gate' with an explicit escalate_to='molding_fill_submit' path. It gives clear context for when to use it, though it stops short of explicitly enumerating when to prefer moldability_screen or optics_moldability_check instead.

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

moldability_screenMoldability ScreenA
Read-only

Moldability DFx screen (NO solver, NO geometry) — fast analytic gate combining two checks molders reason about first: (1) WALL-THICKNESS QUALITY — is the nominal wall in the resin's recommended moldable band, and is the section uniform enough (uniformity_ratio = t_max/t_min; warn >2, fail >3) to avoid sink/warp; thick-lobe samples (> sink_factor·nominal, k≈1.5) flagged; cooling tied to the thickest wall (t ∝ s²). (2) SHRINKAGE — first-order from the resin CTE: S_linear = alpha·ΔT, S_vol ≈ 3·S_linear, cavity_scale_factor = 1/(1−S_linear); semicrystalline resins (PP/PE/PA/POM/PLA/HDPE/LDPE) flag model_underpredicts and carry a published_shrinkage_pct.

Pass wall_samples (local wall thicknesses, mm) and/or nominal_mm, plus material. Degrades gracefully when the corpus lacks the (issue #106) recommended-wall / mold-shrinkage / crystallinity fields. Low-fidelity gate: escalate_to='molding_fill_submit'.

Returns {thickness:{…}, shrinkage:{…}, material, pass, score, fidelity, band_pct, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
materialNo
fail_ratioNo
nominal_mmNo
warn_ratioNo
alpha_per_kNo
sink_factorNo
t_ambient_cNo
t_solidify_cNo
wall_samplesNo

TDQS

A4.5/5.0
Behavior5/5

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

With only readOnlyHint and openWorldHint annotations, the description carries the behavioral burden and does so thoroughly: no solver/geometry, graceful degradation when corpus fields are missing, semicrystalline resins flagging model_underpredicts, threshold values, and the shrinkage formula. It adds substantial context beyond the annotations and does not contradict them.

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 a strong first line and organized into numbered checks, formulas, and a return-key list; nothing is fluff. The density of information makes it a somewhat heavy block to scan, but the structure helps navigation.

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 tool with no output schema, the description gives inputs, formulas, degradation behavior, escalation guidance, and a return-key list, which is strong. Still, return values like band_pct, score, and fidelity are only named, not interpreted, so some output semantics must be inferred.

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?

With 0% schema description coverage, the description compensates well: wall_samples are given units, warn/fail thresholds map to warn_ratio/fail_ratio, sink_factor is explained via k≈1.5, and alpha·ΔT grounds alpha_per_k/t_ambient_c/t_solidify_c. However, t_ambient_c/t_solidify_c and nominal_mm units are only implicit, and the exact parameter names are not explicitly linked to their meanings.

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: a 'Moldability DFx screen' with 'NO solver, NO geometry' and a 'fast analytic gate'. The description names the two concrete checks (wall-thickness quality and shrinkage), so an agent can distinguish it from full molding/fill simulation tools.

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?

Clearly frames when to use it: as a low-fidelity analytic gate, with escalation to 'molding_fill_submit' for higher-fidelity work. It also states what it is not ('NO solver, NO geometry'), though it does not explicitly contrast with similarly named siblings like molding_screen or moldability_check.

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

molding_fill_submitMolding Fill SubmitA
Destructive

Injection-molding FILL (+ optional PACK/COOL) solve, asynchronous — the higher- fidelity twin molding_screen escalates to. Answers can this geometry actually be molded: short-shot / fill ability (the strongest, most reliable gate), fill time, and a peak injection-pressure proxy — a real two-phase (melt + air) flow solve, not the spiral-flow correlation. Requires an OpenFOAM binary; when none resolves this returns {ok:false, reason, install} rather than raising.

Backend: when the openInjMoldSim binary resolves (GPL-3.0, a modified compressibleInterFoam on OpenFOAM-7 .org — Cross-WLF + 2-domain Tait), the worker generates and runs an OF7-org case from the params below (or runs a prepared case_dir if given) — a pressure-driven, non-isothermal plaque fill with the Cross-WLF/Tait coefficients pulled from the materials corpus for resin. Where that build is absent it falls back to a 2-D plaque-cavity interFoam VOF case on the existing OpenFOAM (.com/ESI) — same physics family, answers fill/short-shot but not packing. The GPL solver is held at the subprocess boundary (never imported).

openInjMoldSim (OF7) params: resin (corpus key, default "PS"), length_mm, wall_thickness_mm (gap), depth_mm, nx/ny, peak_pressure_mpa (gate ramp, default 2), melt_temp_c (220), mold_temp_c (60), wall_h_w_m2k (wall heat- transfer coeff; default ~adiabatic for a clean fill — raise for freeze-off), fill_end (terminate fraction, default 0.98). Pass application to force the interFoam-prepared path.

Packing/cooling (openInjMoldSim only): set stages="fill_pack" to also run the cooling continuation after fill (seal the gate, switch walls to cooling, hold). Knobs: pack_phases (default 2), cool_window_s (cooling duration; default a few× the fill time — note a 1 mm wall cools in ~seconds, so a short window gives partial cooling), eject_temp_c (for cooling-time; default 80), pack_wall_h_w_m2k (cool-side wall coeff; default 1250). The pack result adds pack:{rho_mean_final, rho_min, volumetric_shrinkage_pct, frozen_fraction, cooling_time_s, residual_pressure_pa} and pack_gate:{pass (on sink risk), score, volumetric_shrinkage_pct, expected_densification_pct (Tait-EOS), pvt_faithful, sink_risk, warnings}.

Net mold shrinkage (the cavity-sizing number; issue #116) — distinct from pack_gate's raw-PVT densification. The fill_pack result also models the packing-feed make-up (melt fed at the hold pressure until the gate freezes at the Tait no-flow transition; only the uncompensated post-gate-freeze densification is net shrinkage) and gates it against the resin's published linear band. hold_pressure_pa (effective cavity packing pressure; default = the ramp peak), room_temp_c (free-part relax temperature; default 23). Adds net_shrinkage:{net_linear_pct, net_vol_pct, raw_vol_pct, compensated_vol_pct, gate_freeze_temp_k} and shrinkage_gate:{pass (in corpus band), score, net_linear_pct, corpus_band_pct, in_band, warnings}. Plus cooling_dT_through_k — the antisymmetric through-thickness differential auto-derived from the cooling field, ready to flow straight into molding_warpage_submit (pass it, or pass this result's case_dir+nx/ny as cooling_case_dir etc.).

Asymmetric per-wall cooling (#134): set pack_wall_h_low_w_m2k and pack_wall_h_high_w_m2k (the y=0 and y=H mold-face heat-transfer coeffs) to DIFFERENT values to model an asymmetric cool — the case is meshed with split wallLow/wallHigh patches and each face cools at its own rate, freezing a real through-thickness bending differential. This is what makes the live cooling_dT_through_k nonzero (a symmetric cool correctly gives ≈0 → no warp). The part bows toward the slower-cooled (lower-h, hotter, last-to-freeze) face; the result adds asymmetric_cooling:{pack_wall_h_low_w_m2k, pack_wall_h_high_w_m2k, warps_toward}. Leave both unset (or equal) for the default symmetric cool. Feed the resulting case_dir into molding_warpage_submit to predict the warp magnitude.

Drive the interFoam path with cavity + process params:

  • length_mm (flow length, default 100), wall_thickness_mm (cavity height, default 2), depth_mm (out-of-plane, default 1), mesh nx/ny.

  • inject_velocity_m_s OR flow_rate_cm3_s (+ optional gate_height_mm for the gate area) — the melt mean inlet speed.

  • melt rheology: melt_rho_kg_m3 (default 900), melt_nu_m2_s (kinematic, default 1e-3) for Newtonian, or a carreau {nu0,nuInf,k,n} BirdCarreau dict (the shear-thinning Cross-WLF stand-in).

  • end_time_s (run bound; default ≈4× the plug-flow fill time), machine_max_pressure_pa (press limit, default 180 MPa), fill_fraction_pass (full-fill threshold, default 0.97). Or pass a prepared case_dir to run the resolved solver directly.

Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result. interFoam result: {ok, returncode, backend, case_dir, expected_fill_time_s, flow_length_ratio, fill:{filled_fraction, filled_cell_fraction, front_x_frac, last_to_fill_x_frac, max_pressure_pa}, gate:{pass, score, fidelity:"solve", band_pct, short_shot, fill_time_s, max_pressure_pa, pressure_ok, warnings}}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nxNo
nyNo
resinNo
stagesNo
carreauNo
case_dirNo
depth_mmNo
fill_endNo
length_mmNo
end_time_sNo
applicationNo
melt_temp_cNo
mold_temp_cNo
pack_phasesNo
room_temp_cNo
eject_temp_cNo
melt_nu_m2_sNo
wall_h_w_m2kNo
cool_window_sNo
gate_height_mmNo
melt_rho_kg_m3No
flow_rate_cm3_sNo
hold_pressure_paNo
pack_wall_h_w_m2kNo
peak_pressure_mpaNo
wall_thickness_mmNo
fill_fraction_passNo
inject_velocity_m_sNo
pack_wall_h_low_w_m2kNo
pack_wall_h_high_w_m2kNo
machine_max_pressure_paNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already indicate a non-read-only, potentially destructive tool, and the description adds substantial behavioral context: asynchronous execution with job_id polling, graceful {ok:false, reason, install} return when OpenFOAM is absent, a GPL solver isolated at the subprocess boundary, fallback to a different solver, and detailed result shapes. This goes well beyond the structured annotations.

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 long, but it is structured with bolded sections and front-loaded with the core purpose in the first paragraph. Given 31 undocumented parameters and complex backend behavior, the length is largely justified. A few implementation details (GPL licensing, issue numbers) could be trimmed, but they do not obscure the main usage guidance.

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 no output schema, the description compensates by detailing return payloads for both solver paths, including pack, shrinkage, gate, and asymmetric-cooling result keys. It also covers async submission, polling, required binaries, fallback behavior, and cross-tool data flow. An agent has enough context to invoke and interpret this complex 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 coverage is 0%, so the description is the only source of parameter meaning, and it delivers: nearly all 31 parameters are explained with units, defaults, grouping by backend, and choices (e.g., inject_velocity_m_s OR flow_rate_cm3_s, pack_wall_h_low/high for asymmetric cooling). It also distinguishes openInjMoldSim params from interFoam params.

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 opens with a specific verb-and-resource statement: an injection-molding FILL solve with optional PACK/COOL, asynchronous. It explicitly positions itself as the higher-fidelity twin molding_screen escalates to, and states the core questions it answers (short-shot/fill ability, fill time, peak injection-pressure proxy). This clearly separates it from sibling molding tools.

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 names molding_screen as the lower-fidelity predecessor and says this tool is what it escalates to, giving a concrete when-to-use signal. It also states prerequisites (OpenFOAM binary), the fallback path, and how to force the interFoam path via application. Downstream hand-off to molding_warpage_submit is also described.

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

molding_screenMolding ScreenA
Read-only

Injection-molding screen (NO solver): one-term cooling time (exact given α, t_cool = s²/(π²α)·ln(8·(T_melt−T_mold)/(π²·(T_eject−T_mold))) — the t ∝ s² design lever) + the spiral-flow fill check (fill_ok when flow_length ≤ (L/t-limit)·wall — chart correlation, ±30 %). material picks per-polymer defaults (ABS | PP | PC | PA66 | POM | HDPE | PS), each individually overridable; with all temps + alpha_mm2_s explicit no material is needed. A cooling-only call returns fidelity='exact'; adding flow_length_mm makes the headline answer fidelity='correlation', band_pct=30 (cooling stays exact). When a flow_length_mm is given the headline check is a chart correlation, so escalate_to='molding_fill_submit' (the openInjMoldSim VOF fill solve, #105); a cooling-only call needs no solver and returns escalate_to=None.

Returns {material, wall_thickness_mm, t_melt_c, t_mold_c, t_eject_c, alpha_mm2_s, cooling_time_s, flow_length_mm, flow_ratio, flow_ratio_limit, fill_ok, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
materialNo
t_melt_cNo
t_mold_cNo
t_eject_cNo
alpha_mm2_sNo
flow_length_mmNo
flow_ratio_limitNo
wall_thickness_mmYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations provide readOnlyHint=true, and the description aligns by stating 'NO solver'. It adds rich behavioral context: fidelity values ('exact' vs 'correlation'), band_pct=30 for the correlation, and the escalate_to field that routes to a solver. It also describes that cooling remains exact even when flow_length is added, clarifying mixed-fidelity behavior. No contradiction with annotations.

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 technical, containing a formula, material list, conditional behavior, and return fields. It is structured in a logical flow (purpose, formula, conditions, escalation, outputs) and every sentence adds value. It could be slightly trimmed, but given the tool's complexity, the length is justified and 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 complex tool with 8 parameters, no output schema, and no schema descriptions, the description covers most essential context: formula, materials, fidelity, escalation, and return fields. It lists all return fields but does not explain semantics for some (e.g., valid_range_ok, warnings). Also flow_ratio_limit input semantics are not fully clarified. Still, it is largely complete for an agent to call correctly.

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?

With 0% schema coverage, the description compensates well. It explains material (per-polymer defaults, individually overridable), wall_thickness_mm as the s in the formula, alpha_mm2_s as α, temps (T_melt, T_mold, T_eject), and flow_length_mm. It also clarifies when material is unnecessary. However, flow_ratio_limit is not explicitly described as an input parameter, and its role in the fill check is only implied via 'L/t-limit'. This is a minor gap given 0% schema coverage.

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 clear, specific purpose: an injection-molding screening tool that computes a one-term cooling time and optionally a spiral-flow fill check, explicitly labeled 'NO solver'. It distinguishes itself from siblings like molding_fill_submit (the VOF fill solve) and molding_warpage_submit by noting it is a screen, not a full simulation, and even names the escalation target.

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 usage conditions: 'cooling-only call' vs 'adding flow_length_mm', and instructs that when flow_length_mm is given the headline check is a correlation and should escalate to molding_fill_submit, while a cooling-only call needs no solver. It also notes that if all temps and alpha are explicit, no material is needed, guiding parameter use.

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

molding_warpage_submitMolding Warpage SubmitA
Destructive

Injection-molding WARPAGE / residual distortion, asynchronous — the FEM thermo-elastic post-step of the cooling solve (GitHub issue #113 Part B; the higher-fidelity twin of the #104 CTE shrinkage screen). Answers will the part bow out of flat once it cools and is ejected. Requires the ccx (CalculiX) binary; when none resolves this returns {ok:false, reason, install} rather than raising.

The physics: a moulding shrinks as it cools (CTE); uniform shrinkage just makes it smaller, but differential shrinkage warps it. The dominant driver is the asymmetric frozen-in through-thickness temperature field at ejection (an unbalanced cooling layout, one mould half hotter, a rib on one face). Pass that as dT_through_k (K, the through-thickness differential: T at the thin-face minimum minus the maximum). The worker meshes body, imposes the field as a thermal eigenstrain, pins a statically-determinate 3-2-1 constraint, and solves the free linear-elastic distortion in ccx. A balanced field (dT_through_k≈0) warps ~0; an asymmetric one bows to the analytic plate curvature (κ=α·ΔT/h), directionally correct.

Backend: CalculiX (ccx), driven by a deck the worker writes directly (the GPL solver is held at the subprocess boundary, never imported). Units mm / MPa / 1/K / °C, so warp comes back in mm.

Coupled cooling hand-off (issue #116): instead of hand-passing dT_through_k, pass cooling_case_dir (a molding_fill_submit(stages="fill_pack") result's case_dir) with cooling_nx/cooling_ny (the cooling case mesh; defaults 60/8) and optional cooling_nz/cooling_time — the worker reads that cooling solve's cell- centre temperature field and auto-derives the antisymmetric (bending) through- thickness differential. The result reports dT_through_k and dT_source.

Params: body (a shape handle — the part), and either dT_through_k or cooling_case_dir (one is required). Material elastic props from material (corpus card) or explicit youngs_mpa/poisson/ cte_per_k — solidified-resin defaults are used with a warning otherwise (the corpus rheology cards don't carry structural props). ref_temp_c is the stress- free / solidification temperature (warp is invariant to it — it only scales the reported residual stress). char_length_mm sets the mesh size; thickness_axis ('x'|'y'|'z') overrides the auto-detected through-thickness axis; flatness_tol_mm or flatness_tol_frac (default 0.2 % of span) set the gate tolerance.

Fidelity caveat: a one-way, linear-elastic, loose coupling — it ignores viscoelastic stress relaxation, flow-induced anisotropy, and the packing-pressure residual; it captures the dominant differential-shrinkage warp and its direction, not a calibrated absolute. fidelity="solve" with a conservative band_pct; read the band.

Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result for {ok, returncode, solver, case_dir, nodes, tets, warp_axis, span_mm, thickness_mm, dT_through_k, dT_source, analytic_bow_mm, gate} where gate is {pass (on flatness), score, fidelity:"solve", band_pct, max_warp_mm, flatness_tol_mm, warp_per_span, max_disp_mm, warp_faithful, analytic_bow_mm, warnings}.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
poissonNo
materialNo
cte_per_kNo
cooling_nxNo
cooling_nyNo
cooling_nzNo
ref_temp_cNo
youngs_mpaNo
cooling_timeNo
dT_through_kNo
char_length_mmNo
thickness_axisNo
flatness_tol_mmNo
cooling_case_dirNo
flatness_tol_fracNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnly=false, destructive=true), the description discloses asynchronous job submission, non-raising error behavior with {ok:false, reason, install}, CalculiX subprocess isolation, unit conventions, required prerequisites, and the expected job_result payload. This is substantial behavioral context that goes far beyond the structured fields.

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 long, but every section earns its place for a tool with 16 params and complex physics: purpose, coupling modes, parameter semantics, fidelity caveats, and return structure are all clearly separated and front-loaded. It is structured enough that an agent can quickly extract invocation requirements without wading through irrelevant prose.

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?

Given the tool's complexity, the description covers all required operational knowledge: how to choose between input modes, what defaults exist, what the worker does, what units are used, what fidelity limits apply, and exactly what fields to expect in job_result. There is no output schema, so the detailed return-value description is essential and is present.

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 compensates richly: it explains `body`, the mutual exclusivity of `dT_through_k` and `cooling_case_dir`, cooling mesh defaults, material property fallbacks, the meaning of `ref_temp_c`, `thickness_axis`, flatness tolerances, and representative return fields. Nearly every one of the 16 parameters receives meaningful context that the schema alone does not provide.

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 and operation: it computes injection-molding warpage/residual distortion as an asynchronous FEM thermo-elastic post-step, and even frames the exact question it answers ('will the part bow out of flat once it cools and is ejected'). It differentiates itself from the lower-fidelity CTE shrinkage screen and from other molding tools by naming issue numbers and the higher-fidelity relationship.

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 description gives clear usage context: it requires the `ccx` binary, handles missing binaries gracefully, supports two input modes (`dT_through_k` vs. `cooling_case_dir`), and warns about fidelity limits. It identifies the higher-fidelity twin relationship but does not explicitly enumerate when to prefer this tool over each sibling alternative, so it stops 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.

monopole_sphereMonopole SphereA
Read-only

Exact pulsating (monopole) sphere radiated power + far-field pressure (NO solver) — the closed-form twin the Bempp exterior-acoustics BEM radiation solve (acoustic_radiation_submit) is gated against. A sphere of radius a_m vibrating with uniform surface normal velocity u_amp at freq_hz radiates W = (ρc/2)|U|²(4πa²)(ka)²/(1+(ka)²) and, at range r_m, |p(r)| = ρc|U|·ka/√(1+(ka)²)·(a/r) — both EXACT. The radiation efficiency σ=(ka)²/(1+(ka)²) → 0 (poor sub-wavelength radiator) as ka→0 and → 1 as ka→∞. rho/c default to air at 20 °C. A BEM Neumann (velocity) solve must reproduce W and |p(r)|.

Returns {a_m, freq_hz, k_per_m, ka, u_amp, rho, c, radiation_efficiency, radiated_power_w, surface_pressure_abs, r_m, farfield_pressure_abs, farfield_pressure_x_r, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
cNo
a_mYes
r_mNo
rhoNo
u_ampNo
freq_hzYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description reveals that the computation is exact and solver-free, provides the governing formulas, explains the radiation efficiency behavior as ka changes, and lists the complete return payload. This gives the agent substantial behavioral context beyond the annotation metadata.

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 differentiator in the first sentence. The formulas and output enumeration are genuinely useful, though the full return-field list adds length and could have been trimmed without losing key semantics.

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?

Since there is no output schema, enumerating the return fields is valuable and helps an agent understand expected results. The description covers physical assumptions, defaults, and the validation relationship with the BEM solver, but it does not define what valid_range_ok checks or how null r_m is handled, which are 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?

With 0% schema description coverage, the description compensates by defining a_m as sphere radius, u_amp as uniform surface normal velocity, freq_hz as frequency, r_m as range, and rho/c as air defaults at 20°C. It stops short of giving explicit units for u_amp, rho, and c, though the formulas and air-property defaults make these reasonably inferable.

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 verb and resource: it computes exact pulsating monopole sphere radiated power and far-field pressure. It explicitly says 'NO solver' and distinguishes itself as the closed-form twin of `acoustic_radiation_submit`, making it easy to tell apart from related siblings.

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 explicitly names the alternative BEM solver tool `acoustic_radiation_submit` and states it is 'gated against' this analytic solution. It further says a BEM Neumann velocity solve must reproduce W and |p(r)|, clearly indicating when this tool should be used as the exact reference instead of the numerical solver.

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

new_documentNew DocumentA

Create a new FreeCAD document and make it active. Returns {doc: }.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNopart

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only say readOnlyHint=false and destructiveHint=false; the description adds concrete behavior by stating that a document is created, made active, and that the return value is {doc: <name>}. This explains side effects that matter to orchestration, such as changing the active document context.

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?

Two short sentences front-load the operation and include the return contract with no filler or redundancy. Every part of the description earns its place.

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 single-optional-parameter creation tool, the description covers the action, the active-document side effect, and the return format. No output schema exists, so including the return shape in the description is 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 description coverage is 0%, so the description carries more responsibility for the optional name parameter. It indirectly defines the parameter through 'Returns {doc: <name>}', confirming that name becomes the document's name, but it does not explain uniqueness, naming rules, or what happens when omitted.

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 the specific action 'Create a new FreeCAD document' with a clear resource and also notes it will 'make it active'. This distinguishes it from sibling tools like open_document, list_documents, and set_active_document without needing to inspect their schemas.

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 description clearly implies the use case: create a fresh document and activate it for subsequent operations. It does not explicitly name sibling alternatives or exclusion criteria, but the word 'new' plus the active-document behavior provides enough contextual guidance.

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

open_documentOpen DocumentA

Open an existing .FCStd file, make it active. Returns doc name and object list.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

TDQS

A4/5.0
Behavior4/5

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

Beyond the annotations, the description discloses a meaningful side effect ('make it active') and the return content ('Returns doc name and object list'). This helps the agent anticipate the tool's state-changing behavior, although it does not describe error handling or behavior if the file is already open.

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 a single sentence that front-loads the core action, notes the activation side effect, and states the return values. Every phrase contributes useful information with no redundancy 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 tool with one parameter and no output schema, the description covers the intended effect, the target file type, activation behavior, and the returned data. It does not cover failure modes or workspace interactions, but the tool appears simple enough that the provided information is sufficient for correct invocation in most contexts.

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 is the only source of parameter meaning. It identifies the path as referring to an existing .FCStd file, which gives basic context for the single required 'path' parameter. It does not specify absolute vs relative paths, supported file variants, or path resolution details, but for a single obvious string parameter this is adequately informative.

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 verb and resource: 'Open an existing .FCStd file, make it active.' This clearly distinguishes the tool from siblings like new_document, list_documents, and set_active_document by emphasizing both opening from an existing file and activating it. The purpose 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?

The description implies usage context: call this when an existing .FCStd file must be loaded and made active, rather than creating a new document. However, it does not explicitly name alternatives or state when not to use it, leaving the agent to infer the boundary against tools like set_active_document or new_document.

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

optics_lens_designOptics Lens DesignA
Read-only

First-order + spot analysis of a SEQUENTIAL optical system with optiland (MIT, in-process). Requires the optics extra; degrades to {ok:false, reason, install} otherwise. For a single lens optiland is gated against the analytic thick-lens oracle (oracle_dev_pct).

surfaces: list (object->image) of {radius, thickness, material, stop?} — exactly one surface must set stop:true (the aperture stop). epd (entrance-pupil dia) OR fno. wavelengths_um (first is primary, default [0.5876]). field_angles_deg (default [0.0]). image_solve solves the last gap to paraxial focus.

Returns the degradation dict, or {ok, backend:'optiland', optiland_version, efl_mm, bfl_mm, fno, n_surfaces, rms_spot_um:[per field], oracle_efl_mm, oracle_dev_pct}.

ParametersJSON Schema
NameRequiredDescriptionDefault
epdNo
fnoNo
surfacesYes
want_spotNo
image_solveNo
wavelengths_umNo
field_angles_degNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true; the description adds material behavior: dependency gating, degradation to {ok:false, reason, install}, single-lens validation against an oracle, and the exact return dict. This is significant context beyond the annotations.

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?

Dense but well-structured: purpose first, then dependency, parameter walkthrough in aligned backticks, then return shape. Every sentence carries actionable information with no filler or repetition of the schema.

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?

No output schema and minimal annotations, so the description compensates well by documenting returns, defaults, and constraints. The only notable gap is the undocumented want_spot parameter and slight unit ambiguities (e.g., epd units), making it very close to complete but not flawless.

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?

With 0% schema coverage, the description must carry parameter meaning, and it does for surfaces (sub-fields, stop constraint), epd/fno mutual-exclusion, wavelengths defaults, field angles default, and image_solve behavior. However, the want_spot parameter is never mentioned, leaving one of seven parameters unexplained.

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-resource pair: 'First-order + spot analysis of a SEQUENTIAL optical system with optiland'. This enables differentiation from siblings like optics_lens_optimize and optics_raytrace. The qualifiers (SEQUENTIAL, optiland) make the scope precise.

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?

Provides clear context: what the tool analyzes, the dependency prerequisite ('Requires the optics extra'), and the degradation contract if missing. No explicit alternatives or when-not-to-use guidance are given, so it stops 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.

optics_lens_optimizeOptics Lens OptimizeA
Read-only

Optimize a SEQUENTIAL optical system with optiland's optimizer (MIT, in-process) — the capability rayoptics lacks. Requires the optics extra; degrades to {ok:false, reason, install} otherwise.

surfaces: as in optics_lens_design. variables: [{type:'radius'|'thickness', surface:<1-based int>}] — the degrees of freedom. targets: [{operand:'f2'| 'rms_spot_size'|…, target, weight?, surface?}] — the merit function. maxiter caps iterations.

Returns the degradation dict, or {ok, backend:'optiland', converged, n_fev, before:{efl_mm,rss}, after:{efl_mm,rss}, surfaces:[optimized]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
epdNo
maxiterNo
targetsYes
surfacesYes
variablesYes
wavelengths_umNo
field_angles_degNo

TDQS

A4.6/5.0
Behavior5/5

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

The description discloses meaningful behavior beyond the readOnlyHint annotation: it runs in-process, uses a specific backend, reports optimization convergence, exposes before/after metrics, and degrades gracefully if the required extra is absent. This is substantial behavioral context.

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 compact and well-organized: purpose, prerequisite/fallback, parameter semantics, then return format. No sentence is redundant, and important information is front-loaded.

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 description covers prerequisites, parameters, and return behavior, which is strong for a tool with no output schema. The main gap is the three optional parameters that are left to name-based inference, but the required calling contract is fully explained.

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?

With 0% schema description coverage, the description compensates well for the core parameters: surfaces, variables, targets, and maxiter are given structure and meaning. The optional parameters epd, wavelengths_um, and field_angles_deg are not described, but their names and defaults make them reasonably self-explanatory.

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 opens with a specific action and resource: 'Optimize a SEQUENTIAL optical system with optiland's optimizer.' It also distinguishes itself by noting this is 'the capability rayoptics lacks,' making its purpose clear relative to nearby optics tools.

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 description gives a concrete prerequisite ('Requires the optics extra') and explains the degradation fallback when it's missing. It references optics_lens_design for surface format, but it does not explicitly enumerate when to choose this tool over optics_lens_design or other siblings beyond the rayoptics comparison.

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

optics_moldability_checkOptics Moldability CheckA
Read-only

Moldability screen for a part against a single pull axis — geometric, no solver. Resolves the model handle's solid, then per face computes the draft relative to pull_axis from the outward normal (draft_deg = 90 − angle(normal, pull); 0 = a wall parallel to the pull that needs draft) and ray-casts the face centroid along ±pull: a face the straight pull frees in neither direction is a re-entrant UNDERCUT (reported with negative draft). Inward chords give a wall- thickness distribution. Scored through the same DfM machinery as dfm_check.

pull_axis: '+z'/'-x'/… or an [x,y,z] vector. process ('injection'|'cnc'| 'sheet'|'fdm') sets the default min wall; override with min_wall_mm.

Returns {process, pull_axis, n_faces, undercut_faces, draft_violations, min_wall_violations, wall_thickness_stats:{min_mm,mean_mm,max_mm,n}, score, pass}.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYes
processNoinjection
pull_axisNo+z
min_wall_mmNo
min_draft_degNo

TDQS

A4/5.0
Behavior5/5

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

Beyond the readOnlyHint, the description discloses the algorithm: resolving the solid, per-face draft computation, ray-casting for undercuts, negative draft reporting, and wall-thickness distribution. It also reveals the scoring relationship to dfm_check, giving an agent a concrete model of behavior.

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 dense but every sentence earns its place: the first line summarizes scope, the middle explains behavior, and the final sections document parameters and return shape. It is front-loaded and avoids 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?

It provides full return-shape documentation and algorithm details, which is especially valuable since there is no output schema. The main gap is the omitted min_draft_deg parameter and a lack of error/edge-case notes, but overall an agent can call it 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?

With 0% schema coverage the description must compensate, and it does for model, pull_axis (including syntax), process values, and min_wall_mm override. However, min_draft_deg is never mentioned, despite being a parameter with a default that directly affects draft_violations, leaving one of five parameters 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?

The description names a specific action ('Moldability screen') against a specific resource ('part against a single pull axis') and explains the geometric, non-solver nature. It does not differentiate from the near-sibling moldability_check or explain what makes this the 'optics' variant, so it stops short of full sibling distinction.

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 gives clear context ('geometric, no solver', 'same DfM machinery as dfm_check') that implies a quick pre-solvability screen. It never states when to prefer this over moldability_check or when a solver-based molding_fill_submit is required, so selection guidance 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.

optics_raytraceOptics RaytraceA
Read-only

Ray-trace a bundle through a dielectric optical model with rayoptics (asynchronous-free; needs no FreeCAD geometry). Requires the rayoptics wheel (the optics extra); when it does not resolve this returns {ok:false, reason, install} rather than raising. The geometric refraction comes from rayoptics; the Fresnel/TIR energy split + the exit histogram come from the exact analysis/optics core, so the trace is gated against that oracle (oracle_max_dev_deg = max rayoptics−Snell exit-angle deviation, ~0).

n_refractive is the medium index n2 (default PMMA 1.49062). source_config is {kind:'collimated'(angle_deg)|'cone'(half_angle_deg)|'lambertian' (max_angle_deg)} (default collimated at normal incidence). model may carry {n1 (incident index, default air 1.0), absorption (0..1 bulk loss), target_half_angle_deg (the acceptance cone counted as efficiency)}.

Returns the degradation dict, or {ok, backend:'rayoptics', rayoptics_version, n_rays, n1, n2, critical_angle_deg, efficiency, leakage_fraction, absorbed_fraction, tir_fraction, energy_balance, oracle_max_dev_deg, exit_distribution:[{angle_deg,intensity}], hotspot_locations}.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNo
n_raysNo
n_refractiveNo
source_configNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description reveals important non-obvious behavior: missing dependency yields {ok:false, reason, install} instead of raising, the result is gated against an exact analysis oracle, and the trace uses a hybrid rayoptics + core computation path. It also enumerates the returned fields, including error and validation-related ones, giving excellent 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 dense but every sentence earns its place: purpose, dependency/fallback behavior, computational backend, parameter semantics, and return fields. It is front-loaded with the primary action and then systematically fills in the details necessary for correct invocation. No filler or tautology is present.

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 tool with no output schema, no enum constraints, and 0% schema description coverage, this description is unusually complete. It explains success and failure shapes, required dependency, all meaningful parameter options and defaults, and the exact output fields. The only minor gap is n_rays, but its name/default make the omission low-risk.

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 carries the burden. It explains n_refractive, source_config kinds, and the model subfields with defaults and meaning. It omits any explicit explanation of n_rays beyond its name and default, so it is not a perfect substitute for full parameter documentation.

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 opens with a specific, unambiguous action: 'Ray-trace a bundle through a dielectric optical model with rayoptics.' It also distinguishes itself from sibling tools by noting it is 'asynchronous-free' and 'needs no FreeCAD geometry,' which separates it from CAD-geometry-based or submission-style optics tools.

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 description supplies clear usage context: call this tool for a synchronous ray trace without needing FreeCAD geometry, and be aware it requires the `optics` extra. It does not explicitly say 'use X instead when Y,' but the asynchronous-free and no-geometry framing gives an agent enough situational guidance to choose it over sibling ray-trace/submit tools.

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

optics_solid_traceOptics Solid TraceA
Read-only

NON-SEQUENTIAL ray trace through a real solid (STL mesh) with a refractive index — the lane for molded optical parts (light-pipes, prisms, lenses). Backed by KrakenOS, which is GPL-3.0 and is run ONLY in a subprocess (the parent never imports it — same arm's-length isolation as the GPL Elmer/OpenFOAM binaries). Requires the optics_gpl extra; degrades to {ok:false, reason, install} otherwise.

Geometry: pass a model handle (exported to STL here) OR a ready stl_path. Material: glass (KrakenOS catalog name, e.g. 'BK7') or n_refractive (constant index). rays: [{origin:[x,y,z], dir:[l,m,n]}]; each ray's turn_deg is its input->exit bend (~90 for a TIR corner prism, ~0 for a straight pass). solid: {diameter, thickness, axis_move} placement. wavelength_um default 0.55. want_paths (default False): also return each valid ray's polyline as paths — the per-surface hit points [[x,y,z], ...] in the traced frame. The LAST point of each path is the ray's EXIT LOCATION on the solid, so the spatial exit/leakage map a diffuser needs can be reconstructed from it.

Returns the degradation dict, or {ok, backend:'KrakenOS (subprocess-isolated, GPL-3.0)', n_launched, n_valid, valid_fraction, mean_turn_deg, max_turn_deg, rays:[{valid, exit_dir, turn_deg}], stl_path, paths?:[[[x,y,z],...],...]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
raysYes
glassNo
modelNo
solidNo
stl_pathNo
want_pathsNo
n_refractiveNo
wavelength_umNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond readOnlyHint=true, it discloses a non-obvious execution model: KrakenOS is GPL-3.0 and runs only in a subprocess with 'arm's-length isolation.' It also warns about the `optics_gpl` extra and the degradation path {ok:false, reason, install}, plus the `want_paths` exit-point semantics, all of which materially shape how an agent should call and interpret the tool.

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 long but tightly organized into labeled topics (purpose, licensing/install, geometry, material, rays, solid, paths, return shape), with the core purpose front-loaded. Each sentence carries necessary operational or behavioral information, and the field-by-field style is scannable rather than bloated.

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 tool with 8 parameters, no output schema, and a nontrivial backend, this description supplies all the missing semantics: install requirements, degradation behavior, complete output fields, ray/path semantics, and geometry/material selection. The coordinate frame of paths is defined as the 'traced frame,' and return values are fully enumerated, making it complete enough for an agent to call 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%, so this description carries the full documentation burden. It explains every parameter: model/stl_path alternatives, glass vs n_refractive, the exact rays array shape, solid placement fields, wavelength default, and want_paths behavior, including how the last path point is the ray's exit location.

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 pair: 'NON-SEQUENTIAL ray trace through a real solid (STL mesh) with a refractive index.' It names the domain ('molded optical parts') and the backing engine (KrakenOS), and the qualifier 'NON-SEQUENTIAL' plus 'real solid (STL mesh)' clearly distinguishes it from generic ray-tracing siblings like optics_raytrace.

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 description frames this as 'the lane for molded optical parts (light-pipes, prisms, lenses)', giving strong intended-context guidance. It does not explicitly name sibling alternatives or state when-not-to-use, so it stops just short of full exclusion guidance.

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

optimize_submitOptimize SubmitA

Vary parameters until the spec is met, then say whether it was PROVEN — the step that closes the design-to-spec loop.

Everything else in this family measures; this searches. Two things make it different from a generic minimizer, and both come from the performance-contract layer underneath it:

A constraint verdict has three states. indeterminate — the measurement's uncertainty band straddles the limit — is NOT a failed step. An optimizer that reads it as a failure walks away from good designs; one that reads it as a pass converges on unproven ones. During the search an indeterminate constraint is scored on its nominal value, so it neither attracts nor repels, and the winner is proved properly at the end.

Convergence is not proof. A simplex can settle on a point that clears its limit by 2 % while its own grid-convergence band is 5 % wide — noise with a favourable sign. proven is therefore reported separately from converged, and is True only when the final measurement has every constraint at pass and no margin swallowed by its own band.

variables must be continuous and bounded — {"name": "diameter_mm", "min": 5, "max": 25, "start": 10}. An optimizer without a box walks to values that satisfy the arithmetic and mean nothing physically.

objective and each constraints entry use the performance-requirement mapping ({tool, metric, conditions, limit, screen, band_pct}), with "$<variable>" in conditions carrying the candidate's value. tier='auto' searches cheaply on each block's screen estimator, then polishes on the real tool from where the screen landed; 'screen' or 'solver' runs just that leg.

The search is a bounded Nelder-Mead — derivative-free because there is no adjoint through a CFD solve — so every evaluation is a real measurement. budget ({max_evals, max_wall_s}, default 40 evaluations) is the ceiling; revisited points are served from cache and do NOT count against it.

Shape optimization. Pass a recipe (+ fixed_inputs) and it is rebuilt for every candidate, so the search varies GEOMETRY rather than only numbers — "$handle" in a response's conditions is that candidate's part, and the returned history carries the handle each point built. Pass handle instead to optimize parameters against one fixed part; pass neither and the search is purely parametric.

Geometry-driven candidates are built on the MAIN thread through the worker's work queue, because FreeCAD's document API is not thread-safe and this search runs as a background job. That queue is drained once per incoming request, so a shape search only advances while you are polling job_status/job_result — the poll you must do anyway is what gives it its turn. Poll at your normal cadence and it simply works; stop polling and it stalls rather than finishing in the background. A candidate whose recipe fails to build is scored out as an infeasible point, not an error. study_submit remains the right tool for a FIXED grid over recipe geometry, which needs no queue at all.

Returns {job_id, status}; poll job_result for {ok, proven, stop_reason, best_params, best_value, objective: {name, metric, sense, value, band_pct}, constraints: [{name, state, measured, limit, band_pct, margin, margin_pct, detail, trust_reasons?}], phases: [{tier, n_evals, best_params, best_value, converged, reason}], history: [{i, tier, params, value, score, feasible, cached}], n_evals, n_cached, budget, variables, warnings}.

ParametersJSON Schema
NameRequiredDescriptionDefault
tierNoauto
budgetNo
handleNo
recipeNo
objectiveYes
variablesYes
constraintsNo
fixed_inputsNo

TDQS

A4.9/5.0
Behavior5/5

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

The description goes far beyond the minimal annotations (readOnlyHint false, destructiveHint false) by disclosing nuanced behavior: three-state constraint verdicts, convergence not equaling proof, bounded Nelder-Mead with derivative-free search, budget ceilings, cached evaluations not counting, shape candidates building on the main thread, and the search stalling unless polled. This is exceptional transparency for a complex background-job 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 long, but its length is justified by the tool's complexity and the complete absence of schema descriptions. It is well-organized with bold headers and front-loads the core purpose and key differentiators. A few sentences are dense enough that they could be tightened, but no significant part 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?

Given 8 parameters, nested objects, no output schema, and a complex asynchronous optimization workflow, the description is remarkably complete. It specifies the returned job_id/status, the full job_result structure with phases, history, constraints, trust_reasons, n_evals, n_cached, budget, variables, and warnings, so an agent has everything needed to invoke and interpret 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%, so the description must carry the full burden, and it does. It explains variables with a concrete example, defines objective/constraints via the performance-requirement mapping, clarifies tier ('auto', 'screen', 'solver'), budget semantics with defaults, and the meaning of recipe, fixed_inputs, and handle. Every parameter is given meaningful context.

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 opens with a crisp, specific statement: 'Vary parameters until the spec is met, then say whether it was PROVEN — the step that closes the design-to-spec loop.' It clearly identifies this as an optimization submission tool and explicitly contrasts it with the rest of the family ('Everything else in this family measures; this searches'), making it unmistakable from siblings like study_submit.

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?

Usage guidance is explicit and thorough. It says when to use this tool versus siblings ('Everything else in this family measures; this searches'), and specifically names study_submit as the right tool for a fixed grid over recipe geometry. It also gives detailed selection rules among tier values, parametric vs shape optimization, and handle vs recipe vs neither.

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

oring_grooveO-Ring GrooveA

Compute a static O-ring gland (groove) and optionally cut it into a face.

This is the gland calc designers always fumble, plus an optional cut. Given the O-ring cross-section it returns standard static-seal gland dimensions; with cut=True it also machines the annular groove into a flat face.

cross_section: O-ring wire cross-section diameter in mm (e.g. 1.78, 2.62). Required, > 0. inner_diameter: groove inner diameter in mm (the O-ring's nominal seal ID). Required when cut=True; used to size the returned diameters either way. handle: host solid to cut into (required only when cut=True). face: the flat face to cut the groove into — a stable f_* tag (preferred), a 'FaceN' index string, or an int. Required when cut=True. Must be planar. gland_type: seal-geometry label, default 'static_radial' (informational). compound: optional elastomer + durometer the RING is ordered in ("NBR70", "FKM75", "EPDM70"). Changes no geometry; it completes the AS568 designation of the ring itself — the purchased part this groove exists to hold, which no BOM would otherwise contain because the ring is never a modelled object. cut: True (default) cuts the groove and returns a new solid; False makes this a pure calculator (no geometry, no handle). name: name for the resulting solid when cut=True.

Gland rule (static seal): groove_depth = cross_section0.75 (~25% squeeze, clamped to a 20-30% band), groove_width = cross_section1.30. The groove's inner diameter equals inner_diameter and it spans outward by groove_width.

Returns {groove_depth, groove_width, groove_inner_diameter, groove_outer_diameter, squeeze_pct, cross_section, gland_type, oring} (all mm except squeeze_pct in percent). When cut=True it ALSO returns {handle, name, volume} for the grooved solid; the host input is hidden. mating numbers: cut a groove of inner_diameter to seat an O-ring of that ID; groove_outer_diameter sizes the radial space the groove occupies. oring is the RING's designation card ("AS568-214 NBR70"), or ok=False naming the nearest tabulated sizes when the gland is not an AS568 standard size — an off-table ring is a custom tooled part, and saying so beats naming a dash number that will not seal. oring_catalog is the ring's off-the-shelf verdict.

ParametersJSON Schema
NameRequiredDescriptionDefault
cutNo
faceNo
nameNoORingGroove
handleNo
compoundNo
gland_typeNostatic_radial
cross_sectionYes
inner_diameterNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only provide readOnlyHint=false, destructiveHint=false, openWorldHint=false. The description goes well beyond these by detailing the exact mathematical formulas for groove dimensions, the clamping rule, the return structure, and the meaning of the 'oring' field. It clarifies that cut=True returns a new solid and hides the host input, explaining side effects. No contradiction with annotations.

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 well-structured, starting with the core purpose, then parameter details, then return values. It is verbose but each paragraph earns its place, explaining complex behavior. A minor deduction for the informal aside 'designers always fumble' and some redundancy in explaining cut in both the parameter list and behavior section, but overall it remains focused and readable.

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?

Given the tool's complexity (8 parameters, dual modes, rich return types) and lack of output schema, the description covers all necessary information: formulas, return fields, cut behavior, and special edge cases like non-AS568 rings. It is comprehensive enough for an agent to use the tool correctly without additional documentation.

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?

Since schema description coverage is 0%, the description is the sole source of parameter meaning. It provides extensive details for all 8 parameters: units, constraints, required conditions, examples, and semantic roles (e.g., compound doesn't affect geometry). It fully compensates for the schema gap, adding value far beyond the raw JSON schema.

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 clearly states the tool computes a static O-ring gland and optionally cuts it into a face. It uses specific verbs and resources ('compute', 'cut', 'gland', 'groove') and distinguishes from other tools by its focus on O-ring seals, a unique niche among siblings. The purpose is unambiguous and not a tautology.

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 description provides clear context on when to use cut=True vs False, and when inner_diameter is required. It explains the dual calculator/geometry modes. However, it does not explicitly name any alternative tools or provide 'when not to use' guidance, so it falls short of a 5 but is solid for context.

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

pack_checkMolding Pack CheckA
Read-only

Check a part against a shipping carton + compute billable weight. part_bbox_mm/carton_mm are [l,w,h] mm; fits allows reorientation (sorted-dim compare). void_fraction = 1−vol(part)/vol(carton); dim_weight_kg = vol(carton cm³)/dim_factor (default 5000 metric DIM); billable_weight_kg = max(actual, dimensional). Returns {fits, void_fraction, dim_weight_kg, actual_mass_kg, billable_weight_kg, pass}.

ParametersJSON Schema
NameRequiredDescriptionDefault
mass_gYes
carton_mmYes
dim_factorNo
part_bbox_mmYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations provide readOnlyHint=true and openWorldHint=false. The description goes beyond by detailing the algorithm (sorted-dim compare for reorientation), defining void_fraction and billable_weight calculations, and listing the return object fields. It clearly discloses that it computes dimensional weight and uses a default DIM factor of 5000. This adds value beyond the annotations without contradiction.

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 a single dense paragraph that front-loads the primary purpose, then provides necessary formula details and output fields. Every sentence adds value; there is no filler. The structure is efficient and 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?

Given the tool's moderate complexity (4 params, no output schema), the description fully explains inputs, the algorithm, and the return object. It lacks explicit mention of units for mass_g (assumed grams from param name) and any error conditions, but these are minor. The description is complete enough for an agent to call correctly without ambiguity.

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 carries the full burden. It explains the semantics of part_bbox_mm and carton_mm as [l,w,h] mm arrays, mentions the default dim_factor of 5000, and implies mass_g is the actual mass (used to compute billable weight). It covers 3 of 4 parameters explicitly; dim_factor is described via the formula. This is strong compensation for the schema's lack of 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?

The description clearly states the verb ('Check'), the resource ('a part against a shipping carton'), and the additional output ('compute billable weight'). It distinguishes itself from siblings like 'moldability_screen' or 'fit_check' by focusing on packaging/carton criteria. The scope 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 Guidelines4/5

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

The description explains the core functionality and formulas, but does not explicitly state when to use this tool versus alternatives or when not to use it. It implies usage for packaging/billable-weight assessment, but lacks explicit exclusions (e.g., 'Use fit_check for clearance analysis instead'). The context is clear enough for an agent to infer.

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

padPadB

Pad a sketch by length mm. symmetric=True extrudes both directions.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoPad
lengthNo
sketchYes
reversedNo
symmetricNo

TDQS

B3.3/5.0
Behavior3/5

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

Annotations indicate readOnlyHint=false, so the tool mutates the model; destructiveHint=false, so it is not destructive. The description adds the symmetric behavior and length unit (mm), which is useful. However, it does not disclose that it creates a new pad feature, requires a planar closed sketch, or that it modifies the active document. More behavioral context would be helpful 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.

Conciseness5/5

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

The description is a single concise sentence front-loaded with the primary action and parameter. It contains no filler and clearly conveys the essential operation plus the symmetric nuance. It is optimally sized for quick parsing.

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

Completeness2/5

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

For a tool with 5 parameters and no output schema, the description is too brief. It omits crucial operational details such as the need for a closed planar sketch, how the feature integrates with the model, and the effect of the reversed parameter. An agent would need domain knowledge to call this correctly, which the description does not supply.

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. It explains the length parameter (in mm) and the symmetric parameter (both directions), but it does not explain the reversed parameter at all, and 'name' is trivial. The sketch parameter is implied by 'Pad a sketch' but not elaborated. Since half the meaningful parameters lack explanation, the semantic coverage is insufficient.

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 clearly states the action: 'Pad a sketch by `length` mm.' It names the verb (Pad) and the resource (sketch), and adds a specific detail about the symmetric parameter ('symmetric=True extrudes both directions'). This makes it distinct from sibling operations like pocket or revolve, which have different verbs and semantics.

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?

The description provides no guidance on when to use this tool versus alternatives such as pocket, revolve, or loft. It does not mention any conditions, prerequisites, or exclusions. An agent is left to infer that 'pad' is for linear extrusion of a sketch, but it never explicitly says that or distinguishes it from other feature-creation tools.

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

partdesign_chamferPartDesign ChamferA

PartDesign Chamfer on edges of a feature in a Body. edges accepts e_* tags or 'EdgeN' index strings; size is the chamfer leg in mm (> 0).

Validated and rolled back on failure exactly like partdesign_fillet (issue #283), with the same per_edge / allow_partial opt-ins.

Returns {handle, name, volume (mm^3), edges (the 'EdgeN' names actually chamfered), checks {valid, solids, envelope_ok, envelope_growth_mm, envelope_tol_mm}, mode, partial}; when partial is True, also skipped_edges and a warnings entry. On a failed check the feature is removed, the Body's Tip is restored, and BlendCheckFailed is raised naming the offending edges.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoPdChamfer
sizeNo
edgesYes
featureYes
per_edgeNo
allow_partialNo

TDQS

A3.8/5.0
Behavior5/5

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

The description richly discloses failure behavior: validation, rollback, feature removal, Body Tip restoration, and raising BlendCheckFailed. It also enumerates the full return object including volume, checks, mode, and partial handling. This goes far beyond the sparse annotations and gives the agent a reliable model of side effects.

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 organized into three tight sections: purpose with key parameter syntax, validation/rollback note, and return format. It contains detailed return-field information but all of it is relevant and there is no filler.

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 description does well for a tool with no output schema by specifying the return object and failure behavior in detail. However, it omits the meaning of the required `feature` parameter and relies on an external reference to partdesign_fillet for per_edge/allow_partial behavior, leaving notable gaps for an agent to infer.

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?

With 0% schema description coverage, the description compensates partially by explaining `edges` (e_* tags or EdgeN strings) and `size` (chamfer leg in mm > 0). It mentions per_edge and allow_partial but does not define their semantics, and leaves `feature` and `name` undocumented, so not all parameters are sufficiently explained.

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 this tool applies a chamfer to edges of a feature in a Body and gives the edge selection syntax. It is unambiguous about the core operation, though it does not explicitly contrast itself with the sibling chamfer_edges/fillet_edges tools.

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 description provides context that this is a PartDesign chamfer operation on feature edges and references the same validation/rollback behavior as partdesign_fillet. However, it gives no explicit when-to-use vs. when-not-to-use guidance relative to alternative edge-modification tools like chamfer_edges or fillet_edges, leaving selection largely implicit.

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

partdesign_filletPartDesign FilletA

PartDesign Fillet on edges of a feature in a Body. edges accepts e_* tags or 'EdgeN' index strings; radius in mm (> 0).

Validated before a handle is issued, like fillet_edges (issue #283): Shape.isValid(), unchanged solid count, and no growth of the tight bounding box. PartDesign needs it as badly as the Part workbench — r=0.6 on a 40x40x1 pad returns an 'Up-to-date' single solid 15% LARGER than the pad.

per_edge: add the edges one at a time, validating after each. allow_partial: accept a partial result instead of aborting. Off by default.

Returns {handle, name, volume (mm^3), edges (the 'EdgeN' names actually filleted), checks {valid, solids, envelope_ok, envelope_growth_mm, envelope_tol_mm}, mode ('batch' | 'per_edge'), partial}; when partial is True, also skipped_edges and a warnings entry. On a failed check the feature is removed, the Body's Tip is restored, and BlendCheckFailed is raised naming the offending edges and the subset that does fillet cleanly.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoPdFillet
edgesYes
radiusNo
featureYes
per_edgeNo
allow_partialNo

TDQS

A4.8/5.0
Behavior5/5

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

The description discloses concrete validation steps (Shape.isValid(), solid count, bounding box growth), failure behavior (feature removed, Tip restored, BlendCheckFailed raised), optional modes (per_edge, allow_partial), and a concrete motivating example. This goes far beyond the sparse annotations, which only mark readOnly/openWorld/destructive hints. No contradiction with annotations.

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 dense but each sentence adds material value: purpose, parameter semantics, validation rationale, option behavior, return structure, and error handling. It is front-loaded with the core purpose and avoids filler. The anecdote about the 40x40x1 pad justifies the validation but is not redundant. Well organized into logical chunks.

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?

Given the tool's complexity, the description is remarkably complete. It covers input semantics, options, validation criteria, exact return fields, and failure handling. There is no output schema, so the thorough return-type explanation is essential and provided. An agent can call this tool correctly with no further documentation.

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?

With 0% schema description coverage, the description fully compensates: it specifies that edges accepts e_* tags or 'EdgeN' strings, radius is in mm and must be > 0, and explains the behavioral meaning of per_edge and allow_partial. Feature and name are covered contextually ('feature in a Body' and default provided in schema). This is excellent parameter documentation.

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 opens with 'PartDesign Fillet on edges of a feature in a Body', naming the exact verb, resource, and scope. It explicitly references fillet_edges as a sibling and clarifies the PartDesign-specific context, so an agent can distinguish this from the Part workbench tool even without opening schemas.

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 description clearly implies it is for PartDesign Bodies, and the mention of fillet_edges and 'PartDesign needs it as badly as the Part workbench' signals when to prefer this over the sibling. However, it does not explicitly state exclusions (e.g., when NOT to use it or when fillet_edges would be the correct choice), 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.

pingPingA
Read-only

Check that the FreeCAD worker is alive. Returns 'pong' on success.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the concrete success response ('pong'), which is useful behavioral context beyond the annotations.

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?

Two short sentences with no filler. The purpose and expected result are stated in a compact, front-loaded manner.

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 parameterless, read-only health-check tool with an output schema, the description is fully sufficient. It tells the agent what the tool does and what a successful result looks like.

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?

The tool has zero parameters, so the schema provides no parameter details. The baseline for no-parameter tools is 4, and the description appropriately needs to explain no argument semantics.

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 ('Check'), a specific resource ('FreeCAD worker'), and the exact success outcome ('Returns 'pong''). This clearly distinguishes it from many sibling tool names that imply operations or queries.

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 description clearly indicates this is a liveness/health check for the FreeCAD worker. It does not explicitly name alternatives, but the context is unambiguous given the wide sibling list.

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

plastic_collapsePlastic CollapseA
Read-only

Exact plastic-hinge collapse of a solid rectangular beam (NO solver) — the closed-form twin the perfectly-plastic CalculiX solve (fem_set_nonlinear_material) is gated against. The beam bends about the width_mm axis (depth = height_mm). σ_y from yield_mpa or a Materials-DB material. Elastic modulus S = b·h²/6, plastic modulus Z = b·h²/4, shape factor Z/S = 1.5; yield moment M_y = σ_y·S, fully-plastic moment M_p = σ_y·Z. support maps the collapse moment to a point load: 'cantilever' (M = P·L) or 'simply_supported' (central, M = P·L/4). With load_n the applied moment and its margins to M_y / M_p (and the regime: elastic / partially_plastic / collapsed) are returned. A perfectly-plastic FEM solve caps the surface stress at σ_y and loses equilibrium at M_p; linear theory climbs past both — that contrast is the gate. Escalate to fem_set_nonlinear_material for non-rectangular sections or partial-plasticity fields.

Returns {support, S_elastic_mm3, Z_plastic_mm3, shape_factor, yield_mpa, yield_moment_nmm, plastic_moment_nmm, yield_load_n, collapse_load_n, applied_moment_nmm, margin_to_yield, margin_to_collapse, regime, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
load_nNo
supportNocantilever
materialNo
width_mmYes
height_mmYes
length_mmYes
yield_mpaNo

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint, the description discloses the analytical nature, the exact formulas used (S = b·h²/6, Z = b·h²/4, M_y, M_p), the support-condition mapping, the regime classification, and the gating contrast with the FEM solve. This is rich behavioral context that annotations alone could not provide.

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 technically packed, but every sentence contributes meaningful information. It is front-loaded with purpose and math, though the length is high; this is justified by the tool's complexity rather than padding.

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 no output schema, the description fully enumerates the returned fields, including margins, regime, fidelity, warnings, and escalation hints. It also names the relevant sibling and the boundary of applicability, making the tool self-contained for an agent.

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%, so the prose must carry parameter meaning, and it does: width_mm/height_mm/length_mm geometry roles, support mapping, load_n as applied load, yield_mpa or material as the yield source. Every one of the seven parameters is effectively explained.

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 names a specific operation (exact plastic-hinge collapse of a solid rectangular beam), explicitly notes 'NO solver', and contrasts the tool with its closed-form FEM sibling. This makes the tool's purpose unambiguous and distinguishes it from the many analysis tools nearby.

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 explicitly frames the tool as the analytical twin of `fem_set_nonlinear_material` and states the escalation rule: use the FEM tool for non-rectangular sections or partial-plasticity fields. This gives the agent a clear when-to-use and when-not-to-use decision path.

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

plate_checkPlate CheckA
Read-only

Handbook bending of a uniformly loaded flat plate (NO solver) — the "do I need FEM at all?" screen. shape: 'rectangular' (a_mm × b_mm, short side drives; Roark/Timoshenko ν=0.3 coefficients σ=β·q·b²/t², δ=α·q·b⁴/(E·t³), interpolated in a/b) | 'circular' (diameter_mm; exact closed forms). support: 'simply_supported' | 'clamped' (all edges). E from youngs_gpa or a Materials-DB material (which also supplies yield for yield_safety_factor). Exact within thin-plate theory, and the limits are returned as flags (thin_plate_ok: span/t ≥ 10; small_deflection_ok: δ ≤ t/2) — a tripped flag means escalate to the CCX fem_* pipeline (escalate_to='fem_run').

Returns {shape, support, aspect_ratio, beta, alpha, sigma_max_mpa, deflection_max_mm, yield_safety_factor, thin_plate_ok, small_deflection_ok, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
a_mmNo
b_mmNo
shapeYes
poissonNo
supportNosimply_supported
materialNo
youngs_gpaNo
diameter_mmNo
pressure_kpaYes
thickness_mmYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description consistently describes a calculation-only tool. Beyond the annotations, it discloses the validity limits (thin_plate_ok: span/t ≥ 10; small_deflection_ok: δ ≤ t/2), the exactness claim ('Exact within thin-plate theory'), and the escalation behavior. It also reveals that limits are returned as flags, which is behavioral context an agent needs. It doesn't detail interpolation edge cases or failure modes, but the disclosed limits and escalation path go well beyond the annotation baseline.

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 organized: purpose first, then shape/support variants, then material inputs, then validity flags and return fields. Every sentence carries technical content. It is longer than ideal, but the density is justified by the 10-parameter schema and the need to explain the screening logic. The return-field list is somewhat long but serves as a de facto output schema since none exists.

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 10-parameter tool with no output schema and 0% schema coverage, the description is remarkably complete: it explains the formulas, the coefficient sources, the validity limits, the escalation path, and the full return payload. It does not explain what 'fidelity' or 'band_pct' mean, and it doesn't state what happens on invalid input (e.g., missing a_mm for rectangular), but the core calling context is fully covered. The missing pieces are minor relative to the tool's complexity.

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 carries the full burden for parameter meaning. It explains the role of shape ('rectangular' vs 'circular'), support ('simply_supported' | 'clamped'), and the material/youngs_gpa relationship ('E from youngs_gpa or a Materials-DB material (which also supplies yield for yield_safety_factor)'). It also explains the geometric meaning of a_mm × b_mm and diameter_mm. It does not document poisson or pressure_kpa explicitly, but those are self-evident from names and the formulas given. This is strong compensation for zero schema coverage.

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 opens with a specific verb and resource: 'Handbook bending of a uniformly loaded flat plate (NO solver)' and immediately frames it as a screening tool ('do I need FEM at all?'). It clearly distinguishes itself from the FEM pipeline by naming the escalation path (escalate_to='fem_run') and the sibling fem_* tools. The shape/support variants are enumerated, so an agent can tell exactly what this tool computes.

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 explicitly states when to use this tool ('do I need FEM at all?' screen) and when to escalate: 'a tripped flag means escalate to the CCX fem_* pipeline (escalate_to='fem_run')'. It also names the alternative pipeline directly. This is explicit when/when-not guidance, not merely implied context.

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

pocketPocketA

Subtract a pad of length mm from the body. through_all ignores length.

through ('wall'|'body'): preferred over through_all. 'wall' ray-casts the body to find the first exit boundary and cuts exactly one wall thick — correct for solids (one wall = full thickness) AND shelled bodies. 'body' is the legacy ThroughAll; on a shelled body it punches through every wall and ruins the cavity. Implies direction='into_body'. Result carries wall_depth_mm so the caller can verify. direction (preferred over reversed): 'into_body' makes the cut actually remove material; 'away_from_body' extrudes outside the body. The tool probes both Reversed values and picks the one matching intent. reversed: legacy raw flag, used only if neither through nor direction is set. strict: raise instead of warning on a degenerate pocket (see below).

Returns {handle, name, volume, removed_volume, volume_ratio}, plus warnings ONLY when the pocket removed the whole body or removed nothing (the same two degenerate outcomes as boolean_op's cut). Warn-don't-fail is the default; pass strict=True in a scripted recipe to turn both into an error instead. direction='away_from_body' is an explicit request to remove nothing, so it never warns and never raises.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoPocket
lengthNo
sketchYes
strictNo
throughNo
reversedNo
directionNo
through_allNo

TDQS

A4.1/5.0
Behavior4/5

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

The description thoroughly discloses behavior beyond the sparse annotations: how `through` ray-casts and cuts shelled bodies, how `direction` probes Reversed values, the warn-don't-fail default, and the degenerate whole-body/removed-nothing outcomes. The only transparency flaw is an internal inconsistency: it claims "Result carries wall_depth_mm," but the subsequent return list `{handle, name, volume, removed_volume, volume_ratio}` does not include `wall_depth_mm`.

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 long but densely organized, with each parameter getting its own line and the core behavior front-loaded first. Most sentences earn their place, though the wall_depth_mm/return-list inconsistency adds confusion. For an 8-parameter tool, 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?

Given no output schema and sparse annotations, the description covers the main invocation-critical details: purpose, parameter semantics, return fields, warning behavior, and exception handling. It is not fully complete because the required `sketch` parameter is unexplained and the return shape is internally inconsistent regarding `wall_depth_mm`.

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 carries the full burden. It does this well for most parameters: `length`, `through_all`, `through`, `direction`, `reversed`, and `strict` all receive meaningful semantics beyond the bare schema. The required parameter `sketch` is never explicitly explained, and `name` is also omitted, so the coverage is not 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?

The first sentence, "Subtract a pad of `length` mm from the body," states a specific verb, resource, and dimension in one clear statement. It also signals that this is the subtractive counterpart to the sibling `pad` tool. The additional line about `through_all` ignoring length adds a precise behavioral distinction.

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?

There is strong internal guidance: `through` is "preferred over through_all," `direction` is "preferred over reversed," and the shelled-body warning tells the user which mode to avoid. However, the description never explicitly says when to choose this tool over alternatives such as `boolean_op`, `hole`, or `pad`; the usage context is mostly implied by the name and first sentence.

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

polar_patternPolar PatternA

Repeat a PartDesign feature around an axis.

axis: 'X'|'Y'|'Z' for body origin axes, or {handle, edge: tag|'EdgeN'}. angle_deg: total swept angle (default 360 = full circle). occurrences: number of copies (>=2). Includes the original.

ParametersJSON Schema
NameRequiredDescriptionDefault
axisNoZ
nameNoPolarPattern
featureYes
reversedNo
angle_degNo
occurrencesNo

TDQS

A3.5/5.0
Behavior2/5

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

Annotations indicate readOnlyHint=false and destructiveHint=false, but the description adds little beyond that. It does not disclose whether the operation creates a new feature in the active body, whether it modifies the document, what prerequisites exist, or what side effects occur. The behavioral burden is mostly unmet.

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 compact, front-loads the core action, and uses a short parameter list with defaults and edge-case notes. Every sentence earns its place with no filler.

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 6-parameter tool with no output schema and minimal annotations, the description covers the essential modeling parameters but misses prerequisites like active document/body requirements and the meaning of reversed. It is minimally viable but has clear 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 description coverage is 0%, so the description must carry parameter meaning. It usefully documents axis forms, angle_deg default, and that occurrences includes the original. However, it leaves reversed and name undocumented and does not clarify feature selection beyond the opening sentence.

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: 'Repeat a PartDesign feature around an axis.' This clearly distinguishes polar_pattern from sibling tools like linear_pattern and mirrored, which use different pattern geometries.

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 description implies the use case: repeat a feature circularly around an axis. However, it does not explicitly state when to prefer this over linear_pattern, mirrored, or other pattern tools, and it gives no exclusion criteria.

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

press_fit_stressPress Fit StressA
Read-only

Rate an interference (press/shrink) fit via Lamé. p=delta_r E (ro^2-rc^2)/ (2 rc ro^2); hub bore hoop=p(ro^2+rc^2)/(ro^2-rc^2); torque=2pi mu p rc^2 L. interference_mm is diametral.

E comes from material's Materials-DB card; youngs_modulus_mpa overrides it. Every output is LINEAR in E, so a material the corpus has no modulus for is an ERROR, not an assumption (#269) — the message names both exits.

pass is THREE-state: the hub yield check needs the card's yield_mpa, and a card without one (Fused-Silica, Gold, Concrete, ...) leaves the check unperformed. That returns pass=null with the reason in warnings — an unperformed check is not a passed one. Test pass is True, not truthiness.

Returns {contact_pressure_mpa, hub_hoop_stress_mpa, torque_capacity_nm, axial_force_n, hub_yield_sf, youngs_modulus_mpa, youngs_basis, hub_yield_basis, pass, warnings}.

ParametersJSON Schema
NameRequiredDescriptionDefault
materialNoSteel-A36
shaft_dia_mmYes
friction_coefNo
interference_mmYes
hub_outer_dia_mmYes
youngs_modulus_mpaNo
engagement_length_mmYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only provide readOnlyHint=true and openWorldHint=false. The description far exceeds that by detailing the linear dependence on E, the material override, the three-state pass, the unperformed yield check for materials without yield data, and the explicit warning to test `pass is True` rather than truthiness. It also names the specific output keys. This fully discloses behavioral traits for edge cases and error handling, going well beyond what annotations convey.

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 dense but every sentence carries necessary information — formulas, material handling, pass semantics, output keys. It front-loads the core purpose and formula, then layers edge-case logic. No filler or redundancy. For a complex engineering analysis tool, this length is justified and well-organized.

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 no output schema, the description enumerates all returned fields and explains the three-state pass and error conditions. It covers material data dependencies, override behavior, and the units convention for interference. Complete for an analysis tool of this complexity; an agent has enough to call it correctly and interpret results.

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 clarifies that interference_mm is diametral, explains how youngs_modulus_mpa overrides the material's modulus, and connects material to the Materials-DB card. However, it does not explicitly map formula variables (ro, rc) to shaft_dia_mm and hub_outer_dia_mm, though the names are self-explanatory. The non-obvious parameter semantics are addressed, so it earns a 4.

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 opens with a precise verb and resource: 'Rate an interference (press/shrink) fit via Lamé.' It names the theory and the specific calculation, and the formula distinguishes it from siblings like hertz_contact or bolted_joint_check. The scope is clear and unambiguous.

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 description makes the tool's domain obvious (press/shrink fit stress analysis) but does not explicitly state when to use it over alternatives or when not to use it. It gives clear context — e.g., 'interference_mm is diametral' and material behavior — but no exclusion criteria or sibling comparisons. This meets the 'clear context, no exclusions' level.

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

project_check_referencesProject Check ReferencesA
Read-only

Reference-integrity guard (issue #143 / D1) — catch a broken cross-file reference before a merge (the chronic PDM failure mode). Loads a project's assembly manifest + item registry and checks every reference resolves: a moved / renamed / missing component file, a dangling item-ref (an unknown id, or a resolved file missing on disk), an instance naming an unknown component, and naming-convention violations.

project: path to the project.json container.

Returns {ok, problems} — ok is True iff every reference is live, so a broken reference is reported here instead of as a cryptic merge failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is known. The description adds meaningful behavioral context: it loads a manifest and registry, checks every reference, and returns an {ok, problems} structure with the semantics of 'ok' defined. It also explains that broken references are reported here instead of failing later, which any agent needs to know. This goes beyond the annotations without contradicting them.

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 description packs a lot of information: the issue reference (#143 / D1), the four specific failure modes, the parameter meaning, and the return format. While this is useful, the enumeration is verbose and the issue number is arguably noise for an agent. It front-loads the purpose effectively, but the detail could be condensed without losing meaning. It is not excessively long, but it lacks the tightness of a 4.

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 tool with one parameter, no output schema, and read-only annotation, the description is nearly complete. It explains the input format, what the tool checks, and the return structure with the meaning of 'ok'. It does not describe potential error conditions or how to interpret the problems array beyond 'ok is True iff every reference is live', but for a read-only check tool this is sufficient. The description covers the essential ground without requiring further inference.

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% for the single parameter, so the description carries the full burden. It clearly states 'project: path to the project.json container', adding a definition and expected format beyond the bare type string. This is sufficient for an agent to supply the correct value, though it could have elaborated on path resolution details. It compensates well for the missing schema description.

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 the tool checks reference integrity in a project, naming specific failure modes (moved/renamed/missing files, dangling item-refs, unknown components, naming-convention violations). It distinguishes itself from broader validation tools by emphasizing 'before a merge' and the 'chronic PDM failure mode', making its specific purpose clear. However, it does not explicitly name sibling tools for contrast, so it stops short of a 5.

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 description provides a clear usage context: use this tool before a merge to catch broken cross-file references, instead of letting them surface as a cryptic merge failure. It implies when to run it (pre-merge) and what it prevents, but does not explicitly list alternatives or when-not-to-use cases. The guidance is strong but not exhaustive, earning a 4.

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

project_resolve_manifestProject Resolve ManifestA
Destructive

Resolve a project's item-ref components to file components and write a merge- ready manifest (issue #143 / D1, the deferred #140 seam). Each component naming an item (items.json identity, not a bare path) is lowered to a {file} component with the CAD artifact resolved from the registry, so merge_assembly consumes the result unchanged — renaming/moving a file updates the item's files[] in one place without breaking any reference.

project: path to the project.json container. out: output manifest path (defaults to .resolved.json next to it).

Returns {path, lowered} — the written path and the lowered manifest object; a dangling item-ref fails loudly.

ParametersJSON Schema
NameRequiredDescriptionDefault
outNo
projectYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, so the write operation is known. The description adds valuable context: the resolution process, the lowering to {file} components, and that dangling refs fail loudly. It also explains the benefit of maintaining item references. No contradiction with annotations.

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 detailed but each sentence adds value: purpose, mechanism, parameters, and return value. It is front-loaded with the main action and then provides supporting context. Slightly dense due to issue references and explanatory clauses, but not wasteful.

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 tool of this complexity (transforming references, writing a file, integrating with merge_assembly), the description covers the purpose, inputs, output format, failure behavior, and the rationale for the transformation. No output schema exists, but the return structure is explicitly stated. Everything an agent needs to call it correctly is present.

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 entirely carries the burden. It explains 'project' as the path to the project.json container and 'out' with its default behavior. This fully compensates for the schema's lack of 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?

The description states a specific action: resolve item-ref components to file components and write a merge-ready manifest. It clearly distinguishes from siblings like merge_assembly and items_resolve by describing the transformation and its downstream consumer. The purpose 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 Guidelines4/5

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

The description explains that the output is consumed by merge_assembly, implicitly defining when to use this tool (before assembly merging). It also mentions the failure mode for dangling refs, but does not explicitly state when not to use it or name alternative tools. The context is clear enough for an agent to infer usage, so a 4 is appropriate.

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

project_validateProject ValidateA
Read-only

Validate a project.json container (issue #143 / D1): the schema stamp ("ankusdrive.project/1"), the naming convention on the project name, the conventional path fields, and — relative to the project directory — that the referenced manifest + item registry exist, the components directory is present, and a named master/skeleton is a real component of the assembly manifest.

project: path to the project.json container.

Returns {ok, problems, schema, name} — ok is True iff problems is empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description only needs to add beyond that. It does add the precise validation logic and the return tuple ({ok, problems, schema, name}) with the 'ok is True iff problems is empty' condition, giving a clear picture of behavior.

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 well-structured with a leading verb and colon, a terse enumeration of checks, a parameter line, and a return-type line. The '(issue #143 / D1)' reference is extraneous for an AI agent, preventing a top score.

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 single-parameter read-only validation tool, the description covers purpose, parameter meaning, return shape, and the validation criteria. No output schema exists, but the return tuple is specified, so an agent has everything needed to invoke and interpret results.

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?

The input schema provides no description for the single 'project' parameter (0% coverage), but the description compensates by defining it as 'path to the project.json container'. This fully clarifies the expected value.

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 ('Validate') and resource ('project.json container'), then enumerates the exact validation checks: schema stamp, naming convention, path fields, existence of manifest/item registry, components directory, and master/skeleton membership. This level of specificity distinguishes it from generic validate tools and siblings like project_check_references.

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?

Provides clear context by listing the validation scope, so an agent can infer when to use it for project.json validation. However, it does not explicitly name alternatives or when-not-to-use it, leaving some ambiguity among the many sibling validation and resolution tools.

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

publish_interfacePublish InterfaceA
Destructive

Record a named interface frame on a component so other parts can mate to it — the published "here is where you bolt to me, and how it's oriented".

handle: the component's shaped object. name: interface name (e.g. "lid_seat", "bolt_circle", "bore_axis"). frame: {origin:[x,y,z], z_axis:[...]?, x_axis:[...]?}. z_axis defaults +Z, x_axis +X. Extra keys (e.g. bolt-circle metadata) are stored verbatim.

Persists in the component's .FCStd as a JSON property bag, so merge_assembly can mate against it later. Returns {handle, name, frame, interfaces}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
frameYes
handleYes

TDQS

A4.5/5.0
Behavior4/5

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

Beyond annotations (readOnlyHint=false, destructiveHint=true), the description discloses persistence in the .FCStd as a JSON property bag and the return payload. It doesn't mention overwrite or replacement semantics, but it doesn't contradict the annotations.

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 front-loads the purpose, then uses line breaks and compact notation per parameter, followed by persistence and return-value notes. There is no filler; every sentence earns its place.

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 description covers the main call contract: params, defaults, persistence, and return value (important because no output schema exists). It omits some edge-case semantics like whether frame axes must be normalized/orthogonal or whether reusing a name replaces an existing interface, but the core usage is well specified.

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?

With 0% schema coverage, the description supplies complete parameter meaning: handle is the shaped object, name is the interface label with examples, frame is a structured object with defaults and verbatim extra keys. This fully compensates for the empty schema.

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?

Description opens with a specific verb and object: 'Record a named interface frame on a component' and spells out the mating purpose. This clearly distinguishes it from read-only siblings like get_interface and from merge_assembly which consumes the published interface.

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 states the intended use case: publishing an interface so other parts can mate, and names merge_assembly as the later consumer. However, it doesn't explicitly say when not to use it or point to get_interface as the read alternative.

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

query_facesQuery FacesA
Read-only

Filter faces by a structured predicate. Returns matching descriptors.

Predicate fields (all optional, ANDed):

  • kind / type: 'planar' | 'cylindrical' | 'conical' | 'spherical' | 'toroidal' | 'spline'

  • normal_dir: [x, y, z] unit vector for planar faces (with normal_tol)

  • radius_eq: float, matches cylindrical/conical/spherical (with radius_tol)

  • area_min / area_max: bounds in mm^2 Optional ordering:

  • centroid_max / centroid_min: 'x' | 'y' | 'z' (sorts result)

  • order: 'area_desc' | 'area_asc'

Example: {"type": "planar", "normal_dir": [0, 0, 1], "centroid_max": "z"} finds the topmost +Z-facing face.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes
predicateYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already cover read-only and closed-world behavior; the description adds meaningful details about ANDed predicate matching and optional ordering. It does not disclose the structure of the returned descriptors, tolerance defaults, or behavior with unknown predicate keys, but these gaps are somewhat mitigated by the readOnlyHint.

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 well-structured with bullet lists and a concrete example. It front-loads the purpose and includes no filler; every sentence adds operational value.

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 read-only query tool with no output schema, the description covers the core predicate and ordering behavior well. It is incomplete regarding the required handle parameter, return descriptor format, defaults for tolerances, and error/empty-result behavior, so an agent still has meaningful unknowns before calling it.

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?

The predicate parameter is documented in depth with allowed values, units, and an example, which is critical since schema description coverage is 0%. However, the required handle parameter is completely unexplained, and tolerance fields like normal_tol and radius_tol are referenced but not defined.

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 ('filter') and resource ('faces'), and immediately states what is returned ('matching descriptors'). The predicate fields make the scope precise and distinguish it from an unfiltered face-listing tool, though it does not explicitly name sibling alternatives like list_faces.

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 description clearly conveys that this tool is for predicate-based face filtering and includes a concrete example, so usage context is implied. However, it never states when not to use it or names alternatives such as list_faces, resolve_face, or classify_face_sides.

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

random_vibrationRandom VibrationA
Read-only

Random-vibration response off a modal run (Miles' equation; closed-form, no external solver). Provide either analysis (a handle whose fem_modal + fem_run already produced natural frequencies) or an explicit frequencies_hz list, plus a base-acceleration PSD psd_profile ([{"hz":20,"g2_hz":0.01}, ...]; log-log interpolated, and zero outside its band so a mode stiffened above the band escapes drive). Each mode is an SDOF resonator with amplification q (default 10; rule of thumb Q≈√f_n), combined by SRSS: rms_g = sqrt(Σ (π/2)·f·W(f)·Q). With modal_stress_mpa_per_g the g response converts to RMS / 3-σ stress; add allowable_stress_mpa for a pass/fail.

Returns {rms_g, first_mode_hz, dominant_mode_hz, q, psd_band_hz, miles_grms_g, modes: [{mode, frequency_hz, psd_g2_hz, contribution_g, in_band}], rms_stress_mpa, three_sigma_stress_mpa, pass}.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNo
analysisNo
psd_profileYes
frequencies_hzNo
allowable_stress_mpaNo
modal_stress_mpa_per_gNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, it discloses the calculation method (SDOF resonators, SRSS combination, exact formula), interpolation behavior (log-log, zero outside band), and consequences (mode stiffened above band escapes drive). It also explains optional stress conversion and pass/fail logic.

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 dense but every sentence carries information: problem statement, input alternatives, PSD behavior, math model, optional stress outputs, and return structure. It is front-loaded with the core purpose and contains no filler.

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 tool with no output schema, the description provides the complete return object, formulas, defaults, and parameter semantics. Nothing an agent needs to decide whether to call it and how to interpret results 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%, and the description compensates fully: it explains analysis as a modal-run handle, frequencies_hz as an alternative, psd_profile with an example and interpolation behavior, q with default and rule of thumb, modal_stress_mpa_per_g conversion, and allowable_stress_mpa for pass/fail. Every parameter gains meaning.

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 opens with a specific verb and resource: computing a random-vibration response from a modal run using Miles' equation, explicitly noting it is closed-form and needs no external solver. This distinguishes it from sibling FEA/harmonic tools like fem_modal or harmonic_response without requiring schema inspection.

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 clearly states the input context: use after a fem_modal + fem_run analysis has produced natural frequencies, or supply an explicit frequency list, plus a PSD. It does not name sibling tools as alternatives or state explicit exclusion cases, but the modal-run and closed-form context makes intended usage clear.

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

recipeBuild RecipeA

Build a registered part recipe into the active document (issue #136): "regenerate with new parameters" = "re-run the recipe." Validates {recipe, inputs} against the declared schema (typed units + ranges) at the door, then runs the deterministic build — geometry + publish_interface + declare_intent. Returns {recipe, schema, inputs, handle, name, interfaces, intent, part}.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputsNo
recipeYes

TDQS

A4.1/5.0
Behavior4/5

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

With readOnlyHint=false and destructiveHint=false, the description adds the specifics: validation of recipe/inputs against the declared schema, a deterministic build, and the concrete sub-operations (geometry + publish_interface + declare_intent). It also lists the return payload, which partially compensates for the missing output schema. It does not contradict the annotations.

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 three sentences are tight; the first sentence states the action, the second explains validation/build order, and the return list is necessary because there is no output schema. The issue reference adds noise, so it is not flawless, but the definition is still efficiently organized.

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 tool with no output schema, the description is reasonably complete: it names the required document context (active document), the validation behavior, the build steps, and the returned fields. It does not mention where recipe IDs come from or that an active document must already be open, but the wording 'into the active document' and 'registered' imply those prerequisites.

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?

Because schema description coverage is 0%, the description must carry param meaning, and it does: 'recipe' is a registered recipe and 'inputs' are the new parameters subject to typed units and ranges. It stops short of detailing the inputs object's key structure or how defaults work when inputs are null, but it gives enough semantic context for a caller.

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?

Opening verb 'Build' names the core action on a specific resource ('registered part recipe') and scopes it to the active document. The clarification about re-running with new parameters removes ambiguity between creating and regenerating, and the action distinguishes this from static siblings like recipe_list, recipe_schema, and recipe_validate.

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 description's context is clear—use this to create or regenerate a registered recipe's geometry in the active document—but it never explicitly names when to prefer recipe_validate or recipe_schema. It implies the distinction by saying it both validates at the door and then performs the build, but leaves the 'validate-only' path to inference.

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

recipe_listRecipe ListA
Read-only

List every registered part recipe — named, parameterized, declared-input build templates (issue #136). Returns {schema, count, recipes} where each recipe maps to {doc, required, optional, emits}; the cheap directory to browse before picking and parameterizing a recipe with recipe_schema / recipe.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds useful behavioral context: it is a 'cheap directory' covering 'every' registered recipe and it returns a specific envelope. It does not discuss pagination or scale limits, but for a zero-parameter read-only list that is a minor 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?

The description is a single dense sentence with front-loaded purpose, return shape, and sibling routing. The parenthetical '(issue #136)' is minor noise, and 'named, parameterized, declared-input build templates' is somewhat jargon-heavy, but overall the text is efficient and well ordered.

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 no output schema, the description carries the burden of explaining return values, and it does: {schema, count, recipes} with each recipe mapping to {doc, required, optional, emits}. It also names the related tools and the intended workflow, so nothing essential is missing for a zero-parameter read-only list tool.

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?

The tool has zero parameters, so the input schema leaves nothing undocumented. Baseline 4 applies because there are no parameter semantics for the description to clarify; the description instead usefully explains the return structure.

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 verb and resource: 'List every registered part recipe' and defines what a recipe is. It also distinguishes itself from sibling tools recipe_schema and recipe by framing itself as the directory to browse before parameterizing.

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 description gives clear workflow context: use this as 'the cheap directory to browse before picking and parameterizing a recipe with recipe_schema / recipe.' It names alternatives but does not explicitly state when not to use this tool or list exclusion cases.

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

recipe_schemaRecipe SchemaA
Read-only

Return one recipe's declared INPUT SCHEMA — its driving parameters with type/unit/default/range. Returns {schema, recipe, doc, inputs:[{name, type, unit?, default?, min?, max?, required, choices?, doc?}], emits}. recipe names a registered recipe; an unknown name fails loudly. This is the contract a parametric regeneration is authored against.

ParametersJSON Schema
NameRequiredDescriptionDefault
recipeYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds valuable behavioral context: it returns a structured object with specific fields, names the 'emits' field, and discloses that an unknown recipe name fails loudly. This goes beyond the annotations and schema.

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?

Three sentences, all dense with information: what it returns, the exact output shape, the failure mode, and the purpose. No filler, no repetition of the schema. The key behavioral facts are front-loaded.

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 single-parameter read-only tool with a rich output description, this is nearly complete. The output schema is absent, but the description enumerates the return fields. The only gap is not telling the agent how to discover valid recipe names (e.g., via recipe_list), which would make it fully self-sufficient.

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 does: it explains that 'recipe' names a registered recipe, that an unknown name fails loudly, and that the returned schema is the contract for parametric regeneration. This adds meaning beyond the bare schema property. However, it doesn't enumerate possible recipe names or point to recipe_list for discovery, so it's not a 5.

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 verb ('Return'), a specific resource ('one recipe's declared INPUT SCHEMA'), and precisely what the output contains. It also distinguishes itself from siblings like recipe_list, recipe_validate, and recipe by naming the contract it returns. This is a clear, specific purpose 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?

The description implies when to use this tool: when you need the driving parameters/contract for a parametric regeneration. It names the recipe parameter and notes that an unknown name fails loudly. However, it does not explicitly state when NOT to use it or name alternatives like recipe_validate or recipe_list, so it falls 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.

recipe_validateRecipe ValidateA
Read-only

Validate a recipe reference {recipe, inputs} WITHOUT building it — the cheap front door (mirrors validate_manifest). Catches an unknown recipe, a missing required input, and a wrong-typed / out-of-range / bad-unit / unknown input. Returns {ok, problems} — ok is True iff problems is empty. Run before building or merging to reject a malformed parameterization before geometry is spent.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputsNo
recipeYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true, so the description's job is to add behavioral context beyond that. It discloses the specific validations performed, the return structure ({ok, problems}), and the semantics of 'ok' (True iff problems is empty). It also clarifies the tool does NOT build, which is critical behavioral information given the openWorldHint=false annotation.

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 compact, front-loaded with the core action, and every clause adds value. It explains what it does, when to use it, what it catches, and the return shape, all in three sentences without redundancy.

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 has only two parameters, no output schema, and annotations cover read-only behavior. The description provides the essential context: the return format, the conditions for success, and the purpose of running it before build/merge. Minor gaps exist around the exact structure of the 'problems' array adaptation, but the description is sufficient for an agent to call 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 description coverage is 0%, so the description carries the full burden of explaining 'recipe' and 'inputs'. The description provides context by naming the inputs parameterization ({recipe, inputs}) and that it validates inputs for type/range/units, but does not detail the format of the recipe string or the exact structure of inputs object. Given zero coverage, more detail would be expected, but the basic semantics are conveyed.

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 clearly states that the tool validates a recipe reference without building it, and explicitly lists the categories of errors it catches (unknown recipe, missing required input, wrong-typed, out-of-range, bad-unit, unknown input). This distinguishes it from build tools and validation of other entities.

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 description states to run before building or merging to reject malformed parameterizations before geometry is spent. It also mentions the tool mirrors validate_manifest, which helps route to the correct validation tool. However, explicit when-not-to-use scenarios are not provided.

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

register_handleRegister HandleA

Register an existing FreeCAD object into the AnkusDrive handle table. Use after run_script (when auto_register=False) or after open_document to bring objects into the handle ecosystem so subsequent tool calls accept them via handle.

object: the FreeCAD object's .Name (e.g. 'Helix001', 'Cut'). prefix: handle prefix (default 'manual'). Each call returns a fresh handle; registering the same object twice produces two aliases. Returns {handle, name, type, label}.

ParametersJSON Schema
NameRequiredDescriptionDefault
objectYes
prefixNomanual

TDQS

A4.9/5.0
Behavior5/5

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

Annotations indicate a non-read-only, non-destructive operation, but the description adds the key behavioral detail: each call returns a fresh handle and registering the same object twice produces two aliases. This non-idempotent side effect is exactly the kind of behavior an agent needs to know and is not visible in 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.

Conciseness5/5

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

Each sentence adds distinct value: one-line action, targeted usage context, and compact parameter/return documentation. No filler or repetition of schema fields.

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 simple 2-parameter tool with no output schema, the description covers prerequisites, parameters, return fields, and repeated-call behavior. It omits failure cases such as nonexistent objects and the persistence scope of the handle table, but these are minor for this low-complexity operation.

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?

With 0% schema description coverage, the description carries full parameter documentation. It defines object as the FreeCAD object's .Name with concrete examples, and explains prefix's default plus the alias-creating consequence of repeated calls.

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 action ('Register an existing FreeCAD object') and resource ('AnkusDrive handle table'), and explains the purpose: making objects addressable by handle in subsequent calls. This is clearly distinct from sibling tools like run_script or get_object, which create or retrieve objects rather than registering handles.

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 placement conditions: after run_script with auto_register=False or after open_document. It also warns that repeated registration produces multiple aliases, telling the agent when registration is needed and what to expect if called redundantly.

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

release_packageRelease PackageA
Destructive

Produce the vendor/RFQ deliverable bundle for one item at one revision — STEP + drawings + BOM + inspection package + a checksummed manifest — gated by the item's lifecycle state and stamped with its ECO.

Every piece of this exists as its own tool. What this adds is the guarantee that ties them together: the STEP, the PDF, the BOM and the title block all describe the SAME revision of the SAME item. That is the whole point of a release, and it is enforced BEFORE a single file is written:

  • the item must be in a releasable lifecycle state (released), or draft must be set — which watermarks EVERY artifact PRELIMINARY (burned into the drawing, and carried as a format-legal comment in the STEP header, the DXF and the CSVs). An obsolete item is refused in both modes.

  • drawing_gate must pass for every included page — with require_ballooned when the inspection kind is requested.

  • the title block's part number / revision / material must MATCH the items registry. A mismatch is a FAILURE carrying expected-vs-actual, never a silent fix: quietly rewriting the print would destroy the only independent check that it and the model describe the same thing.

A refused release writes NOTHING — no half-populated directory a build script could mistake for a package.

registry / item: the items.json sidecar and the item id being released. out_dir: where the bundle is written (created if absent). kinds: any of "step", "drawing_pdf", "drawing_svg", "drawing_dxf", "bom_csv", "inspection", "manifest_json". Default step/drawing_pdf/drawing_dxf/ bom_csv/manifest_json. manifest_json is always added; inspection (ballooned print + plan + blank AS9102 form) implies a drawing kind. draft: cut a PRELIMINARY package from an unreleased item. rfq: the quote flavour — adds quantity breaks and the cost_estimate rollup as a quote-COMPARISON baseline (fidelity "correlation", band_pct 100 — trust the ratios, not the dollars) and drops internal-only artifacts (the inspection package, which states your acceptance criteria). eco: the change order this release is cut under; defaults to the item's metadata.eco. Stamped into the manifest AND the title block's REV cell. pages: page handles/names/labels (default: every page in the document). handle / object: the geometry to export (default: the first page's main view source — literally the solid the drawing dimensions). process: drawing_gate process ("auto" | "prismatic" | "turned"). density / recursive: BOM options, as in bom_extract. quantity_breaks / cost_process / material: RFQ pricing inputs (default [1, 10, 100], "cnc", and the item's declared material).

Determinism: the same item at the same revision produces a BYTE-IDENTICAL package. The exporters' wall-clock header stamps (the STEP FILE_NAME timestamp above all) are scrubbed to a fixed epoch, so a re-released package is diffable by checksum.

Returns {ok, dir, item, part_number, rev, lifecycle, eco, material, draft, watermark, flavor, kinds, dropped_kinds, implied_kinds, pages, files:[{name, kind, bytes, blake2b}], manifest, manifest_path, verify, problems}. ok=False means the gate refused and nothing was written; each problem carries {code, where, field, expected, actual, reason}.

ParametersJSON Schema
NameRequiredDescriptionDefault
ecoNo
rfqNo
itemYes
draftNo
kindsNo
pagesNo
handleNo
objectNo
densityNo
out_dirYes
processNoauto
materialNo
registryYes
recursiveNo
cost_processNocnc
quantity_breaksNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false and destructiveHint=true; the description supplies substantial behavioral context beyond that: atomic refusal ('A refused release writes NOTHING'), PRELIMINARY watermarking burned into drawing/STEP header/DXF/CSVs, mismatch failures carrying expected-vs-actual rather than silent fixes, and byte-identical deterministic output with scrubbed timestamps. No contradiction with annotations — both consistently portray a mutating, potentially destructive operation.

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?

Despite its length, every section earns its place: purpose, aggregation rationale, preconditions, parameter block, determinism note, and return shape. Critical scoping and safety statements are front-loaded ('enforced BEFORE a single file is written', 'A refused release writes NOTHING') before the parameter reference list.

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 no output schema and minimal annotations, the description carries the full burden and delivers: it enumerates the complete return record including the per-file list {name, kind, bytes, blake2b} and the problem shape {code, where, field, expected, actual, reason}. Nothing an agent needs to invoke or interpret this tool is left undocumented.

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%, yet the description documents essentially all 16 parameters with defaults and semantics: valid kinds and their implication rules, draft/rfq/eco meaning, handle/object defaults ('the solid the drawing dimensions'), and RFQ pricing inputs with defaults [1, 10, 100], 'cnc', and the item's declared material. 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?

The opening sentence names a specific verb and resource: 'Produce the vendor/RFQ deliverable bundle for one item at one revision' with explicit contents (STEP + drawings + BOM + inspection package + checksummed manifest). It further distinguishes itself from siblings by naming its unique addition: 'the guarantee that ties them together' — all artifacts describe the SAME revision of the SAME item.

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 description explicitly frames the when-to-use decision: 'Every piece of this exists as its own tool. What this adds is the guarantee that ties them together' — clear differentiation from per-artifact siblings like export_drawing or bom_extract. It also states gating conditions (lifecycle state, drawing_gate pass, title-block match) and refusal modes including obsolete items. However, it stops short of naming explicit decision rules such as 'use the individual exporter when you need only a single artifact'.

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

render_capabilitiesRender CapabilitiesA
Read-only

Report which photoreal renderers are usable right now — Blender (the studio backend) and the FreeCAD Render add-on renderers — so you can pick one for render_photoreal, or tell the user exactly what to install, instead of discovering availability by trial and error.

Takes no arguments and renders nothing. Resolves Blender like a solver (ANKUSDRIVE_BLENDER_PATH -> PATH -> per-OS install dirs, incl. the versioned Blender Foundation\Blender X.Y and /opt|~/.local/opt/blender-*) and launches it once (cached) to read its version and GPU; resolves each add-on renderer as render_photoreal would, changing no settings.

Returns {default_renderer ('auto'), auto_selects (the renderer 'auto' would use now, or None), recommended ('Blender'), platform, available (ready renderer names for renderer=), renderers: {name: {available, backend ('blender' | 'render_addon'), path or install_hint, ...}} — Blender adds version, device, gpu, oidn, supported, scenes, qualities, devices, finishes — materials (appearance card names), appearance_fields (the PBR dict keys), addon_importable, addon_error (when the add-on does not import), and suggestion {renderer, why, install} while Blender is missing}. When the user wants better renders, relay the Blender install_hint verbatim — never run installers yourself. setup_status reports the same install under the studio_render family.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only say readOnlyHint=true and openWorldHint=false, but the description adds meaningful behavioral detail: it 'Takes no arguments and renders nothing,' 'launches [Blender] once (cached),' 'changing no settings,' and 'never run installers yourself.' This is essential context beyond the annotations and there is no contradiction.

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 long but every sentence earns its place: purpose, side-effect behavior, resolution logic, return structure, usage caution, and sibling relationship are all covered. It is front-loaded with the primary purpose and contains no wasted filler.

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?

There is no output schema, yet the description supplies a detailed return contract including default_renderer, auto_selects, recommended, available, renderers, Blender-specific fields, addon_error, and suggestion. It also covers edge cases like missing Blender and the install_hint, making the tool fully usable without external documentation.

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?

The tool has zero parameters and the input schema is empty with 100% coverage, so there is no parameter semantics to add. The description explicitly states 'Takes no arguments,' which makes the parameter situation unambiguous. The baseline of 4 is appropriate for a no-parameter tool.

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 opens with a specific verb and resource: 'Report which photoreal renderers are usable right now.' It clearly distinguishes itself from render_photoreal by framing the tool as the way to pick a renderer before calling it, rather than discovering availability by trial and error.

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 explicitly says when to use this tool: 'so you can pick one for render_photoreal, or tell the user exactly what to install.' It also gives an exclusion ('never run installers yourself') and points to a sibling relationship with setup_status for install reporting.

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

render_fem_resultsRender FEM ResultsA
Read-only

Render a completed FEM result's surface, colored by a per-vertex field.

Pulls the result surface (boundary triangulation + per-node field values + displacement vectors) from the worker, then colors it with a viridis colormap (barycentrically interpolated), overlays the deformed shape, and draws a colorbar with the field min/max — the "agent eyes" for a stress / displacement / thermal solve.

field: 'vonmises' (default) | 'displacement' | 'temperature'. view: a preset ('iso'|'top'|'front'|…) or a custom '(azimuth,elevation)' camera passed as e.g. "45,35". deformation_scale: 'auto' scales the peak displacement to ~8% of the model diagonal; a number is used verbatim; '0' disables the deformed overlay.

Returns {png_base64, width, height, field, units, min, max, view, node_count, triangle_count}.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoiso
edgesNo
fieldNovonmises
widthNo
heightNo
analysisYes
deformation_scaleNoauto

TDQS

A4.4/5.0
Behavior5/5

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

The description adds substantial behavioral detail beyond the readOnlyHint annotation: it pulls the result surface from the worker, uses viridis with barycentric interpolation, overlays the deformed shape, draws a colorbar, and explains deformation_scale behavior including auto-scaling to ~8% of the model diagonal. This gives the agent a faithful model of what the tool does internally.

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 information-dense but well organized: a one-sentence purpose, a concise explanation of the rendering pipeline, parameter semantics, and the return payload. No sentences are wasted, and the most important distinctions are front-loaded.

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 description is largely complete for a read-only rendering tool: it explains the processing pipeline, key parameters, and return fields. The main gaps are the absence of any explanation for the required analysis parameter and the meaning of edges, which are important for correct invocation given the lack of schema descriptions or an output schema.

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?

The description usefully explains field, view, and deformation_scale, including allowed values and examples. However, the required analysis parameter is never described, and edges, width, and height are left entirely to the schema names. Since schema description coverage is 0%, the description only partially compensates for the missing parameter documentation.

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 clearly specifies the tool's action: render a completed FEM result's surface colored by a per-vertex field. It distinguishes this from generic rendering tools like render_view or render_photoreal by focusing on FEM stress/displacement/thermal results with a deformed overlay and colorbar.

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 description states that this is for completed FEM results and gives the supported fields, making it clear when it applies. It does not explicitly name alternatives or say when not to use it, but the context is strong enough for an agent to route to this tool for FEM result visualization.

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

render_jobRender JobA
Destructive

Poll an async render started by render_photoreal_submit.

Returns {job_id, status} where status is 'running', 'done', or 'failed'. When 'done', also returns {png_base64, png_path, renderer, view, material, width, height}; when 'failed', {error}. The result remains available for repeat polls.

Pass discard=True once you have a terminal result to free the job immediately (drops the cached image and closes its temp document); ignored while running. Jobs are also auto-evicted oldest-first once finished jobs exceed an internal cap.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes
discardNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations, the description discloses that results remain available for repeat polls, that discard=True drops the cached image and closes its temp document, that discard is ignored while running, and that finished jobs are auto-evicted oldest-first past an internal cap. This matches destructiveHint=true without contradicting it.

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?

Three tight paragraphs: purpose, return shape, and cleanup behavior. Each sentence adds necessary information, and the primary purpose is front-loaded.

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 no output schema, the description enumerates the return object for every status ('running', 'done', 'failed'), lists the done payload fields, explains repeat-poll availability, and covers both manual and automatic cleanup. Nothing essential is missing for correct invocation.

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?

With 0% schema description coverage, the description carries the parameter burden. It fully explains discard semantics (when it applies, what it does, ignored while running) and implies job_id comes from render_photoreal_submit, though it does not explicitly say 'use the job_id returned by the submit call.'

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 action and resource: 'Poll an async render started by render_photoreal_submit.' This verb+resource pairing distinguishes it from generic job tools and ties it directly to the submission sibling. It clearly identifies this as the render-specific polling counterpart.

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 description states when to use it (after render_photoreal_submit) and when to set discard=True ('once you have a terminal result'). It does not explicitly contrast with siblings like job_status or job_result, but the usage context is unambiguous enough to route an agent correctly.

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

render_photorealRender PhotorealA

Photorealistic "hero image" of a part or a whole assembly — presentation quality, unlike render_view's fast software-rasterized preview.

Call render_capabilities first when unsure what is installed. renderer='auto' (default) uses Blender (Cycles, full install, run headless) when it resolves, otherwise POV-Ray (or another FreeCAD Render add-on renderer). Name one to force it: 'Blender' | 'Povray' | 'Luxcore' | 'Appleseed' | 'Cycles' (the stripped standalone build, not Blender) | 'Ospray' | 'Pbrt'. Renders never modify the live model.

What to render: handle (a part, or an assembly handle — every leaf part is rendered in place) or parts, a list of {handle, appearance?, name?} entries. Appearance per part: appearances maps an assembly's part names (as list_assembly_parts reports them) to an appearance; parts[].appearance sets it inline; material is the fallback for every unassigned part. An appearance is a card name ('Aluminium', 'Brass', 'Carpaint', 'Emission', 'Glass', 'GlossyPlastic', 'Gold', 'Iron', 'Matte', 'RoughPlastic', ...) or a neutral PBR dict {base?, color ('#rrggbb' or linear [r,g,b]), metallic, roughness, emission, emission_strength, transmission, ior, coat, finish ('none'|'fdm_layers'|'brushed'), layer_height_mm}. Unknown cards/fields raise listing the valid ones.

Blender-only (reported under ignored on an add-on renderer): per-part appearance, scene ('studio': seamless cyclorama, soft key/fill/rim area lights, contact shadows), quality ('draft' 16 | 'preview' 64 (default) | 'final' 384 samples, OIDN-denoised), device ('auto' GPU-if-present | 'cpu' | 'gpu'), and output_dir (where render.png + render.blend are written; default a temp dir). view: 'iso' | 'top' | 'bottom' | 'front' | 'back' | 'left' | 'right' | 'side'.

Returns {png_base64, png_path, renderer, auto_selected, view, material, width, height}. The Blender backend adds {blend_path, scene, quality, samples, denoised, device, blender_version, elapsed_s, parts: [{name, material, triangles}]}: open blend_path in Blender 5.1+ (optionally with Blender's own MCP server connected) to art-direct the scene further — AnkusDrive does not drive that server. When 'auto' falls back off Blender the result carries suggestion {renderer, why, install}: relay its install command to the user verbatim rather than installing anything. Not installed: Blender/'auto' return {ok: False, renderer, status, reason, install}; a named add-on renderer raises with install guidance.

Presentation-only: output is not bit-reproducible, so it is kept out of the reliability/golden tests. Renders can take seconds to minutes (extended worker timeout); prefer render_photoreal_submit for quality='final'.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoiso
partsNo
sceneNo
widthNo
deviceNo
handleNo
heightNo
qualityNo
materialNo
rendererNoauto
output_dirNo
appearancesNo

TDQS

A4.9/5.0
Behavior5/5

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

The annotations are minimal (readOnlyHint false, destructiveHint false), so the description carries the burden and fully delivers. It states 'Renders never modify the live model,' describes output file writing, renderer fallback, `ok: False` error shapes for missing installs, and that unknown appearance cards/fields 'raise listing the valid ones.' It also discloses that Blender-only features are reported under `ignored` on add-on renderers and that output is not bit-reproducible, which is rich behavioral context.

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 long but every paragraph is purposeful: purpose, renderer selection, scene-graph input, Blender-only options, return values, and caveats. It is front-loaded with the differentiator from render_view, and lists keep the enumerations scannable. Some minor redundancy exists (e.g., repeating renderer names in prose and list), but the complexity of a 12-parameter, multi-backend tool justifies the length.

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?

This tool has 12 parameters, eight renderers, backend-specific behavior, and no output schema, yet the description covers return shapes for all paths, error/raise behavior, file outputs, and non-reproducibility. The only minor gaps are explicit width/height semantics and what happens if both `handle` and `parts` are supplied, but the 'or' wording sufficiently implies exclusivity. For a tool this complex, the coverage is near-complete.

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?

With 0% schema description coverage, the description must compensate, and it does thoroughly: `handle` vs `parts` with field shapes, precedence among `appearances`/`parts[].appearance`/`material`, valid appearance card names and PBR dict keys, and the full `view`/`scene`/`quality`/`device`/`renderer` enum sets. Width/height are the only parameters not explicitly described, but they are trivially inferable as image dimensions.

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 opens with 'Photorealistic "hero image" of a part or a whole assembly — presentation quality, unlike render_view's fast software-rasterized preview.' This names a specific verb (render), the resource (part/assembly), and immediately distinguishes it from a sibling. An agent can clearly tell this from render_view, render_views, and render_photoreal_submit without opening any other 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?

It explicitly provides when-to-use guidance: 'Call render_capabilities first when unsure what is installed,' 'prefer render_photoreal_submit for quality="final",' and contrasts itself with render_view's 'fast software-rasterized preview.' It also explains renderer auto-selection fallback and tells the agent to relay install commands verbatim rather than install anything. This is concrete, actionable direction.

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

render_photoreal_submitRender Photoreal SubmitA

Start a photorealistic render asynchronously; returns immediately with {job_id, status, renderer} instead of blocking for the whole render.

Use this (rather than render_photoreal) for renders that may take a long time — quality='final', large images, big assemblies — so the worker stays responsive. Poll render_job(job_id) until status is 'done' (then it returns the PNG and, for Blender, blend_path) or 'failed'. Same arguments, renderer selection and not-installed miss dict as render_photoreal; see render_capabilities for what resolves on this machine.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoiso
partsNo
sceneNo
widthNo
deviceNo
handleNo
heightNo
qualityNo
materialNo
rendererNoauto
output_dirNo
appearancesNo

TDQS

A4.4/5.0
Behavior5/5

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

Discloses the non-blocking asynchronous behavior, immediate return payload shape, polling requirement, terminal statuses, and the returned artifacts (PNG and blend_path for Blender). This is substantial behavioral context beyond the sparse annotations, with no contradiction.

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?

Four purposeful sentences: async behavior and return value first, usage guidance second, polling instructions third, and shared-argument reference last. No filler or repetition; every sentence earns its place.

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 core workflow is well covered: submit, poll, retrieve result, handle failure, and check render_capabilities. The only gap is that full parameter semantics are delegated to render_photoreal rather than being summarized here, which may be insufficient if that sibling's description is not equally detailed.

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, but it only refers the agent to render_photoreal for 'same arguments' and mentions quality='final' as an example. The 12 parameters remain unexplained in this definition, making selection of valid values reliant on external tool documentation.

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?

Starts with a specific action and resource: 'Start a photorealistic render asynchronously; returns immediately with {job_id, status, renderer}' and explicitly contrasts with render_photoreal. This clearly distinguishes the submit variant from its synchronous sibling.

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 tells the agent when to use this tool instead of render_photoreal: long renders with quality='final', large images, or big assemblies, to keep the worker responsive. It also gives the follow-up workflow: poll render_job(job_id) until status is 'done' or 'failed'.

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

render_viewRender ViewA
Read-only

Render an isometric/orthographic view of a shaped object as a PNG.

view: 'iso' | 'top' | 'bottom' | 'front' | 'back' | 'left' | 'right' | 'side'. deflection: tessellation accuracy in mm (smaller = finer mesh, slower). edges: draw triangle edges over filled faces.

Returns {png_base64, width, height, view, vertices, triangles}.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoiso
edgesNo
widthNo
handleYes
heightNo
deflectionNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, so the agent knows this is a safe read operation. The description adds behavioral context by explaining the deflection parameter (tessellation accuracy, smaller = finer mesh, slower) and the return format (png_base64, width, height, view, vertices, triangles). This goes beyond the annotations and helps the agent understand performance trade-offs and output structure.

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 compact and front-loaded with the core purpose. It uses a bullet-like list for parameters and a clear return format line. Every sentence adds value, with no filler or repetition of schema fields.

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 description is complete for a read-only rendering tool: it covers the output format, key parameters, and performance trade-offs. It lacks explicit mention of the 'handle' parameter's meaning, but the schema marks it as required and the context of a shaped object makes it inferable. No output schema exists, so the return format description is valuable and sufficient.

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 the 'view' parameter with all allowed values, 'deflection' with its meaning and trade-off, and 'edges' with its effect. However, it does not explain 'width', 'height', or 'handle' beyond what the schema provides, which is a minor gap given the schema already has defaults and titles.

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 clearly states the tool renders an isometric/orthographic view of a shaped object as a PNG, with a specific verb ('render'), resource ('shaped object'), and output format. It distinguishes itself from sibling render tools like render_photoreal and render_fem_results by specifying the view types and PNG output.

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 description implies usage by listing view options and parameters, but does not explicitly state when to use this tool versus alternatives like render_photoreal or render_fem_results. The context is clear for a rendering tool, but no explicit exclusions or alternative routing is provided.

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

render_viewsRender ViewsA
Read-only

Render multiple views of a single object. Returns {views: {view_name: {png_base64,...}}}. Default views: ['iso', 'top', 'front'].

ParametersJSON Schema
NameRequiredDescriptionDefault
viewsNo
widthNo
handleYes
heightNo
deflectionNo

TDQS

A3.8/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description discloses the exact return envelope ({views: {view_name: {png_base64,...}}}) and the default views. It also implies synchronous behavior by stating 'Returns' rather than mentioning job submission. It does not explain how width, height, or deflection affect output, but the annotations already cover the safety profile.

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?

Two sentences with no filler. The action, return shape, and defaults are all front-loaded and each sentence adds useful information.

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 return shape is helpful given there is no output schema, and a default call is well-specified. However, with 5 parameters at 0% schema description coverage and a large sibling tool set, the description leaves non-default parameter semantics and sibling differentiation underspecified.

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 parameter meaning. It connects the required handle to 'a single object' and documents default views, but it offers no semantics for width, height, or deflection. An agent cannot determine units, pixel dimensions, or what deflection controls from this description alone.

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 ('Render'), identifies the resource ('multiple views of a single object'), and distinguishes itself from the sibling render_view by emphasizing multiple views. It also states the default view set, which makes the tool's behavior immediately predictable.

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 description implies usage: use this tool when you need multiple standard views of one object. However, it never explicitly says when to choose render_views over render_view, render_photoreal, or render_fem_results, and it gives no exclusions or alternative criteria.

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

resolve_edgeResolve EdgeA
Read-only

Resolve an edge tag to the current EdgeN index. Errors on miss or ambiguity.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYes
handleYes

TDQS

A3.8/5.0
Behavior4/5

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

The description adds error behavior for misses and ambiguity, which is not captured by the readOnlyHint/openWorldHint annotations. The word 'current' also signals that the EdgeN index is dynamic. No contradiction with the annotations exists.

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?

Two concise sentences carry all the information without wasted words. The first sentence states the core operation and result; the second adds the key failure mode. This is appropriately front-loaded.

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 simple read-only resolution tool, the description conveys purpose and error behavior. However, it omits the meaning of 'handle', the exact return type beyond 'EdgeN index', and any details about tag format. These gaps matter because there is no output schema to fill 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 description coverage is 0%, so the description must compensate. It gives some implicit meaning for 'tag' ('edge tag'), but 'handle' is completely unexplained, and no formats, examples, or relationships between parameters are provided.

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 ('Resolve'), a clear resource ('edge tag'), and a defined outcome ('current EdgeN index'). It also states the failure condition, which makes the tool's purpose precise and distinguishes it from sibling tools that resolve faces or list edges.

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 description gives some implied usage guidance by indicating resolution is only valid when a unique, existing tag is present. However, it never explicitly states when to use this tool instead of alternatives like resolve_face, nor does it mention prerequisites or exclusions.

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

resolve_faceResolve FaceA
Read-only

Resolve a face tag to the current FaceN index. Errors on miss or ambiguity.

Use this when you need to pass a (object, 'FaceN') reference into a tool that doesn't accept tags directly (e.g. legacy FEM constraints).

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYes
handleYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds meaningful behavioral detail: it errors on miss or ambiguity and resolves to the 'current' FaceN index, implying state-dependent indexing. This goes beyond what annotations provide.

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?

Two short sentences front-load the core purpose and failure behavior, then provide a precise usage scenario. Every sentence earns its place with no unnecessary detail.

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 simple read-only resolver with two parameters, the description covers purpose, failure behavior, and typical use. It does not specify the exact return type or explicitly define 'handle' and 'tag', but the phrase '(object, FaceN)' supplies enough context for most agents.

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 partially explains the parameters through '(object, FaceN)', implying handle is the object identifier and tag is the face tag, but it does not explicitly define valid formats, sources, or examples for either 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 uses a specific verb ('Resolve') and resource ('face tag') with a clear result ('current FaceN index'), and the 'Errors on miss or ambiguity' behavior adds precision. It is distinct from the sibling resolve_edge, which resolves edges instead of faces.

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 description explicitly states when to use the tool: when passing a (object, 'FaceN') reference to tools that do not accept tags directly, with a concrete example ('legacy FEM constraints'). It does not explicitly mention when not to use it, but the usage context is clear enough.

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

restart_workerRestart WorkerA
Destructive

Kill the current workspace's FreeCAD worker process and spawn a fresh one. Use when the worker is wedged (e.g. App.ActiveDocument desynced from internal state). All open documents, unsaved changes, and handles in THIS workspace are lost — save first if needed. Other workspaces are untouched. Returns {restarted: True, workspace: , freecad: [...]}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark destructiveHint=true/net false, and the description adds significant context: it lists exactly what is lost ('All open documents, unsaved changes, and handles in THIS workspace') and what is preserved ('Other workspaces are untouched'). It also states the return shape, providing full behavioral disclosure beyond the annotations.

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?

Three sentences with no wasted words: action, trigger, consequences, and return shape. Every sentence earns its place, and the most critical information (destruction scope) is front-loaded.

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?

The description is complete for a destructive zero-parameter tool. It covers operation, conditions, side effects, scope, and return shape. With no output schema, the explicit return format fills that gap.

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?

The tool has zero parameters, so there is no parameter burden on the description. Schema coverage is 100% (empty properties), and the description doesn't need to add parameter semantics. Baseline 4 applies for zero-parameter tools.

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?

Description states a precise verb ('Kill the current workspace's FreeCAD worker process and spawn a fresh one') with the exact resource and scope. It clearly distinguishes itself from any sibling tool by its action and target, and the title 'Restart Worker' aligns with the description without being a tautology.

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?

Explicitly says when to use: 'Use when the worker is wedged (e.g. App.ActiveDocument desynced from internal state).' It gives a clear contextual trigger but does not provide explicit when-not-to-use guidance or alternative tool names. This is clear context without exclusions.

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

revolveRevolveB

Revolve a sketch around a body origin axis ('X'|'Y'|'Z') by angle deg.

ParametersJSON Schema
NameRequiredDescriptionDefault
axisNoY
nameNoRevolution
angleNo
sketchYes
reversedNo

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already indicate this is a non-read-only, non-destructive operation. The description adds the useful constraint that the revolve is around a body origin axis and that the angle is in degrees, but it does not disclose side effects or prerequisites beyond that.

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?

A single, front-loaded sentence with no filler. It communicates the core operation, axis options, and angle unit efficiently.

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

Completeness2/5

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

For a feature-creation tool with five parameters and no output schema, this description is too thin. An agent would not know what the sketch parameter expects, what 'reversed' does, or what the result of the operation is.

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 five undocumented parameters. It only clarifies 'axis' and 'angle', leaving 'sketch', 'name', and 'reversed' unexplained.

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 verb ('Revolve'), resource ('a sketch'), and the key parameters (axis and angle). It clearly identifies this as a CAD revolve operation, distinct from sibling operations like pad, sweep, or loft.

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?

No guidance is given for when to use this tool versus alternatives such as sweep or loft, and no prerequisites or exclusions are mentioned. The only implied context is the operation name itself.

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

rigid_sphere_scatteringRigid Sphere ScatteringA
Read-only

Exact rigid-sphere plane-wave scattering far-field form function via the Mie series (NO solver) — the closed-form twin the Bempp exterior-acoustics BEM scattering solve (acoustic_radiation_submit, problem='scattering') is gated against. For compactness ka and scattering angle theta_deg (from the forward direction; 180° is backscatter), f∞(θ) = (2/ika)·Σₙ(2n+1)[−j'ₙ(ka)/h'ₙ(ka)]· Pₙ(cosθ) — a rigorous spherical-harmonic sum (Neumann ∂p/∂r=0 on the sphere) truncated past convergence (fidelity='exact'). The backscatter |f∞(π)| → 1 in the geometric (ka≫1) limit and rises through the resonance region. A BEM scattered far field must land on |f∞(θ)|.

Returns {ka, theta_deg, a_m, form_function_abs, form_function_re, form_function_im, backscatter_abs, n_terms, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
kaYes
a_mNo
theta_degNo

TDQS

A4.4/5.0
Behavior5/5

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

The description discloses that this is an exact closed-form computation (no solver), lists the underlying rigid-sphere Neumann boundary condition, and notes the series is truncated past convergence with fidelity='exact'. This adds meaningful behavioral detail beyond the `readOnlyHint` annotation without contradicting it.

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 tool's purpose and key distinction from the BEM solver. The formula and return-field list add necessary detail, though the length is near the upper bound and could be trimmed slightly without losing value.

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 description covers the physical model, formula, and usage context well, and lists return fields. However, with no output schema, it leaves return field meanings like `band_pct`, `valid_range_ok`, and `escalate_to` unexplained, and does not clarify valid input ranges or the meaning of `a_m`.

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?

The description gives meaningful semantics for `ka` and `theta_deg`, including the forward-direction reference and 180° backscatter, and embeds them in the formula. However, `a_m` is entirely unexplained despite appearing in the input schema, leaving an important parameter ambiguous.

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 clearly states the tool computes the exact rigid-sphere plane-wave scattering far-field form function via the Mie series, and explicitly distinguishes it as the closed-form twin to the BEM scattering solve. This makes its purpose and resource unambiguous and differentiates it from `acoustic_radiation_submit`.

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 explicitly names `acoustic_radiation_submit` as the BEM alternative and says the BEM scattered far field must land on this analytic result, making the validation/reference use case explicit. The 'NO solver' statement clarifies when not to use it as a numerical simulation.

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

run_scriptRun Python ScriptA
Destructive

Escape hatch: execute Python in the worker with App/Part/ObjectsFem in scope.

Set __result__ in the script to return a JSON-serializable value.

auto_register (default True): any new shape-bearing object the script creates is automatically registered into the handle table. The result includes a registered list of {handle, name, type} entries so the next tool call (render_view, list_faces, fillet_edges, mass_properties, etc.) can address script-created objects via handle without a separate register_handle round-trip.

Disabled unless ANKUSDRIVE_ALLOW_RUN_SCRIPT permits it (the Claude Desktop extension defaults it off); when disabled this tool is not registered at all.

Returns {result, registered}.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
auto_registerNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already signal destructiveness, but the description adds substantial behavioral context: arbitrary Python execution, the __result__ return contract, automatic registration of created objects into the handle table, the security gate, and the exact return shape. This goes well beyond what the structured hints provide.

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 well-structured and front-loaded with the 'Escape hatch' characterization. It is packed with useful details, though the final 'Returns {result, registered}' is slightly redundant with the earlier registered-list explanation.

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 powerful tool with no output schema and no parameter descriptions, this is nearly complete: it covers the execution environment, the required __result__ convention, auto_register behavior, the environment variable gate, and the exact return structure. An agent has enough information to call it correctly.

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 auto_register's default and side effects in detail, and it defines the code contract through the __result__ requirement. The code parameter is described somewhat implicitly, but the script-execution framing makes its meaning clear.

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 the core behavior with a specific verb and object: execute Python in the worker, and names the in-scope resources (App/Part/ObjectsFem). It also differentiates itself from siblings like register_handle by explaining that auto_register removes the need for a separate registration round-trip.

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 'Escape hatch' label and the auto_register discussion give clear context for when this tool is useful, and it explicitly contrasts with register_handle. It also documents the environment-gating condition (ANKUSDRIVE_ALLOW_RUN_SCRIPT), though it does not explicitly enumerate when not to use the tool.

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

save_documentSave DocumentA
Destructive

Save the active document to the given .FCStd path.

visibility_hygiene (default True): before saving, hide any object that has been consumed as a producer-input (the Base/Tool of a Cut, the BaseFeature of a Body, every feature inside a Body's Group, etc.). Without this the re-opened doc double-renders intermediates on top of the final shape — a failure mode that looks identical to broken geometry. Pass False to keep explicit set_visibility overrides intact.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
visibility_hygieneNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description discloses a non-obvious side effect: it hides producer-input objects before saving, explains the resulting failure mode if this is not done, and tells the caller how to preserve explicit visibility overrides. This is exactly the kind of behavioral 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.

Conciseness5/5

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

The description front-loads the core purpose in one clear sentence, then adds a focused paragraph about the one non-obvious parameter. Every sentence provides useful information, with no filler or redundancy.

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 two-parameter save tool with destructive annotations and no output schema, the description covers purpose, parameter semantics, side effects, and a conditional usage scenario. An agent has enough information to invoke the tool correctly and understand the consequences.

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%, so the description carries the full burden. It thoroughly explains visibility_hygiene's default, effect, rationale, and how to opt out, and it clarifies that path refers to a .FCStd file path. This goes well beyond the bare schema titles.

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, 'Save the active document to the given .FCStd path,' names a specific verb and resource with the exact file format. This clearly distinguishes save_document from siblings such as open_document, close_document, and transaction_commit.

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 description provides clear context: call this to persist the active document to a .FCStd file path. It does not explicitly name alternatives or exclusion conditions, but the action is sufficiently distinct among the sibling tools that an agent can infer when it is appropriate.

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

scaffold_projectScaffold ProjectA
Destructive

Lay out a well-formed project in one call (issue #143 / D1) — promote the MULTI_AGENT.md §3/§7 directory convention to a primitive. Creates the convention directories (components/, .dp_lib/), an item registry (items.json, #140), a seed assembly manifest from the supplied components/instances, and the project.json container that ties them together. The result loads clean and merge_assembly consumes it unchanged once its components resolve.

base_dir: the project root directory (created if absent). name: the project id (naming-convention checked). components/instances/shared_parameters: the assembly manifest content. master: optional component id to record as the master/skeleton single-source-of- truth slot (the lean interface-geometry skeleton children mate against). items: optional {item_id: {files?, metadata?}} to seed the item registry with.

Returns the layout {project_file, manifest, registry, components_dir, lib_dir, lockfile, master, dirs}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
itemsNo
masterNo
base_dirYes
instancesNo
componentsNo
shared_parametersNo

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already carry destructiveHint: true; the description adds useful traits such as 'created if absent' for base_dir and the guarantee that merge_assembly consumes the output unchanged. It stops short of saying what happens to existing files if scaffold_project is run over an existing project, which is the main missing destructive detail.

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 main action, then parameter semantics, then the return layout, so the structure is easy to scan. It contains some internal references (issue numbers, MULTI_AGENT.md sections) that add specificity but also noise; still, every section earns its place.

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 7-parameter tool with no output schema, the description covers all params and explicitly lists the returned layout keys. It omits edge-case behavior such as overwrite or error handling, but an agent has enough context to call the tool correctly and understand the result.

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?

With 0% schema description coverage, the description carries all parameter meaning and largely succeeds: base_dir, name, master, and items each get a purpose, and components/instances/shared_parameters are identified as 'assembly manifest content.' It groups the manifest payload somewhat loosely and does not specify the exact shapes inside components/instances, but it gives the agent enough to construct a valid call.

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 opens with a concrete verb and resource ('Lay out a well-formed project in one call') and enumerates the artifacts created: convention directories, items.json registry, assembly manifest, and project.json. It also positions the tool relative to merge_assembly, which consumes the output unchanged, so an agent can distinguish this from project_validate/resolve_manifest 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?

The description clearly frames the tool as the one-call primitive for initial project layout and states the resulting project loads clean and is directly consumable by merge_assembly. It does not explicitly list when not to use it or name alternatives, but the context is strong enough to route an agent.

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

scale_shapeScale ShapeA

Scale a shape uniformly or per-axis, baking a fresh static solid.

Scaling breaks parametric history, so this produces a standalone Part::Feature (not a linked/parametric feature); the source object is hidden since its geometry is consumed into the scaled copy.

handle: source shape handle. factor: scalar for uniform scale, or [sx, sy, sz] for per-axis scale. All factors must be > 0. center: optional [x, y, z] mm pivot to scale about; when omitted the scale is about the world origin (so the shape also moves away from/toward origin). name: object label (default 'Scaled').

Lengths in mm. Returns {handle, name, volume, factor} where factor is the normalized [sx, sy, sz] applied and volume (mm^3) equals the source volume times sxsysz.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoScaled
centerNo
factorYes
handleYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the sparse annotations, the description discloses important behavior: it produces a standalone Part::Feature, breaks parametric history, hides the source object because its geometry is consumed, and scales about the origin when center is omitted. This gives an agent a strong model of side effects and semantics beyond the annotations.

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 the core action, then covers side effects, parameters, and return contract in a compact structured form. Every sentence adds necessary information: units, defaults, pivot behavior, and volume calculation. It is detailed without being redundant.

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?

The tool has no output schema and sparse annotations, so the description carries full weight. It explains inputs, defaults, side effects, output fields, units, and how the returned factor and volume relate to the source shape. Nothing needed to invoke it correctly 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?

With schema description coverage at 0%, the description fully compensates by explaining every parameter: handle, factor as scalar or per-axis array with positivity constraint, optional center pivot with origin behavior, and name default. It also clarifies units and return values, so an agent can construct valid calls without schema help.

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 verb and resource: 'Scale a shape uniformly or per-axis, baking a fresh static solid.' It also distinguishes itself from parametric or linked features by explaining it produces a standalone Part::Feature and hides the source object, making its role clear relative to sibling shape tools.

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 description gives clear behavioral context: scaling breaks parametric history and consumes the source geometry into the scaled copy. It does not explicitly name an alternative tool or say 'use this instead of X,' but the side-effect warning effectively tells an agent when this tool is appropriate versus a parametric/transform approach.

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

seal_checkSeal CheckA
Read-only

Rate an O-ring gland (pairs with oring_groove): squeeze=W-depth, fill= (pi/4 W^2)/(width*depth). Squeeze must sit in the application band (static 15-30%, dynamic 10-20%), fill below max_gland_fill_pct. Returns {squeeze_mm, squeeze_pct, gland_fill_pct, squeeze_range_pct, within_squeeze, within_fill, pass}.

ParametersJSON Schema
NameRequiredDescriptionDefault
applicationNostatic_radial
groove_depth_mmYes
groove_width_mmYes
max_gland_fill_pctNo
cross_section_dia_mmYes

TDQS

A3.9/5.0
Behavior4/5

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

The description goes well beyond the readOnlyHint annotation by disclosing exact formulas for squeeze and fill, the acceptance bands, and the full return object. This makes the calculation behavior transparent and predictable.

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 compact and front-loaded with purpose, then gives formulas, acceptance criteria, and return fields in three dense sentences. Every sentence adds meaningful information without redundancy.

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?

It provides the return fields and calculation logic, which is vital because there is no output schema. It is incomplete on parameter semantics, particularly the W-to-cross-section mapping and the allowed application values, so an agent might struggle to invoke it correctly in less obvious 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?

With 0% schema description coverage, the description must compensate, and it partially does by defining squeeze and fill formulas and referencing depth, width, and max_gland_fill_pct. However, 'W' is not explicitly mapped to cross_section_dia_mm, and the 'application' parameter's accepted values beyond static/dynamic are not explained.

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 clearly states the tool's purpose with a specific verb ('Rate') and resource ('O-ring gland'), and explicitly names its paired sibling (oring_groove). This distinguishes it from the many nearby design and analysis tools.

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 phrase 'pairs with oring_groove' implies when this should be used—after defining a groove—and the static/dynamic bands give context for application types. However, it does not explicitly state when not to use it or compare it to alternative sizing/validation tools.

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

section_viewSection ViewA

Cut a solid with a plane and return the cross-section it exposes. This is the best way to "see inside" a part blind: it measures the cut area and its extent, and can optionally emit the section outline as a new object for rendering/export. Units: mm (lengths), mm^2 (areas).

handle: the solid to slice (a AnkusDrive handle). plane: "XY", "XZ", or "YZ" (world datum planes) OR a datum-plane handle. World normals follow FreeCAD: XY -> +Z, XZ -> -Y, YZ -> +X. A datum handle uses its local +Z as the cutting normal. offset: shift of the cutting plane along its normal, in mm (default 0 = the plane through the world origin / datum origin). E.g. plane="XY", offset=10 cuts at z=10. emit_profile: when True, add a Part::Feature holding the section wires to the document, register it, and return its handle (raises if the plane misses the shape). Default False = measure only, no new geometry. name: object name for the emitted profile (only used when emit_profile=True).

Does not modify the input geometry. Returns a dict: plane: str (echoed), offset_mm: float (echoed), normal: [x, y, z] unit cutting-plane normal, section_area_mm2: float — total area of the closed cross-section wires, wire_count: int — number of section wires found (0 means the plane misses the shape), closed_wire_count: int — how many of those wires are closed, bbox: {min:[x,y,z], max:[x,y,z], size:[dx,dy,dz]} of the section, or None when the plane misses the shape, handle: str — handle of the emitted profile (ONLY when emit_profile=True), name: str — its FreeCAD object name (ONLY when emit_profile=True).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoSection
planeNoXY
handleYes
offsetNo
emit_profileNo

TDQS

A4.8/5.0
Behavior5/5

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

The description goes well beyond the annotations by stating 'Does not modify the input geometry,' describing side effects when emit_profile is True, warning that it raises if the plane misses the shape, and documenting edge-case return values such as wire_count=0 and bbox=None. This is substantial behavioral detail not present in the annotations or schema.

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?

Although long, the description is tightly structured: purpose first, then units, then detailed parameter semantics, then non-destructive behavior and a complete return dict. Every sentence adds operational value, and the parameter ordering mirrors the schema.

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 no output schema, the description fully documents the return structure, including conditional fields, units, and the miss case. It also covers parameter interactions, failure behavior, and document side effects, making the tool safe and callable without external documentation.

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%, so the description carries the full burden, and it delivers: every parameter is explained with units, defaults, valid values, and behavioral meaning. Offset includes a concrete example, plane explains FreeCAD normals, and emit_profile/name detail exactly when and how they take effect.

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 verb (cut), a resource (a solid), and the output (cross-section), then clarifies it measures the cut area/extent and can optionally emit the section outline. This clearly distinguishes section_view from drawing-oriented siblings like add_section_view by framing it as the way to 'see inside' a part and get measurable section data.

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 description explicitly positions this tool as 'the best way to see inside a part blind' and explains when emit_profile is useful for rendering/export. It provides clear context for choosing the tool, though it does not name alternative tools or state explicit when-not-to-use conditions.

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

session_transcriptSession TranscriptA
Read-only

Export this session as a Python script that regenerates it (model, drawings, simulations) by calling these same tools in a fresh worker — and, with it, the record of what computed each number. Read-only: returns the script as text and writes nothing.

Covers one workspace (default: the current one). In the script, handles are variables, job polls are one s.wait(job), and inspection calls are dropped unless a later call used their result. Absolute paths become WORKDIR-relative. The header lists failed calls, run_script use and input files.

THE AUDIT SURFACE. Analysis calls are never dropped — every hand-calc, FEM read and *_submit is in the script, because they are the derivation, not inspection. Each analysis and solve result is checked whole: every number it reported becomes an s.check() and its verdict fields (fidelity, correlation, solver, gate pass) become s.expect(), so a replay that reached a different solver or fell back to a different correlation stops there instead of returning a plausible number. run_script code is carried verbatim with its SHA-256. With provenance (default), the script opens with a PROVENANCE record — AnkusDrive/FreeCAD/platform/substrate plus every solver the session reached, with its resolved path, substrate and probed version — and calls s.provenance(), which re-resolves that on the replaying machine and prints every difference. Hand this to anyone who has to answer "what exactly produced this figure?".

include_read_only: keep every inspection call. checkpoints: emit s.check()/s.expect(). prune_aborted: drop calls a transaction_abort undid. provenance=False skips the environment record (and the solver version probes it runs, ~0.1-3 s per solver).

Returns {workspace, script, calls, exported, skipped: {reason: count}, warnings, prerequisites, truncated, provenance}. Run it as python transcript.py [WORKDIR].

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceNo
provenanceNo
checkpointsNo
prune_abortedNo
include_read_onlyNo

TDQS

A4.7/5.0
Behavior5/5

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

The description goes far beyond the annotations (readOnlyHint=true, openWorldHint=false) by detailing the exact behavior: read-only nature, workspace scope, conversion of handles to variables, job polls to s.wait(job), dropping of unused inspection calls, handling of absolute paths, and the inclusion of analysis calls with s.check() and s.expect() checks. It also mentions the performance cost of provenance probes. This is extensive and adds significant value beyond the annotations.

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 long but well-structured, with a clear opening sentence stating the purpose, followed by a detailed breakdown of the script's behavior, the audit surface, and parameter options. It is front-loaded with the core action and then provides necessary details without redundancy. Every section earns its place, and the structure aids comprehension for a complex tool.

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?

The description is exceptionally complete for a tool with five parameters and no output schema. It details what the script does, how to run it ('python transcript.py [WORKDIR]'), what the return object contains (workspace, script, calls, exported, skipped, warnings, prerequisites, truncated, provenance), and the audit surface. Nothing an agent needs to call it correctly or interpret results 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?

Although schema description coverage is 0%, the description explains all five parameters in detail: workspace (default current one), provenance, checkpoints, prune_aborted, and include_read_only, including their effects. For instance, it states 'provenance=False skips the environment record (and the solver version probes it runs, ~0.1-3 s per solver).' This adds meaning beyond the bare schema types and defaults.

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 clearly states the tool's function: exporting the session as a Python script that regenerates it, including model, drawings, and simulations, plus the record of computations. It also distinguishes itself from potential siblings like journal_export by emphasizing the script's ability to regenerate the session and the audit surface. This is a specific verb-resource pairing, not a tautology.

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 description gives clear context on when to use the tool: for answering 'what exactly produced this figure?' and providing a reproducible script. It explains what the script includes and excludes, and describes options like include_read_only and provenance. While it doesn't explicitly name alternative tools, the usage context is unambiguous and practical.

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

set_active_documentSet Active DocumentA

Switch the active document by name (the value returned from new_document/open_document).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

TDQS

A4/5.0
Behavior3/5

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

The description conveys a state-changing behavior ('Switch') and adds that the name must be a previously returned value, which prevents agents from trying arbitrary file paths. It does not, however, explain what 'active' means for subsequent operations or what happens if the given name is not valid. The annotations do not contradict this; they simply provide no additional behavioral detail.

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 a single focused sentence with no filler. The key action and the critical parameter provenance are both front-loaded and immediately usable.

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?

This is a simple, one-parameter tool with no output schema and sparse annotations, so the description carries the responsibility for usage context. It covers the action and the source of the valid input value, though it could mention the prerequisite that the document must already be open and that this affects subsequent operations.

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?

The input schema provides only a type and title for the single parameter with no description, so the description must compensate. It does so by specifying that 'name' is the value returned from new_document/open_document, giving the agent actionable provenance for the parameter beyond the bare schema.

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 verb and resource: 'Switch the active document by name.' It also references the expected input source—'the value returned from new_document/open_document'—which helps distinguish this tool from related sibling tools like open_document or use_workspace.

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 description gives clear context: the tool selects an already-known document by name and that name comes from new_document/open_document. However, it does not explicitly state when to prefer this over alternatives such as open_document or use_workspace, nor does it mention any exclusions or prerequisites like the document already being open.

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

set_propertySet PropertyB
Destructive

Set a single property by name on an object. Coerces lists → Vector for Vector properties; other values pass through.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
valueYes
handleYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, indicating a mutation operation. The description adds the coercion behavior ('Coerces lists → Vector for Vector properties; other values pass through'), which is useful. However, it doesn't disclose potential side effects (e.g., whether property changes persist immediately, or if there are any restrictions on property types). The description adds some value beyond annotations but could be richer.

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 succinct and front-loaded, with two sentences: the first clearly states the action, and the second adds a behavioral detail. No wasted words; it's efficient and to the point.

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

Completeness2/5

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

For a mutation tool with no output schema and 3 undocumented required parameters, the description is under-specified. It doesn't explain the 'handle' parameter meaning or format, potential error conditions, or the result of the operation. The coercion note is helpful, but overall, an agent may not be able to call this correctly without additional context.

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 schema provides no descriptions for the parameters. The description explains the 'value' parameter's coercion behavior, but does not explain 'handle' or 'name' semantics. Given that there are 3 required parameters with zero schema coverage, the description partially compensates but leaves significant ambiguity, especially for 'handle' which likely references an object in the system.

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 action ('Set a single property by name on an object') with a clear verb and resource. It distinguishes from siblings by focusing on 'single property' and 'by name', which is consistent with the tool name. However, it doesn't explicitly differentiate from other property-related tools like set_visibility, but the description is clear enough for basic identification.

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?

The description does not provide any guidance on when to use this tool versus alternatives. There is no mention of prerequisites (e.g., object must be selected, handle must be valid), no exclusions, and no comparison to sibling tools. The agent is left to infer usage from the name and schema, which is inadequate for a tool with a handle parameter that likely requires specific context.

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

set_title_blockSet Title BlockA
Destructive

Populate the drawing's title block. FreeCAD's default template is a bare sheet, so AnkusDrive composes its own block in the bottom-right corner on SVG/PDF export. Scale, sheet size, units, and part name are auto-derived from the page; the fields here override or add to them (a machinist needs material + scale + units to cut from the sheet). Calling this opts the page into rendering the block. Returns {handle, name, fields}.

ParametersJSON Schema
NameRequiredDescriptionDefault
revNo
dateNo
pageYes
partNo
unitsNo
projectNo
drawn_byNo
materialNo

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already mark this as destructive (destructiveHint=true). The description adds that calling it 'overrides or adds' fields and 'opts the page into rendering the block,' which are useful side effects. However, it doesn't explicitly say what is overwritten or whether the action is reversible, so it only partially supplements the annotation.

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?

Four sentences, each earning its place: purpose, context, use-case rationale, and return type. No filler or repetition. Slightly longer than the ideal, but still compact and well-structured.

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?

Covers purpose, behavior, and return shape, which is helpful given no output schema. However, parameter semantics are not fully explained, no prerequisites are mentioned, and the description doesn't say what happens if called multiple times. There are clear gaps an agent would need to infer.

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%, so the description must compensate. It mentions material, scale, units, and part name as fields that override auto-derived values, but it does not explain the page parameter or the semantics of rev, date, project, and drawn_by. For an 8-parameter tool with no schema descriptions, this is insufficient.

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 opens with a clear verb and resource: 'Populate the drawing's title block.' It then explains that the tool composes a custom block on SVG/PDF export, distinguishing it from generic annotation or dimension tools. The purpose is unambiguous and resource-specific.

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 description provides context on when to use it: FreeCAD's default template is bare, so this tool overrides or adds fields that are auto-derived. It even gives a concrete use case ('a machinist needs material + scale + units'). It doesn't explicitly name alternatives or state when not to use it, but the context strongly implies its dedicated role.

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

setup_statusSetup StatusA
Read-only

The machine-readable form of ankusdrive doctor — resolve FreeCAD and every solver family and report, per item, found/missing with the exact fix. Call this when the user asks to set up, diagnose, or finish installing AnkusDrive, then walk them through the per-item fix/install_hint commands for their platform.

Read-only and side-effect-free: nothing is executed or installed and no environment is mutated (verify_freecad_boot=True additionally boots FreeCAD once, time-boxed, purely to read back its version — leave it False unless the user doubts the install actually runs).

verify_image=True additionally checks, OVER THE NETWORK, that the solver container's image was signed by this repository — use it when the user asks whether the solvers they are running are authentic. It adds container_image.verification = {status, reason, repo, workflow, allowed_by_config, self_declared}, where status is: • verified — provenance names this repository's image workflow; • unsigned — no attestation: an image the user built themselves (common and legitimate), one published before signing existed, or no network/gh. Relay it as expected-for-a-custom-image, and mention ANKUSDRIVE_ALLOW_UNVERIFIED_IMAGE=1 silences it; • mismatch — an attestation exists but names a DIFFERENT repository. Say so plainly: that is an image claiming to be ours. No setting silences it; • unavailable — the check could not run (reason says why). Never report this as authentic. self_declared is what the image says about itself and is never evidence — only the signature is.

Returns {platform: {system, machine}, freecad: {available, path, source, version?, fix?}, install: {kind, source} (venv | pipx | uv_tool | uvx | mcpb — the install every fix string is written for), toolsets: {enabled, disabled: {family: {label, tools, enable}}} (tool families switched off in this install and exactly how to switch each on), run_script: {allowed, enable?} (whether the run_script tool may execute agent-written code here), solvers: {available, unwired, prepared_case_only, solvers: {name: {..., install_hint | wire_hint}}, families: {family: {solvers, available, unwired, prepared_case_only, any_available}}, extras}} — families[*].any_available is what gates each *_submit family, and every unavailable item carries its own fix string. A solver under prepared_case_only resolves but no AnkusDrive tool can build it a case, so it does not make its family available (SU2/cfd — issue #237).

ParametersJSON Schema
NameRequiredDescriptionDefault
verify_imageNo
verify_freecad_bootNo

TDQS

A5/5.0
Behavior5/5

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

The description explicitly states 'Read-only and side-effect-free: nothing is executed or installed and no environment is mutated,' which aligns with the readOnlyHint annotation. It goes beyond annotations by detailing the side effects of optional flags (verify_freecad_boot boots FreeCAD once time-boxed; verify_image performs a network check and adds a field). It also discloses the exact structure and semantics of the return object, including edge cases like 'prepared_case_only' and the meaning of verification statuses. No contradiction with annotations.

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?

Although the description is long and detailed, every sentence serves a necessary function given the tool's complexity. It opens with the core purpose, then explains optional flags and their behavioral implications, and finally delineates the return structure with clarifications. The content is front-loaded with the most critical information (purpose and when to use), and the structure is logical (flags explained before return values). No fluff or repetition.

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?

Given the tool's complexity (a diagnostic that returns a detailed nested object) and the absence of an output schema, the description is exceptionally complete. It documents every major part of the return value—platform, freecad, install, toolsets, run_script, solvers, families, extras—and clarifies nuanced behaviors like 'prepared_case_only' and the different verification statuses. The agent has all needed information to call the tool correctly and interpret results.

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?

The input schema only provides types and defaults for the two boolean parameters, with 0% description coverage. The tool description fully compensates by explaining the purpose, effect, and appropriate usage of each parameter: verify_freecad_boot is described as optionally booting FreeCAD to read its version, and verify_image is detailed with its network check and the meaning of each resulting status (verified, unsigned, mismatch, unavailable). This adds significant semantic value beyond the bare schema.

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 precise purpose: 'The machine-readable form of `ankusdrive doctor` — resolve FreeCAD and every solver family and report, per item, found/missing with the exact fix.' It clearly identifies the resource (setup status) and the action (resolve and report), and distinguishes itself from siblings by being a read-only diagnostic tool. It also provides a usage trigger ('Call this when the user asks to set up, diagnose, or finish installing AnkusDrive'), making it unmistakable among the many sibling tools.

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 when-to-use guidance: 'Call this when the user asks to set up, diagnose, or finish installing AnkusDrive' and even instructs follow-up behavior (walk them through fixes). It additionally explains when to set optional flags (e.g., 'leave it False unless the user doubts the install actually runs' for verify_freecad_boot, and use verify_image when checking authenticity). This level of context leaves no ambiguity about when to invoke this tool versus alternatives.

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

set_visibilitySet VisibilityA
Destructive

Override an object's persistent Visibility flag. By default save_document auto-hides producer-inputs (the Base/Tool of a Cut, features inside a Body) so the re-opened doc shows just the final composition. Use this to override — e.g. to keep a reference primitive visible next to a derived part. Note that the next save_document with visibility_hygiene=True (the default) may re-hide it; pass visibility_hygiene=False to save_document to lock the override in.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes
visibleYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, the description discloses important behavioral details: the override is persistent but may be re-hidden by the next save_document, and users must pass visibility_hygiene=False to lock it in. This goes well beyond what readOnlyHint/destructiveHint already communicate.

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 compact, front-loaded with the core purpose, and each sentence adds necessary context: default behavior, when to override, and the important save_document caveat. No wasted words.

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 simple two-parameter tool with no output schema, the description covers purpose, usage context, side effects, and follow-up actions. Nothing essential is missing for an agent to select and invoke the tool correctly.

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 carries the burden, and it mostly does. It makes clear that the tool sets a visibility flag, and the example implies visible=true keeps a primitive visible. However, 'handle' is not explicitly defined as an object handle or linked to how it is obtained, which is 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?

The description clearly states the action ('Override an object's persistent Visibility flag') and differentiates it from the default save_document behavior that auto-hides producer-inputs. It is specific about the resource and the effect, and the example usage makes the 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 Guidelines5/5

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

The description explicitly explains when to use this tool, gives a concrete example (keeping a reference primitive visible next to a derived part), and warns about the interaction with save_document, including how to preserve the override with visibility_hygiene=False. This is strong usage guidance with no ambiguity.

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

sheet_baseSheet BaseA

Start a sheet-metal part: the base flange, a closed straight-sided profile extruded to thickness_mm. Everything else (flanges, tabs, hems, the flat pattern, the DXF) hangs off the handle this returns.

profile: [[x, y], ...] in the XY plane, implicitly closed. sketch: alternatively a handle to a closed, planar, straight-sided sketch — on any plane. Arcs are REJECTED rather than silently faceted, because a faceted flat pattern is a wrong flat pattern. material: any Materials-DB name (e.g. "Steel-A36", "AL6061-T6", "SS304"); it selects the K-factor and minimum-bend-radius corpus rows.

IMPORTANT — the profile is the flat face TANGENT TO TANGENT, not the outside dimension. Bends grow OUTWARD from the profile boundary, exactly as a base flange behaves in any sheet-metal CAD, so a U-channel of 100 mm outside width with R = t = 2 starts from a 92 mm profile.

The bend model lives alongside the handle for the life of the worker session, like every other handle: unfolding is a property of the FEATURE TREE, not of the fused solid, so a part reopened from disk in a new session is a solid rather than a sheet part. Cutting one (boolean_op cut, e.g. to drill it) keeps it a sheet part; fusing arbitrary material onto it does not.

Returns {handle, name, volume, thickness_mm, material, profile, area_mm2}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoSheetBase
sketchNo
profileNo
materialNo
thickness_mmYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations are minimal (readOnlyHint=false, destructiveHint=false), so the description carries the full burden — and it delivers rich behavioral disclosure: arcs are rejected rather than silently faceted, bends grow OUTWARD from the profile boundary, unfolding is a property of the feature tree rather than the fused solid, a part reopened from disk becomes a solid, and boolean_op cut keeps it a sheet part while fusing arbitrary material does not. These are substantial behaviors far beyond what annotations convey.

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 long but every section earns its place — parameter semantics, the critical tangent-to-tangent caveat with a concrete worked example (U-channel 100 mm/92 mm), and the feature-tree persistence caveat. It is front-loaded with the core purpose before diving into details. Slightly verbose in places, but the length is justified by the conceptual complexity of sheet-metal semantics.

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?

Given 0% schema coverage and no output schema, the description fully carries the burden and covers everything an agent needs: distinct profile vs sketch input modes, material corpus behavior, the tangent-to-tangent dimensiongotcha, the persistence/identity caveat, and the exact return object {handle, name, volume, thickness_mm, material, profile, area_mm2}. Nothing required for 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?

With schema description coverage at 0%, the description must compensate, and it does so for the meaningful parameters: profile is defined as '[[x, y], ...] in the XY plane, implicitly closed'; sketch as an alternative 'closed, planar, straight-sided sketch on any plane'; material as any Materials-DB name that 'selects the K-factor and minimum-bend-radius'; and thickness_mm is tied to the extrusion. Only the trivial `name` parameter (default 'SheetBase') is left undocumented, which is minor.

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 opening sentence states the specific verb and resource ('Start a sheet-metal part: the base flange...extruded to thickness_mm') and explicitly distinguishes this foundational operation from the rest of the family by stating 'Everything else (flanges, tabs, hems, the flat pattern, the DXF) hangs off the handle this returns.' This tells an agent exactly what the tool is for and how it differs from siblings like sheet_flange, sheet_tab, and sheet_hem.

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 description establishes clear context that this is the entry-point/starting operation ('everything else hangs off the handle this returns') and gives important selection constraints — that arcs are rejected rather than faceted, and that the profile is tangent-to-tangent, not the outside dimension. It lacks an explicit 'use X instead of this when Y' exclusion statement, but the positioning as the first sheet-metal operation is unambiguous given the sibling set.

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

sheet_checkSheet CheckA
Read-only

Press-brake manufacturability screen for a sheet part — four rules, each with the number it came from:

min_bend_radius — an inside radius below the material's minimum (a corpus value per material: 3t for 6061-T6, 1t for A36, 0.5t for annealed 1100) cracks the outer fibre. min_flange_length — an outer leg under 4t + R has no die shoulder to sit on and dives into the vee. hole_to_bend — a hole whose EDGE is nearer the bend tangent than 2t + R draws into an oval. Holes are read off the real solid, not declared. refold_collision — two features that occupy the same space once folded, found by actually intersecting them rather than by a rule.

A hem is screened as a two-hit hem (bend, then flatten) and exempted from the air-bend radius and flange rules, which would otherwise fail every hem ever drawn. A flat pattern whose feature footprints overlap is a finding too, not a warning dropped on the floor. An unrecognised material degrades to a bend-class fallback WITH an info finding saying so, rather than skipping the rule silently.

min_flange_t / hole_to_bend_t: override the thresholds (multiples of thickness).

fidelity='correlation' with band_pct=None — these are press-brake rules of thumb, thresholds for ranking and gating rather than measured predictions.

Returns {ok, findings, fail_count, rules, min_bend_radius_mm, min_bend_radius_source, flat_size, blank_area_mm2, k_factors, thickness_mm, material, fidelity, band_pct}. Each finding carries {code, severity, message} plus the measured value and the limit it missed.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes
k_factorNo
bend_tableNo
min_flange_tNo
hole_to_bend_tNo

TDQS

A4.4/5.0
Behavior5/5

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

The description goes far beyond the readOnlyHint and openWorldHint annotations by detailing each rule, hem handling, overlap findings, the unrecognized-material fallback with an info finding, and the fidelity='correlation' approximation. No statement contradicts the annotations.

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 long but tightly structured: purpose statement, bulleted rules, exception/fallback behavior, parameter overrides, fidelity note, and return contract. It front-loads the core purpose and every sentence carries substantive information without 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 analysis tool with no output schema, the description is highly complete: it lists return fields, finding structure, all four rules, exceptions, and fallback behavior. The main omission is fuller semantics for handle, k_factor, and bend_table, but core invocation and interpretation are well covered.

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?

With 0% schema description coverage, the description explicitly explains min_flange_t and hole_to_bend_t as threshold overrides in multiples of thickness. However, it leaves handle, k_factor, and bend_table semantically undocumented, which is a meaningful gap given the schema provides only titles.

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 opens with 'Press-brake manufacturability screen for a sheet part' and names four concrete rules, giving a specific verb, resource, and scope. This clearly separates it from sheet modeling operations and generic screens in the sibling 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?

The description clearly frames when to use this tool: for press-brake manufacturability screening and gating of a sheet part. It does not explicitly name alternative tools or provide when-not-to-use conditions, but the context is clear enough to guide selection.

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

sheet_flangeSheet FlangeA

Bend a flange off a free edge of a sheet part.

edge: a stable e_* tag from list_edges (or 'EdgeN'/int) on a STRAIGHT free edge of a flat region — a bend line is the intersection of two planes, so an arc cannot carry one and is rejected. angle_deg: the bend angle, i.e. the deviation from flat, so 90 is a right-angle flange. Must be in (0, 180]. inner_radius_mm: inside bend radius; defaults to the material thickness. direction: 'up' (toward the region's outward normal) or 'down'. length_from: what length_mm measures — the number most often misread on a sheet drawing. 'outer' (default) to the outside virtual apex, which is what a drawing dimension normally means; 'inner' to the inside apex; 'tangent' for the straight leg past the end of the bend. width_mm / offset_mm: narrow the flange to part of the picked edge. k_factor: pins K for THIS bend only. Leave it unset and the choice defers to sheet_unfold — the folded solid does not depend on K at all, only the flat pattern does.

Consumes the input handle (it is hidden, having become part of the result).

Returns {handle, name, feature, kind, volume, angle_deg, inner_radius_mm, leg_tangent_mm, length_from, direction, span_mm, thickness_mm}.

ParametersJSON Schema
NameRequiredDescriptionDefault
edgeYes
nameNoSheetFlange
handleYes
k_factorNo
width_mmNo
angle_degNo
directionNoup
length_mmYes
offset_mmNo
length_fromNoouter
feature_nameNo
inner_radius_mmNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations indicate the tool is not read-only (readOnlyHint: false), which is consistent with bending. The description adds valuable behavioral detail: that the input handle is consumed (it becomes part of the result), and that k_factor affects only the flat pattern, not the folded solid. It also discloses the return payload. This goes beyond the annotation flags and gives the agent a concrete understanding of side effects.

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 extensive but well-structured, leading with the purpose and then systematically covering each parameter. While it is not terse, every sentence earns its place given the 12-parameter complexity. It is front-loaded with the core operation and progressively details nuances, making it reasonably concise for the information conveyed.

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?

Given the high parameter count and absence of an output schema, the description explains the return object completely. It also covers edge prerequisites, angle constraints, and the material-thickness default. It omits error scenarios or edge-case warnings beyond arc rejection, but the information is sufficient for an agent to call the tool correctly. A perfect score would require explicit error handling or preconditions, but this is well above the minimum viable.

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?

The schema has 0% description coverage across 12 parameters, so the burden falls entirely on the tool description. The description explains every parameter with concrete semantics: edge (straight free edge, rejected arcs), angle_deg (deviation from flat), inner_radius_mm (defaults to material thickness), direction (up/down), length_from ('outer' vs 'inner' vs 'tangent' with drawing interpretation), width/offset (edge restriction), and k_factor (only affects flat pattern). This fully compensates for the schema's lack of 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?

The description opens with 'Bend a flange off a free edge of a sheet part,' which clearly states the operation, resource, and scope. It explicitly mentions the requirement for a straight free edge and rejects arcs, distinguishing it from related operations like sheet_tab or sheet_hem without needing to name them.

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 description provides clear context for when to use this tool: on straight free edges of flat regions, and explicitly notes that arcs cannot carry a bend line. It also mentions that k_factor defers to sheet_unfold, implying a separation of concerns. However, it does not explicitly name alternative tools or state 'use this instead of X,' so it falls short of an explicit exclusion.

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

sheet_flat_exportSheet Flat ExportA
Destructive

Write the flat pattern as a LAYERED DXF — the file a laser, punch or press-brake shop actually quotes and cuts from. This is the deliverable the whole sheet-metal family exists to produce.

Three layers, because a flat pattern without them is not a shop deliverable: CUT carries the closed outer profile and every hole; BEND_UP and BEND_DOWN carry one centreline per bend, so the operator reads the fold direction off the print rather than inferring it. DXF R12 ASCII in millimetres, written directly rather than through TechDraw — a flat pattern is not a drawing view and does not want a sheet frame, a scale or a title block around it. path must end in .dxf.

Takes the same k_factor / bend_table arguments as sheet_unfold, since the outline it writes IS the development.

Returns {ok, path, size, layers, entities, flat_size, blank_area_mm2, bends (with bend_allowance_mm, bend_deduction_mm, k_factor and k_source per bend), fidelity, band_pct, warnings}.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
handleYes
k_factorNo
bend_tableNo

TDQS

A4.1/5.0
Behavior4/5

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

The annotation already marks this as destructive, and the description adds valuable behavioral detail: it writes a DXF R12 ASCII file directly, uses millimeters, requires the path to end in .dxf, and emits three named layers with specific content. It also lists the full return payload, including per-bend data and warnings, which goes well beyond the annotation surface.

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 long but structured with clear paragraphs: purpose, layer format, technical choices, parameters, and return value. Most sentences earn their place, and the most important information is front-loaded. The motivational sentence about the sheet-metal family is slightly extra but reinforces purpose rather than distracting.

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 file-writing tool with no output schema, the description is unusually complete: it specifies format, units, layers, output payload, and key constraints. The main gap is the missing semantics of the required 'handle' parameter, and error/overwrite behavior is left mostly to the destructiveHint annotation. Overall, the description is strong and actionable.

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 carries the burden of explaining parameters. It explains path must end in .dxf and points to sheet_unfold for k_factor/bend_table semantics, but it never describes the required 'handle' parameter at all. This partial compensation is useful but incomplete for a four-parameter tool.

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 opens with a specific verb and resource: 'Write the flat pattern as a LAYERED DXF,' and immediately states it is the shop deliverable for laser, punch, or press-brake work. It clearly differentiates the tool from drawing-oriented and unfold-related siblings by describing its exact output format and 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?

The description explains when this tool matters: it produces the deliverable shops quote and cut from, not a drawing view. It contrasts with TechDraw-based drawing exports by saying the flat pattern should not have a sheet frame, scale, or title block, and it links parameter usage to sheet_unfold. It gives clear context but does not explicitly name alternative tools or state 'use this instead of X.'

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

sheet_hemSheet HemA

Fold a hem back on itself — the 180-degree return that stiffens a free edge and buries the sharp cut line so the part is safe to handle.

kind: 'closed' (inside radius t/2, gap t) or 'open' (radius t, gap 2t). radius_mm / gap_mm: override the style directly; the gap between the returned leg and the parent is exactly 2R, so gap wins as radius = gap/2.

length_mm is ALWAYS the return leg measured from the end of the bend: a 180-degree bend has no virtual apex to dimension to — the outside surfaces are parallel and never meet — so an 'outer' dimension would be infinite. For the same reason a hem reports a bend allowance but no bend deduction, and sheet_check screens it as a two-hit hem (bend, then flatten in a hemming die) exempt from the air-bend radius and flange rules. A teardrop hem wraps past 180 degrees and is out of scope.

Returns the same dict sheet_flange does, plus {hem_kind, gap_mm}.

ParametersJSON Schema
NameRequiredDescriptionDefault
edgeYes
kindNoclosed
nameNoSheetHem
gap_mmNo
handleYes
width_mmNo
directionNoup
length_mmYes
offset_mmNo
radius_mmNo
feature_nameNo

TDQS

A3.8/5.0
Behavior4/5

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

The description goes well beyond the minimal annotations by explaining non-obvious behavior: the gap/radius precedence, why length_mm is measured from the bend end, that the hem reports bend allowance but no bend deduction, and that sheet_check treats it as a two-hit hem exempt from air-bend rules. This provides substantial insight into the operation's geometry and validation behavior.

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 well-organized, front-loading the core purpose before explaining parameter semantics and return values. Every sentence contributes meaningful information about geometry, dimensioning, or validation. It is long, but the complexity of the hem operation and the number of non-obvious interactions justify the length.

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 description covers the most important conceptual and behavioral details and even names the return shape ('same dict sheet_flange does, plus {hem_kind, gap_mm}'). However, with 11 parameters, no output schema, and no parameter-level schema descriptions, the description still leaves required parameters like handle and edge unexplained and does not address parameter interactions such as direction, offset_mm, or width_mm.

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 does explain key parameters: kind (closed/open), radius_mm/gap_mm override behavior, and the special meaning of length_mm. However, it leaves several parameters—especially the required handle and edge, plus width_mm, direction, offset_mm, and feature_name—without any semantic explanation beyond their names.

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 opens with a specific verb and resource: 'Fold a hem back on itself — the 180-degree return that stiffens a free edge and buries the sharp cut line.' It clearly identifies the sheet-metal hem operation and its purpose, and it distinguishes itself from related sheet tools by defining closed/open kind variants and explicitly excluding teardrop hems.

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 description implies the use case: stiffening a free edge and making it safe to handle. It also mentions how sheet_check treats the hem and that a teardrop hem is out of scope, but it never explicitly says when to choose sheet_hem over siblings like sheet_flange or sheet_tab. The guidance is mostly implicit rather than a direct when-to-use/alternative statement.

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

sheet_refoldSheet RefoldA

Fold a flat pattern back up and check it reproduces the part — the other half of the unfold gate.

This does NOT replay the feature model. It reads the flat pattern back: each leg length is measured off the flat outline, walking outward from the bend's attachment past its reported bend allowance to the far edge of that region. So a wrong allowance, angle or bend direction lands the refolded solid somewhere the original is not, and this reports the disagreement instead of hiding it.

handle: a sheet part to unfold and then refold. flat: alternatively a sheet_unfold report, to refold a development produced elsewhere (or a deliberately corrupted one, to prove the check bites). compare: the handle to check against; defaults to handle, and is skipped when only flat is given. volume_tol_pct / bbox_tol_mm: agreement tolerances.

Note the round trip that is meaningful and the one that is not: refold-vs-folded must match, but flat-vs-folded VOLUME must not, and does not. Bending preserves neutral-fibre length, not material volume — a bend sector's true volume is angle·t·(R + t/2)·w while its flat footprint is angle·(R + K·t)·t·w, and those agree only at K = 0.5.

Returns {handle, name, volume_mm3, bbox, bends, compare?} where compare is {handle, matches, volume_mm3, volume_error_pct, bbox_max_error_mm, tolerance}.

ParametersJSON Schema
NameRequiredDescriptionDefault
flatNo
nameNoSheetRefold
handleNo
compareNo
k_factorNo
bend_tableNo
bbox_tol_mmNo
volume_tol_pctNo

TDQS

A4/5.0
Behavior4/5

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

Annotations do not promise read-only behavior, so the prose carries the burden of explaining what happens; it fills this gap with concrete mechanics: each leg length is measured off the flat outline, walking outward past the reported bend allowance, and disagreement is reported rather than hidden. It also discloses the important fact that the feature model is not replayed and explains why volume differences are expected.

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 front-loads a clear one-sentence purpose, then provides algorithmic detail and a cautionary note. The volume math is verbose but directly prevents a likely misinterpretation, so it earns its place. It is longer than minimal but well organized.

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 return shape is explicitly listed even though no output schema exists, and the meaningful versus non-meaningful round trips are covered. However, three parameters are undocumented in prose, and there is no guidance about error conditions or invalid inputs. For a complex sheet-metal verification tool, this is adequate but not complete.

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 handle, flat, compare, and the two tolerance parameters well. However, name, k_factor, and bend_table appear only in the schema with no prose explanation of their meaning or effect. This leaves a significant gap for a tool with eight optional parameters.

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 opening sentence states a specific verb/resource pair ('Fold a flat pattern back up and check it reproduces the part') and frames the tool as the counterpart to the unfold gate. The description also distinguishes it from feature-model replay by explicitly saying 'does NOT replay the feature model,' making its identity clear among sheet-metal 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?

The description explains when the check is meaningful ('refold-vs-folded must match') and explicitly warns that flat-vs-folded volume must not match, which prevents a common misuse. It also describes alternative valid inputs, such as passing a sheet_unfold report to test a corrupted development. It does not name sibling tools as alternatives, but the guidance is sufficient.

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

sheet_tabSheet TabA

Extend a sheet part with a coplanar tab — a flat ear off a free edge with no bend at all (a mounting lug, a weld tab, a snap-off).

Mechanically it is a zero-angle flange and shares that code path exactly: length_mm is how far the tab reaches past the edge, width_mm/offset_mm place it along the edge (default: the whole edge). It adds no bend to the bend report and no bend line to the DXF, but it does grow the flat pattern.

Returns the same dict sheet_flange does (angle_deg 0, inner_radius_mm 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
edgeYes
nameNoSheetTab
handleYes
width_mmNo
length_mmYes
offset_mmNo
feature_nameNo

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the annotations, it discloses that the tool mutates the flat pattern, adds no bend to the bend report, adds no bend line to the DXF, and returns a specific dict shape matching sheet_flange. This is useful behavioral context that the annotations do not provide.

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 compact and front-loaded: purpose first, then mechanical relation, then parameter semantics, then side effects and return value. Every sentence adds value and none are 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 sheet-metal tool with no output schema and no parameter descriptions, the description covers the essential purpose, geometry, behavior, and return shape. It could be more complete by explicitly defining how edge and handle are specified, but an agent can infer most invocation details from the schema names and sibling tool context.

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?

With 0% schema description coverage, the description must carry parameter meaning. It clearly explains length_mm, width_mm, offset_mm, and the whole-edge default, but it does not explain the required handle or edge parameters, nor the optional name/feature_name parameters. The coverage is helpful but incomplete.

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 names a specific verb and resource: extend a sheet part with a coplanar tab, described as a flat ear off a free edge. It also distinguishes this tool from bent sheet-metal features by explicitly saying there is no bend, no bend line, and no bend-report entry.

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 description gives clear contexts for use — mounting lugs, weld tabs, snap-offs — and frames the tool as a zero-angle flange sharing the sheet_flange code path. It does not explicitly say 'use sheet_flange when you need a bend,' but the contrast is strongly implied.

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

sheet_unfoldSheet UnfoldA

Develop a sheet part into its flat pattern — the blank the part is cut from — and report every bend.

The flat pattern is derived from the bend tree, not reverse-engineered out of the fused solid, so it is exact rather than fitted: each bend contributes its bend allowance BA = angle·(R + K·t), the arc length of the neutral fibre.

k_factor: pins K for every bend. bend_table: a shop's own measured rows [{thickness_mm, inner_radius_mm, angle_deg, allowance_mm | deduction_mm}] — a matching row OUTRANKS the chart, because the shop's press is the ground truth for the shop's press. Without either, K comes from a press-brake corpus keyed by material and r/t. WHICHEVER IT IS, IT IS ECHOED BACK per bend as k_factor + k_source: a flat length whose K you cannot see is a number you cannot check.

build: also create the flat blank as a real solid (holes included) at origin in the XY plane, so it can be measured, exported or nested.

Fidelity: 'exact' only when EVERY bend's K was supplied or table-derived — BA given K is pure arithmetic. One corpus-defaulted bend makes the development a 'correlation' with band_pct, and developed_band_mm gives the resulting millimetre spread of the blank across that K band.

Returns {ok, handle?, name?, volume?, outline, holes, bend_lines, bends, regions, flat_size, flat_bbox, flat_area_mm2, blank_area_mm2, blank_volume_mm3, thickness, material, fidelity, band_pct, developed_band_mm, warnings} — regions being each flat region's polygon, which is what lets the whole report be handed straight back to sheet_refold. Each bend row carries angle_deg, direction, inner_radius_mm, leg_tangent_mm, outer_length_mm, bend_allowance_mm, bend_deduction_mm, outside_setback_mm, k_factor, k_source, and the bend_line / tangent_start / tangent_end segments in flat coordinates. ok=False means the blank cannot be cut as drawn — two feature footprints overlap — with warnings naming which.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoSheetFlat
buildNo
handleYes
originNo
k_factorNo
bend_tableNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the sparse annotations, the description discloses that the flat pattern is derived from the bend tree rather than reverse-engineered, explains K-factor precedence, defines the fidelity distinction between 'exact' and 'correlation', and states failure conditions for overlapping footprints. This is rich behavioral context.

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 long, but it is densely packed and front-loaded with the core purpose. The extended return-field enumeration is justified because there is no output schema. The formatting is somewhat wall-of-text, costing a point against perfect conciseness.

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?

Given six parameters, no output schema, and a non-trivial operation, the description is exceptionally complete: it details the full return contract, K-source selection order, fidelity semantics, build behavior, and an error scenario. This is more than enough for an agent to invoke 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?

With 0% schema description coverage, the description carries the full burden and succeeds: it explains k_factor as pinning K, bend_table as shop-measured rows that outrank the chart, build as creating a solid blank at origin, and origin's XY-plane placement. Only self-evident parameters like handle and name are left to the schema titles.

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 opens with a specific verb-resource pair: 'Develop a sheet part into its flat pattern' and 'report every bend.' It clearly distinguishes the tool from nearby siblings like sheet_refold and sheet_flat_export by emphasizing the unfolded blank and bend reporting.

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 description gives strong contextual guidance: it explains that the result can be measured, exported, nested, or handed back to sheet_refold. It does not explicitly name alternatives or give when-not-to-use conditions, but the use case is unmistakable.

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

shell_solidShell SolidA

Hollow a raw Part solid into a thin-walled shell (the direct-shape counterpart to thickness, which only works on PartDesign bodies).

handle: handle of the solid to hollow (e.g. a box/cylinder from add_primitive, or any shaped Part::Feature). faces: NON-EMPTY list of the faces to REMOVE — these become the shell's openings. Each entry is a face tag (f_..., from list_faces/query_faces, preferred and edit-stable), a 'FaceN' string, or a 1-based integer index. thickness: wall thickness in mm, must be > 0. The wall is grown INWARD, so the part's outer dimensions are preserved.

The consumed input solid is hidden (its geometry now lives in the shell). Returns {handle (starts 'shell_'), name, volume (mm^3 of the resulting walls), wall_thickness (mm), removed_faces (list of 1-based face indices that were opened)}. Raises if faces is empty, thickness <= 0, an index is out of range, or the offset is too large to produce a valid shell.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoShell
facesYes
handleYes
thicknessYes

TDQS

A4.9/5.0
Behavior5/5

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

The description reveals key side effects beyond the annotations: 'The consumed input solid is hidden' and the wall 'is grown INWARD, so the part's outer dimensions are preserved.' It also lists error conditions and the return object's fields. This is thorough behavioral disclosure for a mutating tool.

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 well-organized: a one-sentence purpose, a structured parameter list, then side effects, return value, and error conditions. Every sentence adds actionable information, and the key distinction from `thickness` is front-loaded.

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?

Despite having no output schema, the description documents the return shape, includes failure modes, and explains how faces should be referenced. Combined with the sibling distinction and parameter details, the agent has everything needed to invoke shell_solid correctly.

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?

With 0% schema description coverage, the description carries the full burden for parameter semantics. It thoroughly explains `handle`, `faces` (including accepted tag formats and edit-stable preference), and `thickness` (units, sign, direction). The optional `name` parameter is not described, but it has a schema default and is self-explanatory, so this is a minor 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 description opens with a specific verb and resource: 'Hollow a raw Part solid into a thin-walled shell.' It also distinguishes itself from the sibling tool `thickness` by noting that thickness 'only works on PartDesign bodies,' so an agent can immediately tell when shell_solid is the intended choice.

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 explicitly names the alternative (`thickness`) and the condition that selects between them: shell_solid is the direct-shape counterpart while thickness only works on PartDesign bodies. This gives the agent concrete guidance on when to use this tool versus a closely related sibling.

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

slice_estimateSlice EstimateA
Read-only

First-order FDM slice estimate (analytic, NO slicer needed; see slice_gcode_submit for the real PrusaSlicer CLI). mass_g = volume·density (Materials DB); deposited = volume·(wall_fraction + infill·(1−wall_fraction)) so at 100% infill filament_g == mass_g; layer_count = ceil(bbox height/layer_height); print_time from nozzle volumetric flow.

material may be any Materials-DB card name (material_list / material_get), or anything at all if you supply density_g_cc yourself — it overrides the DB lookup. A generic word like 'polymer' is a CATEGORY, not a card, and 'nylon' is a near-miss for one, so neither carries a density; the error names both exits. filament_dia_mm (1.75 default, 2.85 for the older standard) sets the spool stock the filament length is computed against.

Returns {mass_g, filament_g, deposited_volume_mm3, layer_count, print_time_min, infill_fraction}. Errors on a material with no density and no override, a negative volume, a bbox shorter than [x,y,z], or a non-positive layer height.

ParametersJSON Schema
NameRequiredDescriptionDefault
bbox_mmYes
materialNoPLA
nozzle_mmNo
volume_mm3Yes
density_g_ccNo
wall_fractionNo
filament_dia_mmNo
infill_fractionNo
layer_height_mmNo
print_speed_mm_sNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses the analytic nature, the exact calculation formulas, the material database lookup and override behavior, the return fields, and several error conditions. None of this contradicts the annotations; it substantially enriches them.

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 long, but every section earns its place: core purpose, formulas, material caveats, return values, and error conditions are organized in a logical flow. It is front-loaded with the most important distinction from the sibling tool, though formatting as bullets could improve scannability.

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 10-parameter analytic tool with no output schema and no parameter descriptions, this is remarkably complete. It explains how results are computed, what the returned keys are, how material resolution works, and exactly which inputs cause errors. The only minor gap is the indirect treatment of nozzle and speed parameters, but the formula context makes them understandable.

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?

With 0% schema description coverage, the description carries the parameter-documentation burden and does so well for most parameters: material, density_g_cc, filament_dia_mm, volume_mm3, bbox_mm, wall_fraction, infill_fraction, layer_height_mm. However, nozzle_mm and print_speed_mm_s are only implied through 'print_time from nozzle volumetric flow', leaving them slightly under-specified.

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 exactly what the tool does: a first-order FDM slice estimate that is analytic and requires no slicer. It immediately distinguishes itself from slice_gcode_submit, which is the real PrusaSlicer CLI, so the agent can tell them apart without opening schemas.

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 explicitly points to slice_gcode_submit as the alternative for a real slicer, which gives clear when-to-use versus when-not-to-use guidance. It also explains material lookup behavior and when a density override is needed, including error exits for category and near-miss material names.

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

slice_gcode_submitSlice G-code SubmitA

Slice a real part with the PrusaSlicer CLI, asynchronous — the external-CLI upgrade of the analytic slice_estimate: real perimeters, infill patterns, supports, travel/acceleration, and the slicer's own print-time model. Requires a PrusaSlicer install ('apt install prusa-slicer' / the AppImage); when absent this returns {ok:false, reason, install} rather than raising.

Pass a body handle (exported to STL in the modeller) or a prepared stl_path. infill_fraction is 0..1 (full infill auto-switches the fill pattern — PrusaSlicer's default refuses 100%); material/density_g_cc set the filament density used to turn the sliced volume into grams. With a body the result also carries the analytic estimate and the deposited_ratio between them (a 20 mm cube at 100% lands ~1.008 — the skirt).

Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for {ok, gcode_path, filament_mm, filament_cm3, filament_g, print_time_s, print_time_text, layer_count, config (the slicer's echoed settings), analytic?, deposited_ratio?}.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
materialNoPLA
stl_pathNo
supportsNo
extra_argsNo
density_g_ccNo
infill_fractionNo
layer_height_mmNo

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, the description reveals that the operation is asynchronous, invokes an external CLI, returns a structured error rather than raising when PrusaSlicer is missing, auto-switches the fill pattern at full infill, and carries analytic-estimate comparison data with a deposited_ratio. These are meaningful behavioral disclosures the annotations do not provide.

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 dense but well organized: purpose first, then prerequisites, then parameter semantics, then return/polling behavior. Every sentence contributes real information, including a concrete calibration example for deposited_ratio. It earns its length.

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 async tool with no output schema, the description covers purpose, prerequisites, alternatives, parameter meanings, return shape, and the polling requirement. The omissions of layer_height_mm and extra_args are the main gaps, but they are minor relative to the overall completeness for a tool of this complexity.

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?

With 0% schema description coverage, the description carries the full burden and does explain body vs stl_path, infill_fraction's range and 100% edge case, material/density_g_cc, and supports. However, it leaves layer_height_mm and extra_args entirely unexplained, and supports is only mentioned as a feature, not given parameter-level semantics. This is adequate but has clear gaps.

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 names a specific verb+resource ('Slice a real part with the PrusaSlicer CLI') and immediately distinguishes itself from slice_estimate by positioning it as the 'external-CLI upgrade' that produces real perimeters, infill patterns, supports, and print-time modeling. This is far more than a restatement of the title.

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 clearly contrasts this tool with slice_estimate, gives the prerequisite PrusaSlicer install requirement, and explains the async submit/poll-job_result workflow. It does not explicitly say 'use slice_estimate when PrusaSlicer is absent,' but the installation requirement and the named alternative make the intended context clear.

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

solve_capabilitiesSolve CapabilitiesA
Read-only

Report which P2 external solvers (CFD/MBD/topology/transient-thermal/optics) are usable right now — so you can pick a working solver for a *_submit family instead of discovering availability by trial and error. The solver twin of render_capabilities.

Takes no arguments. Resolves each solver side-effect-free: a binary by ANKUSDRIVE__PATH env -> PATH -> per-OS install dirs; a pip-wheel solver by importability. It executes nothing and installs nothing.

families[*].any_available is the gate to trust: it means AnkusDrive can actually DRIVE that family here, not just that a binary resolved. A solver that resolves but that no AnkusDrive tool can build a case for is listed under the family's prepared_case_only (with the reason on the solver entry) and does NOT set any_available — today that is SU2, which only ever runs a case_dir you prepared yourself (*.cfg + *.su2); every built-in CFD case mode is OpenFOAM-only.

Returns {platform, available (sorted ready solver names), unwired, prepared_case_only, solvers: {name: {available, kind ('binary'|'wheel'), family, extra, and either path/module (when available) or install_hint, plus prepared_case_only when nothing can build it a case}}, families: {family: {solvers, available, unwired, prepared_case_only, any_available}}, extras: {extra: [solver names]} for pip install ankusdrive[<extra>], toolsets: {enabled, disabled: {family: {label, tools, enable}}}, cases: {root, count, bytes, bytes_exact, keep, max_gb, grace_s, reaping}}. A family listed under toolsets.disabled has no tools registered in this session — tell the user its enable instruction rather than concluding the capability does not exist.

cases is where every generated solver deck is written (one managed root) and the retention it is held to: at most keep directories and max_gb GB, reaped oldest-first, never touching one younger than grace_s seconds. Point a user at cases.root when they ask where a solve's files went (issue #437).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint annotation by disclosing the side-effect-free resolution process: it executes nothing, installs nothing, and resolves binaries via env var -> PATH -> per-OS install dirs, and pip wheels by importability. It also explains the subtle distinction between a solver that resolves and one that is actually drivable, using SU2 as a concrete example. This is rich behavioral context that annotations alone do not provide.

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 long but densely informative, with a clear structure: purpose, side-effect-free guarantee, key gate to trust, return shape, and retention policy. It front-loads the most actionable information (pick a working solver) before diving into return fields. It loses one point because the return-shape enumeration is quite lengthy and could be trimmed or summarized without losing critical guidance.

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 zero-parameter capability-reporting tool with no output schema, the description is remarkably complete. It explains the return structure in detail, including the meaning of `any_available`, `prepared_case_only`, `toolsets.disabled`, and `cases` retention semantics. It even includes a user-facing pointer (point users at `cases.root`) and references issue #437. An agent has everything needed to call the tool and interpret its output correctly.

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?

The tool takes zero parameters, so the schema is trivially complete. The description explicitly states 'Takes no arguments,' which removes any doubt. The baseline for 0 params is 4, and the description earns it by confirming the no-argument contract and explaining what the tool returns instead.

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 opens with a specific verb ('Report') and resource ('P2 external solvers'), and immediately states the practical purpose: pick a working solver for a *_submit family instead of discovering availability by trial and error. It also explicitly names its sibling counterpart ('The solver twin of render_capabilities'), which distinguishes it from the render-related capability tool in the sibling list.

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 explicitly tells the agent when to use this tool: before calling any *_submit family tool, to check solver availability. It also gives concrete guidance on how to interpret results, e.g., trust `families[*].any_available` as the gate, and tells the agent what to do when a family is under `toolsets.disabled` (tell the user its `enable` instruction rather than concluding the capability does not exist). This is explicit when-to-use and how-to-interpret guidance.

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

spring_checkSpring CheckA
Read-only

Rate a helical compression spring (Wahl). rate k=G d^4/(8 D^3 Na); corrected shear tau=Kw 8FD/(pi d^3). Pass force_n OR deflection_mm. Returns {spring_index, wahl_factor, rate_n_mm, force_n, deflection_mm, shear_stress_mpa, slenderness, buckling_flag, allowable_shear_mpa, shear_sf, pass}.

G and the allowable come from material unless overridden. shear_modulus_mpa sets G directly; allowable_shear_mpa replaces the 0.45·UTS estimate, which falls back to 700 MPa (spring steel) for a material carrying no UTS — pass it explicitly for anything else, since shear_sf and pass scale with it.

ParametersJSON Schema
NameRequiredDescriptionDefault
force_nNo
materialNoSteel-1045
wire_dia_mmYes
active_coilsYes
deflection_mmNo
free_length_mmNo
coil_mean_dia_mmYes
shear_modulus_mpaNo
allowable_shear_mpaNo

TDQS

A4.1/5.0
Behavior4/5

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

With readOnlyHint=true covering the non-mutating nature, the description adds valuable behavior beyond annotations: default materials, the 700 MPa fallback, how allowable_shear_mpa replaces the estimate, and how shear_sf/pass scale accordingly. It does not specify error behavior for passing both force_n and deflection_mm, but this is a minor 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?

The description is dense but efficient, leading with the core formula and immediately following with the key input rule. The output list and fallback/override notes add length, but each sentence carries necessary information without redundancy.

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 9-parameter engineering tool with no output schema, the description provides formulas, output keys, default behavior, and override semantics, which is strong. The remaining gaps—unexplained free_length_mm and the exact consequence of providing both force_n and deflection_mm—keep it from being fully 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 property descriptions are absent, so the description must compensate. It does so by mapping d, D, and Na through the formula and by explaining shear_modulus_mpa, allowable_shear_mpa, material, force_n, and deflection_mm. However, free_length_mm is never mentioned despite appearing in the schema and relating to slenderness/buckling outputs.

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 opens with a specific verb and resource: 'Rate a helical compression spring (Wahl).' It names the exact calculation regime and key formulas, making the tool's purpose unmistakable and distinguishing it from the many generic sibling check/estimation tools.

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 gives clear usage constraints such as 'Pass force_n OR deflection_mm' and explains when overrides apply. However, it does not explicitly compare against alternative tools or state when not to use this tool, so the when-to-use guidance is implied rather than explicit.

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

standard_part_designateStandard Part DesignateA
Read-only

The canonical, orderable designation of a purchased standard part — the string a buyer can actually quote against: "ISO 4762 M4×12 A2", "608-2RS", "AS568-214 NBR70". A BOM row that reads "SocketHeadCapScrew" is not a buyable line; this is what turns it into one.

Three ways in: handle read the designation add_fastener / add_bearing / add_thread stamped on the part when it was built. An object with no stamp reports designation=None plus whether its NAME reads like a purchased part. Nothing is ever inferred from geometry, so a hand-modelled bracket cannot acquire a false designation. designation normalise/parse a string — 'iso4762 m4x12 a2' becomes 'ISO 4762 M4×12 A2', so two spellings of one part can never become two BOM lines. family+spec build one from facts. family is fastener | bearing | oring | threaded_rod, and spec is respectively {kind, size, length, grade} / {designation, seals} / {inner_diameter, cross_section, compound} / {diameter, pitch, length, grade}.

Offline and deterministic — no network, no supplier, no credentials.

Returns the designation card: {ok, family, standard, designation, complete, reason, purchased, ...family-specific fields}. complete=False means the string is not yet enough to order against (typically nobody said which material grade), with reason naming the gap — a missing fact is reported, never defaulted to a plausible-looking lie.

ParametersJSON Schema
NameRequiredDescriptionDefault
specNo
familyNo
handleNo
designationNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond readOnlyHint/openWorldHint, the description discloses determinism, offline operation, no credentials, and that missing facts are reported via complete=False/reason rather than defaulted. It also states that unstamped objects report designation=None with name heuristics, adding real behavioral context beyond annotations.

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 dense but organized with short labeled sections. Every sentence adds semantic value, and the core purpose is front-loaded before mode details and return-card behavior.

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?

Given no output schema, the description still explains the return card fields (ok, family, standard, designation, complete, reason, purchased, family-specific) and error/partial-result semantics. Combined with input-mode coverage, an agent has enough to select and invoke 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?

With 0% schema description coverage, the description fully compensates: it maps handle, designation, and family+spec to concrete meanings, enumerates family values (fastener, bearing, oring, threaded_rod), and specifies the expected spec object fields for each family. Examples clarify string formats.

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 capability: producing the canonical orderable designation string for a purchased standard part. It uses concrete examples and explicitly contrasts with a non-buyable BOM line, making the tool's function clear and distinguishable from modeling or search 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?

It clearly documents three invocation modes (handle, designation, family+spec) and when each is appropriate, including a guardrail that geometry is never inferred. It does not explicitly name alternative sibling tools or say when not to use them, so the guidance is context-rich but not fully exclusive.

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

study_submitStudy SubmitA

Sweep parameters over a sampled design space and record the WHOLE search as a table — the DOE primitive between the parametric layer and the solver catalog.

Without it, exploring a design space means hand-rolling recipe(params) -> solve -> mutate -> repeat and keeping only the last point, so nobody can tell afterwards whether the design is good or merely the one you stopped on. A study keeps every point, with the parameters that produced it.

variables declares the space; each entry is either explicit levels or a range:

  • {"name": "diameter_mm", "values": [8, 10, 12]} — these and only these

  • {"name": "diameter_mm", "min": 8, "max": 12, "levels": 3} — evenly spaced

sampling picks how they combine:

  • {"method": "grid"} (default) — full factorial. Exhaustive, and the only thing that can prove a trend, but it is the PRODUCT of the level counts: three variables at five levels is 125 evaluations.

  • {"method": "lhs", "n_samples": 20, "seed": 0} — Latin hypercube. Each variable's range is cut into n_samples strata and every stratum used once, so cost is decoupled from dimensionality: 20 points cover 6 variables as well as 2. Use it past 2-3 variables. Both are deterministic from seed, which is what makes a re-run hit the cache.

responses says how to measure each point, in the same mapping a performance requirement uses: {"name": "dp", "tool": "cfd_pipe_flow", "metric": "pressure_drop_pa", "conditions": {"diameter_mm": "$diameter_mm", "length_mm": 200}}. Inside conditions, "$<variable>" is that point's value and "$handle" is the part it built; an unknown $token is refused up front, because a sweep that silently measured a literal string at every point returns a flat, plausible, wrong table.

tool can be ANY AnkusDrive tool, including verify_performance — and that is the interesting case. A response that is a contract verdict carries a band, a trust block and a pass/fail/indeterminate state, so points stay comparable across fidelity tiers instead of being bare floats of unknown quality.

recipe (+ fixed_inputs) rebuilds geometry per point; omit it and pass handle (or nothing) to sweep analysis parameters against fixed geometry. Screening-tier responses evaluate inline in milliseconds, so thousand-point studies are viable; solver-tier responses fan out concurrently and one collector job joins them.

Caching IS resumability: identical points hash to the same job content key, so re-submitting a study after a crash, or widening its grid, re-runs only what is new — n_cached is what tells you the re-run was free. max_points (default 64) refuses a sweep larger than you probably meant.

objective — {"response": "dp", "sense": "min"} — additionally reports best.

Returns EITHER the finished table or {job_id, status, points, pending}; poll job_result for the completed table. A point that failed to build or measure is a row with ok: false, never an exception. Result: {ok, n_points, n_evaluated, n_cached, n_failed, sampling, variables, points: [{index, params, handle?, ok, responses: {name: {ok, value, band_pct?, converged?, state?, job_id?, cache_hit?, detail?}}, warnings}], responses: {name: {n, n_missing, min, max, mean, argmin, argmax}}, best?}.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleNo
recipeNo
samplingNo
objectiveNo
responsesYes
variablesYes
max_pointsNo
fixed_inputsNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the minimal annotations, the description discloses non-obvious behavior: asynchronous return of a job_id to poll, failures as ok:false rows rather than exceptions, deterministic caching/re-run behavior, max_points refusing oversized sweeps, upfront refusal of unknown $tokens, and concurrent fan-out for solver-tier responses. This is far more than the annotations convey.

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 text is front-loaded with a clear one-sentence purpose and then organized into labeled sections that map to the major parameters. It is long, but the length is largely justified by the 8-parameter schema with zero descriptions; a little redundancy around deterministic caching keeps it from a perfect conciseness score.

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?

There is no output schema, so the description supplies a detailed result shape including points, responses, aggregates, and best. It also covers async behavior, polling via job_result, failure semantics, caching, and all parameter combinations, making the tool actionable without requiring the agent to infer behavior.

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?

The input schema has 0% description coverage, so the description carries the entire burden for parameter understanding. It fully explains variables (values vs min/max/levels), sampling (grid/lhs with n_samples and seed), responses (name/tool/metric/conditions and $token substitution), objective, recipe/fixed_inputs/handle, and max_points defaults with examples.

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 opening line states a specific action and resource: "Sweep parameters over a sampled design space and record the WHOLE search as a table." It further identifies the tool as "the DOE primitive between the parametric layer and the solver catalog," which distinguishes it from single-point solvers and analysis 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?

The description gives concrete when-to-use guidance: use grid to prove trends, use lhs past 2-3 variables, omit recipe and pass handle to sweep analysis parameters with fixed geometry, and consider verify_performance as a response tool for contract verdicts. It does not explicitly name exclusion cases or alternative submit tools like optimize_submit, so it stops short of full when-not guidance.

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

substitutability_checkSubstitutability CheckA
Read-only

Liskov-substitutability gate — Form/Fit/Function as code (§7.1, #147). Take an assembly that gates green with variant A in a slot, swap in variant B (a different family row, or any part claiming the same interface), and re-run merge_assembly + all the gates. Still green ⇒ B is interchangeable with A — by construction a compatible (MINOR/PATCH) change ⇒ revise the existing part number; a gate now fails ⇒ the swap broke Form/Fit/Function ⇒ a new part number. Purely deterministic (no API, no judgment); the substitutability test #138 (B1 families) and #146 (the interface registry) call.

manifest: path to a manifest that gates green with variant A in slot. slot: the component id to swap (variant A → variant B). variant: the replacement component spec — a dict with exactly one of file/manifest/library (the same one-source rule merge_assembly enforces). verify_baseline: re-merge the base assembly first and require it green so the premise is honest (default True).

Function, not just Form and Fit (#261): if the swapped-in variant declares a PERFORMANCE contract (#226), it is part of the comparison. A contract measured as NOT met breaks the performance gate like any other. A contract with NO recorded verdict yields a THIRD answer — substitutable: null, verdict 'performance_unproven' — because an unverified spec is not a passed spec, and handing an unproven part an existing part number is the silent pass #226 prevents.

Returns {schema, slot, variant, baseline_ok, swap_ok, substitutable (True | False | null), verdict ('substitutable' | 'not_substitutable' | 'baseline_not_green' | 'performance_unproven'), broken_gates (the NAMED gate(s) the swap broke), broken (gate→violations), classification (compatibility/semver/decision), performance? (only when a component declares a contract), reports}.

ParametersJSON Schema
NameRequiredDescriptionDefault
slotYes
variantYes
manifestYes
verify_baselineNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint=true and openWorldHint=false, and the description adds substantial behavioral detail: deterministic execution, no judgment, baseline verification, and the special third answer for unverified performance contracts. This goes well beyond the structured annotations.

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 long but front-loaded with the core purpose and each section adds necessary detail about the procedure, performance edge case, and return contract. It is dense rather than padded, though some internal references and ticket numbers add length without immediate operational value.

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 no output schema, the description must explain return values, and it does: substitutable, verdict, broken_gates, classification, and performance details. It also covers the non-obvious performance_unproven case and the meaning of a null result, making the tool safe to invoke without further documentation.

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%, so the description carries the full burden for parameters. It explains all four parameters in context, including the one-source rule for variant, the meaning of slot, and the default behavior of verify_baseline. This compensates fully 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?

The description names a specific verb and resource: it performs a Liskov-substitutability gate by swapping variants and re-running merge_assembly plus gates. It clearly distinguishes itself from related tools like merge_assembly and verify_performance by explaining its unique decision logic and output.

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 description gives clear context: use it when an assembly gates green with variant A and you need to know whether variant B is interchangeable. It explains prerequisites and the verify_baseline flag, though it does not explicitly name alternatives or state when not to use the tool.

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

suggest_looseningSuggest LooseningA
Read-only

The loosest tolerance that works: which links can give up tolerance for the biggest cost saving while the stack still passes.

Greedy, one IT grade at a time — every trial loosening is re-verified against tolerance_stackup's seeded Monte-Carlo cpk before it is committed, so nothing it suggests can fail the spec. Candidates are ranked by the tolerance_cost_check curve, so the tightest (most expensive) links get opened first. Loosening preserves each link's MEAN, so the stack's nominal does not move.

Two honest refusals: a chain that does not already meet target_cpk returns ok=False (there is no margin to give away — tighten or re-spec, do not loosen), and an already-loosest chain returns steps=[] with saving=0 rather than inventing a saving. stopped says which: 'no_further_move' | 'max_steps' (re-run on the returned chain to continue) | 'no_margin'.

chain / handle / axis / default_tol / general as in tolerance_cost_check; spec_min/spec_max default to the chain's own worst-case bounds. Returns {ok, steps:[{link, index, from_it, to_it, from_band_mm, to_band_mm, cost_before, cost_after, saving, cpk}], stopped, chain (the loosened scheme), cost_index_before, cost_index_after, saving, saving_pct, cpk_before, cpk_after, target_cpk, spec, note, fidelity, band_pct, basis}.

ParametersJSON Schema
NameRequiredDescriptionDefault
axisNo+z
seedNo
chainNo
handleNo
generalNom
processNocnc
samplesNo
spec_maxNo
spec_minNo
max_stepsNo
target_cpkNo
coarsest_itNo
default_tolNo
step_gradesNo

TDQS

A4.5/5.0
Behavior5/5

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

Beyond readOnlyHint, the description explains the greedy one-IT-grade algorithm, Monte-Carlo re-verification before each suggestion is committed, mean preservation, ranking by the cost curve, and the exact meaning of ok=False and stopped values. It also enumerates the full return shape, which is very strong behavioral disclosure.

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 dense but each sentence earns its place: outcome first, then algorithm, safety verification, refusals, and return contract. The shorthand pointer to tolerance_cost_check for parameter meaning keeps it compact despite having 14 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?

Even without an output schema, the description provides a complete return contract including ok, steps, stopped, chain, cost indices, savings, cpk values, spec, and metadata. Combined with readOnlyHint and the explicit refusal semantics, an agent has enough context to invoke and interpret 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?

With 0% parameter schema coverage, the description must compensate. It usefully documents chain/handle/axis/default_tol/general via reference to tolerance_cost_check and explains spec_min/spec_max defaults and target_cpk/max_steps behavior. However, seed, samples, process, coarsest_it, and step_grades remain unexplained, leaving meaningful tuning parameters 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 first sentence states the specific outcome: find the loosest tolerance that still passes while maximizing cost savings. It clearly distinguishes the tool from analysis-only siblings like tolerance_stackup and tolerance_cost_check by framing it as the cost-optimizing loosening pass that builds on them.

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 description makes the intended use obvious and includes explicit refusal conditions: do not loosen when there is no margin, and do not loosen an already-loosest chain. It lacks an explicit sibling-routing sentence such as 'use X instead when...', but the context is clear enough for an agent to know when this tool applies.

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

sweepSweepA

Sweep a profile sketch along a spine sketch (additive pipe).

profile: handle of the cross-section sketch. spine: handle of the path sketch (in the same body). mode: 'Standard' | 'Frenet' | 'Auxiliary' | 'Binormal'. transition: 'Transformed' | 'Right corner' | 'Round corner'.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoStandard
nameNoSweep
spineYes
profileYes
transitionNoTransformed

TDQS

A3.6/5.0
Behavior3/5

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

The annotations already indicate the tool is not read-only and not destructive, and the description adds that this is an additive pipe operation with a same-body constraint. It does not disclose side effects on the original sketches, document state, or failure behavior, which would be useful for a feature-creation call.

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 first sentence is a compact definition and every following line is terse and scannable. There is no filler, and the most important invocation details are front-loaded.

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 description covers the core invocation: two required handles plus optional mode and transition values, and it gives a key spatial constraint. It does not explain the meaning of each mode/transition option, what the resulting feature handle or return value is, or likely failure conditions, leaving some gaps for agents choosing advanced options.

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?

With 0% schema description coverage, the description compensates well: it defines profile and spine handles, gives exact allowed values for mode and transition, and notes the same-body requirement. The optional name parameter is omitted from the description, but the schema supplies its default value.

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 the operation: 'Sweep a profile sketch along a spine sketch (additive pipe)', giving a specific verb, the two key resources, and the additive nature of the feature. It does not explicitly distinguish from sibling tools like loft or pad, but the profile+spine pair makes the purpose 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?

The description provides one relevant prerequisite: the spine must be 'in the same body', and it lists the selectable mode and transition values. However, it gives no explicit when-to-use or when-not-to-use guidance relative to sibling tools such as loft or revolve, and it does not explain when one mode should be preferred over another.

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

thermal_composite_wallThermal Composite WallA
Read-only

Exact series thermal-resistance network of a plane composite wall (NO solver) — the classic overall-U calculation and the conjugate-heat-transfer family's closed-form oracle. layers is the in→out list of solid layers, each {thickness_mm, k | material} (k in W/m·K, or a Materials-DB name); h_in/h_out are optional convection film coefficients (W/m²K). Per unit area R = 1/h_in + Σ tᵢ/kᵢ + 1/h_out, U = 1/R, q = U·(t_in − t_out), and every surface/interface temperature follows exactly.

Returns {u_w_m2k, r_total_m2k_w, q_w_m2, q_w, layer_resistances_m2k_w, interface_temps_c (inner surface → outer surface), t_in_c, t_out_c, area_m2}.

ParametersJSON Schema
NameRequiredDescriptionDefault
h_inNo
h_outNo
layersYes
t_in_cYes
area_m2No
t_out_cYes

TDQS

A4.6/5.0
Behavior5/5

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

Beyond readOnlyHint, the description discloses the exact governing formula with units, layer structure, optional convection coefficients, and the full return shape. It also states that every surface/interface temperature follows exactly and that no solver is used. No contradiction with annotations.

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 dense but well organized: it front-loads the core calculation and 'NO solver', then gives layer/parameter syntax, the formula, and return keys. Every sentence adds useful information with minimal 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 calculation with no output schema, the description covers the core inputs, formula, and all returned fields. Minor omissions include explicit handling of null film coefficients, invalid material names, and area scaling behavior, but these are not severe for a closed-form calculator.

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?

With schema description coverage at 0%, the description compensates well: it explains layers as {thickness_mm, k | material}, gives units for k and film coefficients, and shows how t_in_c/t_out_c enter the formula. It does not explicitly explain how area_m2 scales q_w_m2 to q_w, nor how null h_in/h_out are treated, so it is not fully 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?

The description names a specific calculation: exact series thermal-resistance network of a plane composite wall, and explicitly says 'NO solver' and 'closed-form oracle.' This clearly distinguishes it from numerical/transient siblings such as thermal_transient_1d or fem_thermal_results.

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 provides clear context: use for steady-state overall-U and interface-temperature calculations for a plane wall, framed as a closed-form reference for the CHT family. It does not explicitly list alternatives or state when not to use it, but the 'NO solver' and 'exact/oracle' framing is enough for routing.

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

thermal_lumpedThermal LumpedA
Read-only

Lumped first-order transient warm-up (no mesh). ΔT_ss = P/(h·A), τ = m·c_p/(h·A), T(t) = T_amb + ΔT_ss·(1−e^(−t/τ)). c_p is an explicit value/quantity-string ('900 J/kg/K') or read from material. Get h_conv from the h_estimate correlation screen rather than guessing. With duration_s the temperature + fraction-of-steady reached are returned. A radiation screen flags when the steady-state radiative HTC exceeds h_conv. Returns {t_ambient_c, delta_t_steady_k, t_steady_c, time_constant_s, t_final_c, reached_steady_pct, h_rad_w_m2k, radiation_significant}.

ParametersJSON Schema
NameRequiredDescriptionDefault
c_pNo
h_convYes
mass_gYes
power_wYes
area_mm2Yes
materialNo
duration_sNo
emissivityNo
t_ambient_cNo

TDQS

A4.3/5.0
Behavior4/5

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

Reveals the computational model (equations), the radiative HTC check, and the complete return payload. Given readOnlyHint=true, the description adds meaningful context beyond annotations, though it could explicitly note that the tool is non-mutating.

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?

Cleanly structured: formula first, then guidance, then outputs. No filler, but the mathematical notation is dense and could be slightly reorganized for readability.

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?

Without an output schema, the return values are fully spelled out. The model and key usage caveats are covered. Minor gaps: no explicit units for inputs (e.g., mass_g, area_mm2 are implied by names but not stated) and no note on typical value ranges.

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?

With 0% schema description coverage, the description compensates for c_p (explicit vs material), h_conv source, duration_s behavior. It doesn't explain emissivity, t_ambient_c, mass_g, power_w, area_mm2 beyond their names, leaving some ambiguity for an agent.

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, resource, and scope: 'Lumped first-order transient warm-up (no mesh)'. The physics and outputs are enumerated. It is clearly distinguishable from mesh-based thermal tools like thermal_transient_submit.

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 tells the agent to obtain h_conv from the h_estimate correlation screen rather than guessing, and describes when duration_s is relevant. This routes the agent to the correct companion tool and clarifies input strategy.

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

thermal_radiation_submitThermal Radiation SubmitA
Destructive

Diffuse-gray radiation FEM via Elmer, asynchronous — the radiation sibling of thermal_transient_submit. Requires ElmerSolver + the ViewFactors binary (apt elmerfem-csc / conda); when absent this returns {ok:false, reason, install} rather than raising. Two modes:

  • Build the two-plate enclosure case (no case prep): pass t1_c, t2_c (°C) and the two surface emissivities emissivity_1/emissivity_2 (default 0.8). The handler writes a 2-D pair of parallel plates radiating across an unmeshed vacuum gap, runs ViewFactors then ElmerSolver, and extracts the net radiative exchange — directly gated against the exact two infinite parallel plates oracle q = σ(T₁⁴−T₂⁴)/(1/ε₁+1/ε₂−1) (oracle_ratio ≈ 1). Mesh/geometry knobs: width_m, gap_m, plate_thickness_m, n_x, k_plate.

  • Run a prepared case_dir containing its .sif + mesh (ViewFactors is run first when no factor file is present).

Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result for {ok, returncode, solver, case_dir, stdout_tail} plus, for the plate case, {flux_w_m2, q_net_w, two_plate_flux_w_m2, oracle_ratio, t1_c, t2_c, emissivity_1, emissivity_2} (or {scalars_final} for a prepared case).

ParametersJSON Schema
NameRequiredDescriptionDefault
n_xNo
sifNocase.sif
t1_cNo
t2_cNo
gap_mNo
k_plateNo
width_mNo
case_dirNo
emissivity_1No
emissivity_2No
plate_thickness_mNo

TDQS

A4.4/5.0
Behavior4/5

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

The description reveals significant behavior beyond the annotations: it is asynchronous, requires ElmerSolver and ViewFactors, returns {ok:false, reason, install} rather than raising when dependencies are absent, and returns a job_id for polling. It does not contradict the destructiveHint annotation, and while it does not detail file-system side effects, the annotation already signals destructive potential.

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 long but well-structured: a lead sentence, a dependency note, and two bullet modes followed by the return contract. Each section contributes necessary information for a tool with 11 parameters and no output schema. It is dense but not padded; the only minor inefficiency is some repetition in the output list.

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 high-complexity asynchronous solver with 11 optional parameters and no output schema, the description is remarkably complete. It covers prerequisites, both invocation modes, the job polling path, the expected result fields, and even the physics oracle used for verification. An agent has enough context to call this tool correctly in either mode.

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 carries the burden, and it largely succeeds: t1_c/t2_c are defined as °C, emissivity_1/emissivity_2 are called out with defaults, and width_m, gap_m, plate_thickness_m, n_x, and k_plate are grouped as mesh/geometry knobs. The only gap is that the `sif` parameter is not explicitly explained, though the prepared-case mode implies its role.

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 action ('Diffuse-gray radiation FEM via Elmer, asynchronous') and explicitly names the sibling it relates to: 'the radiation sibling of thermal_transient_submit.' An agent can immediately distinguish this from other thermal/simulation tools. The verb, resource, and domain are all clear.

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 description gives two explicit usage modes—building the two-plate enclosure case or running a prepared case_dir—and states the required external binaries and the graceful failure path if they are missing. It does not, however, explicitly say when to prefer this over the transient sibling beyond calling it the 'radiation sibling,' so it stops short of a full when/when-not statement.

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

thermal_transient_1dThermal Transient 1DA
Read-only

Analytic 1-D plane-wall transient conduction (one-term Heisler series), valid for Fourier ≳ 0.2 — the closed-form transient the Elmer thermal_transient solve is gated against, and the distributed (spatial-gradient) answer the lumped screen only approximates. A wall of half-thickness L cools/heats toward ambient by surface convection: Bi = h·L/k, Fo = α·t/L², α = k/(ρ·cₚ). Pass alpha_m2_s, or k+rho+cp, or a material (Materials DB: thermal_conductivity/Density/specific_heat); get h_conv from the h_estimate correlation screen rather than guessing.

As Bi→0 the body is isothermal and this collapses to the lumped exponential exp(−t/τ) (cross-checked via t_center_lumped_c / lumped_agrees). Returns {biot, fourier, eigenvalue_1, c1, t_center_c, t_surface_c, t_center_lumped_c, time_constant_s, one_term_valid, lumped_agrees}.

ParametersJSON Schema
NameRequiredDescriptionDefault
kNo
cpNo
rhoNo
h_convYes
materialNo
alpha_m2_sNo
duration_sYes
t_ambient_cNo
t_initial_cNo
half_thickness_mmYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint, so the description carries the burden of explaining behavior. It discloses the one-term Heisler approximation, validity limits, material-input alternatives, the collapse to lumped behavior, and the exact output keys. This significantly exceeds what annotations alone provide, with no contradiction.

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 dense but every sentence carries information: model, validity, physical setup, dimensionless numbers, input alternatives, guidance to a sibling tool, and return fields. It is front-loaded with the core definition and avoids filler.

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 no output schema, listing the return keys is essential and is done thoroughly. The description also covers the physical geometry, assumptions, validity range, input alternatives, and relationship to lumped and FEA tools. Nothing critical is missing for correct invocation.

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: it defines α = k/(ρcₚ), Bi = hL/k, Fo = αt/L², and explains the acceptable input paths (alpha_m2_s, k+rho+cp, or material). A few parameters like duration_s, t_initial_c, and t_ambient_c are left to their titles/defaults rather than explicit prose, preventing a perfect score.

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 clearly identifies a specific verb and resource: an analytic 1-D plane-wall transient conduction calculation via one-term Heisler series. It distinguishes itself from the lumped approximation and the Elmer thermal_transient solve, so an agent can tell exactly what this tool computes and why it is different.

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 explicitly states the validity regime (Fourier ≳ 0.2), contrasts the distributed answer with the lumped screen, and directs the agent to obtain h_conv from the h_estimate correlation screen rather than guessing. It also explains the Bi→0 collapse to the lumped exponential, giving clear contextual guidance on when this approximation is appropriate.

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

thermal_transient_submitThermal Transient SubmitA
Destructive

Transient thermal FEM via Elmer, asynchronous. Requires ElmerSolver (apt elmerfem-csc / conda); when absent this returns {ok:false, reason, install} rather than raising. Three modes:

  • Build the analytic-slab case (no solver case prep needed): pass the plane-wall transient — half_thickness_mm, h_conv (W/m²K), duration_s, and either k+rho+cp (SI) or a material name, with optional t_initial_c / t_ambient_c and mesh/step counts n_elements / n_steps. The handler writes the 1-D conduction case (symmetry at the centre, convection at the surface), runs ElmerSolver, and returns the centre/surface temperatures — the same plane-wall BVP thermal_transient_1d solves analytically, so the two are directly comparable (the kickoff's relative gate).

  • Solve a real FreeCAD solid — the geometry bridge: pass a body handle plus convection_faces (1-based indices into the solid's faces; those faces get the h_conv/t_ambient_c convective BC, every other face is adiabatic), the physics (h_conv, duration_s, k+rho+cp or material), and an optional char_length_mm Gmsh element size and element_order ('1st'|'2nd'). The solid is Gmsh-meshed and solved as a true 3-D body (ElmerGrid + ElmerSolver); the result's {t_max_c, t_min_c} are the interior/convective-surface temperatures (for a slab-like body, directly gateable against thermal_transient_1d). Prefer element_order='2nd' for a sharp transient — quadratic tets resolve the wall gradient accurately even on a coarse mesh.

  • Run a prepared case_dir containing its own .sif + mesh.

Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result for {ok, returncode, solver, case_dir, stdout_tail} plus, for the slab case, {t_center_c, t_surface_c, n_steps_written}, for a body {t_max_c, t_min_c, nodes, tets} (or {scalars_final} for a prepared case).

ParametersJSON Schema
NameRequiredDescriptionDefault
kNo
cpNo
rhoNo
sifNocase.sif
bodyNo
h_convNo
n_stepsNo
case_dirNo
materialNo
duration_sNo
n_elementsNo
t_ambient_cNo
t_initial_cNo
element_orderNo
char_length_mmNo
convection_facesNo
half_thickness_mmNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare destructiveHint=true and readOnlyHint=false, and the description adds substantial behavioral context: it is asynchronous, returns {ok:false, reason, install} when ElmerSolver is absent rather than raising, writes files, runs external solvers, and returns degradation dict or job_id/status/cache_hit. It also discloses the return payload structure for each mode. This goes well beyond the annotations.

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 long but well-structured with clear mode headers and bullet-like formatting. Every sentence adds value: prerequisites, mode-specific parameters, return values, and a practical recommendation. It is front-loaded with the core purpose and prerequisite. Slightly verbose but justified given 17 parameters and three modes.

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?

Given the tool's complexity (17 params, 3 modes, async behavior, external solver dependency), the description is remarkably complete. It covers prerequisites, mode selection, parameter semantics, return values, and even a numerical recommendation. Minor gaps: it doesn't explain the sif parameter explicitly, and doesn't detail the degradation dict contents, but these are minor against the overall completeness.

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 the meaning of half_thickness_mm, h_conv, duration_s, k/rho/cp, material, t_initial_c, t_ambient_c, n_elements, n_steps, body, convection_faces, char_length_mm, element_order, and case_dir. It does not explicitly explain sif, but the case_dir mode implies it. This is strong compensation for zero schema coverage.

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 clearly states the tool performs transient thermal FEM via Elmer asynchronously, and distinguishes three distinct modes: analytic-slab, FreeCAD solid geometry bridge, and prepared case_dir. It names the specific verb (submit), resource (thermal transient FEM), and differentiates from siblings like thermal_transient_1d and thermal_radiation_submit.

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 explicitly explains when to use each mode: analytic-slab for plane-wall BVP comparable to thermal_transient_1d, body mode for real FreeCAD solids with convection faces, and case_dir for prepared cases. It also gives a concrete recommendation to prefer element_order='2nd' for sharp transients, and notes the ElmerSolver prerequisite and fallback behavior.

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

thicknessThicknessB

Hollow out a solid into a shell.

base: handle of the body's tip feature (the solid to hollow). open_faces: list of {handle, face: tag|'FaceN'} that become the shell's openings. thickness: wall thickness (mm). reversed: True (default) grows the wall INWARD into the solid (the natural "hollow this part" interpretation). False grows outward. join: 'Arc' | 'Intersection'. mode: 'Skin' | 'Pipe' | 'RectoVerso'.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseYes
joinNo
modeNo
nameNoThickness
reversedNo
thicknessNo
open_facesYes

TDQS

B3.3/5.0
Behavior2/5

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

Annotations indicate readOnlyHint=false and destructiveHint=false, but the description does not add meaningful behavioral context beyond the parameter explanations. It does not disclose side effects (e.g., whether the original body is replaced), requirement for a 'tip feature', or any constraints on the solid shape. Since annotations are minimal (false flags do not describe the nature of the mutation), the description carries the burden but fails to elaborate on behavior beyond the immediate hollow-out action.

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 compact and front-loaded with the core purpose. The parameter list is structured efficiently, each line providing specific value. No unnecessary words, though the formatting is a plain list rather than a structured breakdown. It earns high marks for concision and clear organization.

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 tool with 7 parameters, no output schema, and no enum constraints, the description covers parameter semantics well but misses contextual details: it does not mention the requirement for a solid body, the meaning of 'tip feature', or the result of the operation (e.g., a modified body object). It also does not reference the similar shell_solid tool, leaving ambiguity about when to use this instead. Given the complexity and the existence of a likely-sibling tool, more context is needed.

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%, so the description must compensate. It explains each parameter: base as the handle of the tip feature, open_faces as openings, thickness as wall thickness with units, reversed with directional meaning, and join/mode with enumerated options. This goes well beyond the bare schema, giving the agent full understanding of parameter intent and defaults.

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 'Hollow out a solid into a shell,' which clearly defines the operation and its object. It specifies the resource as a solid and the action as hollowing, making the purpose unambiguous. However, it does not differentiate from the sibling tool 'shell_solid', which likely performs a similar function, so it lacks explicit sibling differentiation.

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?

The description provides no guidance on when to use this tool versus alternatives like shell_solid or other shelling approaches. It does not state prerequisites, conditions, or exclusions. The only contextual hint is the tool name and title, which are not sufficient for an agent to decide between this and a sibling.

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

tolerance_cost_checkTolerance Cost CheckA
Read-only

Price a tolerance scheme against the process that has to hold it — the missing link between tolerance_stackup ("what tolerance works") and cost_estimate ("what does it cost").

Per toleranced dimension: its ISO 286 IT grade as a FLOAT (a band between IT6 and IT7 reports 6.4, not 7), the cheapest machining operation that holds that grade naturally (drilling ~IT11, milling ~IT10, turning ~IT9, reaming ~IT7, grinding ~IT6), a relative cost index normalised to 1.0 at process's natural capability, and a verdict: 'ok', 'in_process_tightening' (tighter but reachable in the same operation), or 'needs_secondary_operation' — the flag, meaning the part silently acquired an operation nobody costed. pass is false when any link flags. Cost roughly doubles every 1.5 IT grades tightened below natural capability; above it only inspection/scrap falls. total_cost_index is the sum, so two tolerance SCHEMES over the same chain compare directly.

chain is the same [{name, nominal, plus, minus | tol}] tolerance_stackup takes; instead pass a live handle (+ axis, default_tol, general) and the chain is derived off the solid the same way. process: cnc | injection | casting | sheet | fdm | drilling | milling | turning | boring | reaming | grinding | honing | lapping.

fidelity='correlation', band_pct=50 — the RATIOS are defensible, the absolute index is dimensionless and is not money. Returns {process, links:[{name, nominal_mm, band_mm, it_grade, cost_index, verdict, cheapest_operation, natural_it, note}], n_links, total_cost_index, mean_cost_index, flagged, pass, fidelity, band_pct, basis, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
axisNo+z
chainNo
handleNo
generalNom
processNocnc
default_tolNo

TDQS

A4.6/5.0
Behavior5/5

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

The annotations only state readOnlyHint=true, so the description must carry behavioral weight—and it does. It discloses the verdict semantics, the cost-index scaling rule ('Cost roughly doubles every 1.5 IT grades tightened below natural capability'), the flag behavior ('part silently acquired an operation nobody costed'), and the pass/fail aggregation across links. This is far beyond what annotations provide.

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 dense but front-loaded: the one-sentence purpose comes first, followed by behavioral rules, parameter semantics, and the return shape. Every sentence contributes meaningful information, including caveats like 'the absolute index is dimensionless and is not money.' Despite its length, it avoids padding.

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 tool with no output schema and no parameter descriptions, the description covers a great deal: purpose, process enum, defaults, verdict semantics, and the return object. The only gaps are that output fields like basis and escalate_to are listed without explanation, and default_tol/general semantics are not fully spelled out. Overall, still highly complete for the tool's complexity.

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 chain, handle, the handle-related parameters (axis, default_tol, general), and the full process enum. However, axis, default_tol, and general are only listed, not individually defined, leaving some reliance on the reader's familiarity with tolerance_stackup.

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 opens with a specific verb and resource: 'Price a tolerance scheme against the process that has to hold it.' It explicitly positions itself relative to tolerance_stackup and cost_estimate, making it immediately clear what this tool adds and how it differs from those 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?

The description provides clear context by naming tolerance_stackup ('what tolerance works') and cost_estimate ('what does it cost') and calling this tool the 'missing link' between them. It also explains the chain-as-alternative-to-handle input modes. It does not give explicit when-not-to-use conditions, but the positioning is strong enough for an agent to route correctly.

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

tolerance_stackupTolerance StackupA
Read-only

Stack a dimension chain. Each chain entry is {name, nominal, plus, minus} with plus/minus the signed upper/lower deviations (plus>=minus; symmetric shorthand {nominal, tol}); add direction:-1 for a subtractive/gap link. method: worstcase | rss | montecarlo (each adds a deeper block). Half-bands are read as 3-sigma; cpk/pct_in_spec use spec_min/spec_max if given, else the worst-case bounds. Returns {nominal, worstcase:{min,max,spread}, rss:{sigma,min_3s,max_3s}, montecarlo:{mean,std,cpk,pct_in_spec,spec}}.

Instead of a hand-built chain, pass a live handle (+ axis, '+z'/'-x'/… or [x,y,z]) and the chain is derived off the solid: planar step faces perpendicular to the axis become consecutive station-to-station links (the stack a height gauge reads off a stepped part). Per-link tolerance: default_tol (± mm), else the ISO 2768-1 general class ('f'|'m'|'c'|'v', default 'm' — the drawing-note default for untoleranced dimensions). The result then echoes the derived chain (+ axis, n_step_faces).

seed fixes the montecarlo draw (12345 default) so the same chain returns the same cpk/pct_in_spec run to run — that determinism is a contract, so change it only to check a result is not an artefact of one draw.

ParametersJSON Schema
NameRequiredDescriptionDefault
axisNo+z
seedNo
chainNo
handleNo
methodNoworstcase
generalNom
samplesNo
spec_maxNo
spec_minNo
default_tolNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description adds meaningful behavioral context: the deterministic seed contract, the 3-sigma interpretation of half-bands, the derivation of chain from planar step faces, and the return structure. It doesn't contradict annotations. It could mention side effects or performance, but for a read-only analysis tool this is solid.

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 well-organized: chain mode first, then handle mode, then seed contract. Every sentence adds information. It's longer than ideal but the complexity of the tool (10 params, two modes, three methods) justifies the length. The return structure is compactly listed.

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 10-parameter tool with no output schema, the description covers the return object, the two input modes, the method options, the tolerance interpretation, and the determinism contract. It doesn't explicitly define samples or explain the montecarlo block in depth, but the overall picture is complete enough for an agent to call it correctly.

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 carries the full burden. It explains chain entry structure ({name, nominal, plus, minus}), direction:-1, method values, general class values, seed determinism, and spec_min/spec_max fallback. It doesn't explicitly explain samples or default_tol in full detail, but default_tol is mentioned and samples is inferable. This is strong compensation for zero schema coverage.

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 opens with a specific verb and resource ('Stack a dimension chain') and immediately distinguishes the two input modes (hand-built chain vs. live handle). It clearly differentiates from siblings like tolerance_cost_check and cnc_machinability_check by focusing on stackup analysis. The scope 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 Guidelines5/5

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

The description explicitly explains when to use a hand-built chain versus a live handle, and how the handle mode derives the chain from a solid. It also explains when spec_min/spec_max are used versus worst-case bounds, and when to change the seed. This is strong usage guidance.

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

topology_optimize_submitTopology Optimize SubmitA

Minimum-compliance topology optimization (in-house SIMP; NO external solver), asynchronous because each iteration solves an FE system. Optimizes a 2-D rectangular design domain (nelx×nely unit cells) — or, when nelz is set, a 3-D nelx×nely×nelz grid of trilinear hexahedra — to the stiffest layout that holds Σdensity = keep_fraction (the Optimality-Criteria update holds it exactly); penal is the SIMP penalty (≈3), rmin the cone filter radius. Default BCs (both): the whole left face clamped + a unit downward load at the right-face centre. 2-D overrides: fixed_dofs / load=[dof_index, value]. 3-D overrides: loads=[[i,j,k,axis,value],...] point loads at node grid coords (axis 'x'|'y'|'z'), fixed_nodes=[[i,j,k],...] clamped nodes, and keep_out/keep_in lists of half-open element-index boxes [i0,i1,j0,j1,k0,k1] forced void / forced solid (keep-out regions and must-keep pads).

Returns immediately {job_id, status, cache_hit}; poll job_result for {density (2-D: nely×nelx grid; 3-D: nelz×nely×nelx voxel field, density[k][j][i] with j=0 at the bottom — this IS geometry), mass_fraction (==keep_fraction), compliance, compliance_initial, iterations, converged, gray_fraction, solver (3-D: which linear-solve backend ran)}. Threshold + voxel→solid back in the modeller with topology_to_solid, then gate with mass_properties (mass ≤ keep_fraction·original) and interference_check vs keep-outs.

ParametersJSON Schema
NameRequiredDescriptionDefault
tolNo
loadNo
nelxNo
nelyNo
nelzNo
rminNo
loadsNo
penalNo
keep_inNo
keep_outNo
max_iterNo
fixed_dofsNo
fixed_nodesNo
keep_fractionNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only carry readOnlyHint/openWorldHint/destructiveHint; the description carries the real behavioral burden and does so thoroughly. It discloses asynchronous execution, immediate return of {job_id, status, cache_hit}, exact density/mass_fraction semantics, output axis ordering, default boundary conditions, and 2-D/3-D override formats. No contradictions with annotations.

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 most critical facts (solver, async nature, objective). It is long, but every sentence adds value and parameter formats are compactly specified. A bit more structure or bullet separation would improve readability, yet nothing 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?

For a 14-parameter tool with no output schema and no schema property descriptions, the description is remarkably complete. It covers the submission result, required polling, result field meanings and axis conventions, exact constraint behavior, default boundary conditions, per-dimension overrides, and downstream verification steps. Nothing essential is missing for correct invocation.

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 the meaning and format of most parameters: nelx/nely/nelz grid, keep_fraction, penal, rmin, load as [dof_index, value], loads as [[i,j,k,axis,value]], fixed_dofs, fixed_nodes, and keep_out/keep_in half-open boxes. The only gaps are that tol and max_iter are not explicitly described, but defaults and context make them inferable.

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 names a specific verb and resource: 'Minimum-compliance topology optimization (in-house SIMP; NO external solver)' and clearly explains the asynchronous submit/poll pattern. It distinguishes itself from siblings such as topology_to_solid (the downstream post-processing step) and optimize_submit, optics_lens_optimize, etc.

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 description provides clear usage context: it is asynchronous, returns immediately, and must be polled via job_result, with a follow-on workflow of topology_to_solid, mass_properties, and interference_check. It does not explicitly contrast itself against alternative optimization tools, but the 'in-house SIMP; NO external solver' scope and 2-D/3-D domain make the intended use clear.

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

topology_to_solidTopology to SolidA

Reconstruct a FreeCAD solid from a topology-optimization density field — the modeller-side close of the loop opened by topology_optimize_submit, whose density this consumes. 2-D (nely×nelx grid): thresholds (a cell is solid when density ≥ threshold), run-length-merges each row into solid spans, tiles each span as a cell_mm box extruded thickness_mm in Z (row 0 at the top). 3-D (a nelz×nely×nelx voxel field from the nelz mode): greedy-merges solid voxels into maximal boxes at (i·cx, j·cy, k·cz) — j=0 at the bottom, thickness_mm ignored. Fuses into one static Part::Feature. cell_mm is a scalar or [cx, cy(, cz)] mm; thickness_mm defaults to the smaller cell edge; placement is an optional [x, y, z] mm origin offset; name names the object. Runs synchronously (it builds geometry — no jobs.py poll).

Returns {handle, name, volume (mm³), solid_cells, total_cells, mass_fraction (== solid_cells/total_cells — must be ≤ keep_fraction within one cell), n_solids (disjoint bodies; >1 means a split load path), threshold, nelx, nely, nelz (None for 2-D), bbox_mm}. Gate it with mass_properties (mass ≤ keep_fraction·original) and interference_check against keep-out regions, per SIMULATION_EXAMPLES §5.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
cell_mmNo
densityYes
placementNo
thresholdNo
thickness_mmNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations carry only generic false flags, so the description bears the full disclosure burden. It reveals synchronous execution, geometry construction, the exact 2-D and 3-D merging algorithms, defaulting behavior for thickness_mm, and fusion into a single static Part::Feature, which is far beyond what annotations provide.

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 long but every sentence earns its place: the first sentence front-loads purpose and upstream dependency, and subsequent sentences pack algorithm, parameter, and return-value details without filler. The structure is appropriately dense for a complex 3-D reconstruction tool.

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?

Given the high algorithmic complexity, lack of an output schema, and minimal annotations, the description is complete. It documents both 2-D and 3-D behaviors, all parameter meanings, the full return object with units and semantic constraints, and downstream validation gates.

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?

With 0% schema coverage, the description compensates strongly by explaining density's grid shape, threshold semantics, placement as an origin offset, thickness_mm defaulting, and name. However, it says cell_mm is 'a scalar or [cx, cy(, cz)] mm' while the input schema declares cell_mm as a plain number, a direct contradiction that could mislead an agent.

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 opens with a specific verb and resource: 'Reconstruct a FreeCAD solid from a topology-optimization density field.' It names the upstream sibling topology_optimize_submit and identifies itself as the modeller-side close of that loop, making it easy for an agent to distinguish from optimization, meshing, and other geometry tools.

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 provides clear usage context: consume the density produced by topology_optimize_submit, run synchronously with no jobs.py poll, and gate the result with mass_properties and interference_check per SIMULATION_EXAMPLES §5. It does not explicitly list alternatives or when-not-to-use conditions, but the workflow direction is explicit enough.

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

transaction_abortTransaction AbortA
Destructive

Roll back the most recent open transaction. Implementation note: FreeCAD 1.1 headless abortTransaction is unreliable, so the worker commits then undoes — net effect is a clean rollback.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and readOnlyHint=false; the description adds a valuable non-obvious implementation trait: the worker commits then undoes because native abortTransaction is unreliable in FreeCAD 1.1 headless. This goes beyond the schema/annotations and sets accurate expectations for the net effect.

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?

Two short sentences: the first states the operation, the second provides a necessary implementation caveat. No filler or repetition; information is front-loaded.

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 parameterless tool with annotations already covering safety, the description is nearly complete. It could add what happens if no open transaction exists or what the return/error behavior is, but the core behavior and caveat are present.

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?

The tool has zero parameters, so the schema leaves nothing undocumented. The description does not need to explain parameter meaning; the baseline of 4 applies.

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 ('Roll back') and resource ('the most recent open transaction'), clearly distinguishing it from sibling transaction_open and transaction_commit. No ambiguity about what operation is performed.

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 description implies the tool is used when the agent wants to undo the most recent open transaction, but it does not explicitly state when to choose abort over commit or mention prerequisites/exclusions. The implementation note gives extra context but not explicit routing guidance.

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

transaction_commitTransaction CommitA

Commit the most recent open transaction; changes are kept.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish that the tool is not read-only and not destructive. The description adds useful behavioral context beyond those annotations: it targets the most recent open transaction and explicitly notes that changes are kept. It does not elaborate on irreversibility or post-commit transaction state, but 'commit' and the annotation coverage make this a reasonably transparent definition.

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?

One concise sentence with no filler. The action and effect are front-loaded, making it easy for an agent to parse quickly.

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-parameter tool with no output schema and the relevant safety annotations, the description provides the essential semantics: commit the most recent open transaction and keep changes. It does not explicitly connect to the transaction_open/transaction_abort workflow or describe the no-open-transaction case, but this is a minor gap for such a simple tool.

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?

The tool has zero parameters and the schema is empty, so there is no parameter meaning for the description to add. With 0 params, the baseline is 4, and the description fully covers the calling surface.

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 action, resource, and outcome: 'Commit the most recent open transaction; changes are kept.' This clearly differentiates it from its transaction sibling transaction_abort by emphasizing that changes persist.

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 description implies the correct use case: there must be an open transaction and the caller wants to keep its changes. It does not explicitly mention alternatives such as transaction_abort or conditions for when not to commit, so usage guidance 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.

transaction_openTransaction OpenA

Begin an undoable transaction on the active document. Pair with transaction_commit (keep the changes) or transaction_abort (roll back). Transactions nest — the most-recent open is committed/aborted first.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoTransaction

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false, so the description adds value by explaining the undoable nature, the pairing semantics, and the nesting behavior (most-recent open is committed/aborted first). It does not contradict annotations. It could add more about what happens to the active document if no transaction is open, but the core behavioral traits are well disclosed.

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?

Three sentences with no waste. The core action is front-loaded, the pairing is stated immediately, and the nesting rule is a single clarifying sentence. Every sentence earns its place.

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 simple tool with one optional parameter and no output schema, the description covers the essential usage: what it does, how to pair it, and nesting behavior. It doesn't mention error cases (e.g., calling without an active document) or whether the label appears in UI, but these are minor for a transaction opener. The sibling list is huge, but the description names the two relevant siblings directly.

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. The description does not explicitly explain the 'label' parameter, but the parameter has a default and is optional. The description's focus on transaction semantics is more important than the label. A 4 is appropriate because the description adds meaningful context about the transaction lifecycle, though it doesn't detail the label's purpose.

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 clearly states the verb ('Begin'), the resource ('an undoable transaction on the active document'), and the pairing with transaction_commit/transaction_abort. It distinguishes itself from siblings by naming the exact counterpart tools and their effects.

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 explicitly says when to use this tool (to begin an undoable transaction) and names the alternatives/companions: transaction_commit to keep changes, transaction_abort to roll back. It also explains nesting behavior, which guides correct usage order.

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

transformTransformA
Destructive

Move and/or rotate an existing object in place — first-class replacement for hand-poking an object's Placement via set_property.

handle: object to move (any object with a Placement: primitive, body, feature). translate: [x, y, z] translation in mm (default no translation). rotate_axis: rotation axis as a 3-vector [x, y, z] (need not be unit length; default [0, 0, 1], the Z axis). angle: rotation about rotate_axis in DEGREES (default 0 = no rotation). relative: True (default) composes this move ONTO the object's current placement (incremental); False sets it as the ABSOLUTE placement, discarding the object's prior placement.

The same object is moved — NO new handle is created. The rotation is applied about the object's local origin (combine with translate to pivot elsewhere).

Returns {handle, name, placement: {base:[x,y,z] mm, axis:[x,y,z], angle_deg}} describing the object's resulting placement.

ParametersJSON Schema
NameRequiredDescriptionDefault
angleNo
handleYes
relativeNo
translateNo
rotate_axisNo

TDQS

A5/5.0
Behavior5/5

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

Annotations declare destructiveHint=true, and the description reinforces this by stating 'The same object is moved — NO new handle is created' and 'discarding the object's prior placement' for absolute mode. It also discloses the rotation pivot behavior ('about the object's local origin') and the return value shape. This goes well beyond the annotations.

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 compact and front-loaded with the core purpose, then parameter details, then behavioral caveats, then return value. Every sentence adds information; there is no filler or repetition of schema fields.

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 5-parameter mutation tool with no output schema, the description is complete: it covers all parameters, defaults, units, the destructive nature, the pivot behavior, and the return value. An agent can invoke this tool correctly without needing additional context.

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%, so the description carries the full burden. It explains every parameter: handle, translate, rotate_axis, angle, and relative, including units (mm, degrees), defaults, and the meaning of relative=True/False. It also clarifies that rotate_axis need not be unit length, which is not in the schema.

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 verb ('Move and/or rotate') and resource ('an existing object in place'), and explicitly distinguishes itself from the alternative 'hand-poking an object's Placement via set_property.' It clearly identifies the tool's scope and differentiates it from siblings like set_property and scale_shape.

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 explicitly says this is a 'first-class replacement for hand-poking an object's Placement via set_property,' giving a clear when-to-use signal. It also explains the relative vs absolute behavior, which tells the agent when to use relative=True versus False. The sibling list includes set_property, and the description directly contrasts with it.

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

use_workspaceUse WorkspaceA

Claim (creating if needed) an isolated workspace and make it the target of subsequent tool calls. Each workspace is its own freecadcmd process with its own ActiveDocument and handle registry — handles do NOT cross workspaces. This is how concurrent agents share one MCP server without clobbering each other's documents: each agent calls use_workspace with a unique name once, up front.

The pool is capped (ANKUSDRIVE_MAX_WORKSPACES, default 4) and idle workspaces are reaped (ANKUSDRIVE_WORKSPACE_IDLE_S, default 900s); claiming a workspace beyond a full pool raises — close an idle one first. Pass "default" to return to the baseline single-agent workspace. Returns {workspace: , freecad: [...], workspaces: [names]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=false), the description reveals significant behaviors: per-workspace freecadcmd process, independent ActiveDocument and handle registry, handles not crossing workspaces, pool cap, idle reaping with env vars, raising on a full pool, and the 'default' behavior. This is substantial added context.

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 the core purpose and each subsequent sentence adds necessary operational detail (isolation, pooling, reaping, default, return shape). No filler is present.

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 tool with no output schema, it covers how to call it, when, what constraints apply (unique name, pool cap), error behavior, and the exact return shape. An agent has enough to invoke it 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?

The schema provides no description for the required 'name' (0% coverage), but the description supplies its meaning: a unique identifier per agent, used once up front, with 'default' as a special value to return to the baseline workspace.

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 names a concrete action ('Claim... an isolated workspace') and a clear effect ('make it the target of subsequent tool calls'). It also distinguishes this from sibling tools like list_workspaces and close_workspace by framing it as the claim/switch operation.

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 when to call it: once, up front, by each concurrent agent sharing the server, and says to pass 'default' for the baseline workspace. It does not explicitly contrast with list_workspaces/close_workspace or state when not to use it, so it stops 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.

validate_manifestValidate ManifestA
Read-only

Validate a manifest WITHOUT building it (the cheap front door, RFC §11.7). Structural + cross-reference checks a JSON shape can't enforce: every component has exactly one of file/manifest/library; a library carries a tool; every instance references a known component; every mate/check references a known instance; a present schema is the known version ("ankusdrive.manifest/1").

manifest: path to the manifest JSON.

Returns {ok, problems, schema, manifest_hash} — ok is True iff problems is empty; manifest_hash fingerprints the contract content (what the lockfile records so a stale contract is detectable). Run this before merge_assembly to reject a malformed contract before any geometry is built.

ParametersJSON Schema
NameRequiredDescriptionDefault
manifestYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark this as read-only, and the description adds significant detail: the exact structural and cross-reference invariants checked, the return shape, and the meaning of manifest_hash for stale-contract detection. No side effects are implied, consistent with readOnlyHint.

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 the non-building/cheap distinction, followed by a dense but useful list of validation rules, return semantics, and a sequencing instruction. Every sentence earns its place; there is no padding.

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 no output schema, the description compensates by defining the return tuple, the ok-invariant, and the hash behavior. Combined with the parameter meaning and the before-merge_assembly usage note, an agent has everything needed to invoke and interpret the call correctly.

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?

The schema only says manifest is a string with no description coverage, so the description must compensate. The line 'path to the manifest JSON' provides the operative meaning beyond the schema type, which is sufficient for a single required 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 verb ('Validate'), a specific resource ('manifest'), and the key scope distinction: without building it. It positions itself as the 'cheap front door' and cites RFC §11.7, clearly separating it from heavier build or merge operations.

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 says to run this before merge_assembly, giving a concrete trigger condition. It frames the tool as the cheap validation front door versus building, though it does not explicitly enumerate alternative validators or when not to use them.

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

verify_contractVerify ContractA
Read-only

Build-time self-check of a component against its manifest slice (RFC §11.3): a builder calls this on its OWN part before save, so a contract violation is caught locally and cheaply instead of after a fan-in merge (build → merge → gate-fail → rebuild becomes build → self-check → fix). Never raises on a failing check (a failure is a passed=False row), so it is safe to call in a loop. Inspection only; mutates nothing.

handle: the component's shaped object. contract: the component's slice — all keys optional, give at least one: envelope {min:[x,y,z], max:[x,y,z]} the part's LOCAL bbox must fit in it. interfaces {name: {origin:[x,y,z], z_axis?:[x,y,z], tol_mm?, angle_tol_deg?}} each named frame must be PUBLISHED (publish_interface) and within tolerance of the contracted origin (and axis, if z_axis given) — catches "forgot to publish" / "published in the wrong place". features [ {kind, ...} ] per-feature self-checks: {kind:"gear", module_mm, teeth, internal?, tol_mm?} {kind:"bore", diameter_mm, tol_mm?} {kind:"extent", axis:"x"|"y"|"z", length_mm, tol_mm?} intent bool also run verify_intent.

Returns {handle, ok, results:[{check, passed, detail}]} — ok True iff every check passed; check names are envelope / interface: / feature: / intent.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes
contractYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description explains that the tool mutates nothing, never raises on failing checks, and returns failure rows instead. It also describes the return shape and the workflow benefit (local catch vs post-merge failure), which is exactly the kind of behavioral context annotations alone cannot provide.

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 dense but efficiently organized: purpose first, then usage guidance, then parameter details, then return value. Every sentence adds information, and the structured layout makes the long content scannable. It is long because the tool is complex, not because of redundancy.

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?

Given the complex nested parameterstons and sparse schema, the description covers everything an agent needs: when to call it, what each contract key means, how failures are represented, and what is returned. The absence of an output schema is compensated by the explicit return shape documentation.

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?

With 0% schema description coverage, the description carries the full burden for parameter meaning. It thoroughly explains 'handle' and each contract slice ('envelope', 'interfaces', 'features', 'intent'), including nested structure, optional fields, tolerance semantics, and examples. This is far more than the schema provides.

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 clearly identifies a specific verb and resource: a build-time self-check of a component against its manifest slice. It also distinguishes this tool from the later merge/gate workflow, making its scope explicit. The contrast between local self-check and post-merge failure is a strong differentiation signal.

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 description gives explicit context: a builder calls this on their own part before save, and it is safe to call in a loop because failures return passed=False rather than raising. It does not explicitly name alternative tools or when not to use this one, but the 'before save / own part' guidance is clear enough for an agent to route correctly.

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

verify_featureVerify FeatureA
Read-only

Compare a feature's actual volume change against an expected signed delta. Run after each subtractive/additive operation to catch silent failures — Pocket on a curved surface that under-cut, Hole that drilled outside the body, Cut whose Tool didn't intersect the Base.

handle: PartDesign feature (Pad/Pocket/Hole/Revolve/etc.) or Part::Cut. expected_delta_mm3: SIGNED expected change. Subtractive → negative, additive → positive. Wrong sign is its own useful error. tolerance: relative tolerance (default 0.05 = 5%). abs_tolerance: absolute mm³ fallback for tiny expected magnitudes (default 0.01). Pass if EITHER tolerance is satisfied.

Returns {passed, message, actual_delta_mm3, expected_delta_mm3, ratio, previous_volume_mm3, current_volume_mm3, handle, name}. Does NOT raise on mismatch — inspect passed to decide whether to abort.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes
toleranceNo
abs_toleranceNo
expected_delta_mm3Yes

TDQS

A4.8/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true and no destructive intent, and the description reinforces that it 'Does NOT raise on mismatch' and returns detailed result fields. This adds behavioral context beyond annotations: no exception behavior, signed-delta convention, dual-tolerance pass logic (EITHER tolerance satisfied), and a complete return payload. Slight deduction because it doesn't state whether it modifies model state (though readOnlyHint implies it doesn't) or whether it requires a recompute/update before running.

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 opening line states the purpose, the second line gives the usage trigger and examples, then parameter semantics are front-loaded before result behavior. Every sentence earns its place: no filler, and the signed-delta warning is placed inline with the parameter it modifies.

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 is absent, so the description correctly enumerates the full return object ({passed, message, actual_delta_mm3, expected_delta_mm3, ratio, previous_volume_mm3, current_volume_mm3, handle, name}) and tells the agent how to act on it (inspect passed to decide whether to abort). The sign convention, tolerance fallback, and failure examples cover all usage decisions. The tool is verification-only with no side effects, so nothing else is needed.

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% and the schema only has bare names/types, so the description carries the full burden. It explains handle as accepting both PartDesign features and Part::Cut, defines expected_delta_mm3 as SIGNED with sign semantics (subtractive negative, additive positive), explains tolerance as relative with default, and explains abs_tolerance as fallback for tiny magnitudes with EITHER/OR pass logic. This fully compensates for the 0% schema coverage.

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 verb ('Compare') and resource ('a feature's actual volume change against an expected signed delta'), and specifies exact failure modes (under-cut Pocket, Hole drilled outside body, Cut whose Tool didn't intersect Base). This clearly distinguishes it from verification siblings like verify_performance, verify_intent, verify_contract, and baseline_verify.

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 run: 'Run after each subtractive/additive operation to catch silent failures' and gives concrete example scenarios. It doesn't explicitly name an alternative tool, but the sibling list contains no other volume-delta verification tool; the recommended trigger context is sufficient. It also tells the agent to inspect `passed` rather than rely on exceptions, which is actionable guidance.

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

verify_intentVerify IntentA
Read-only

Re-run every invariant declared with declare_intent — the regression gate to run after each edit. Composes check_shape / check_airtight_path / face-role resolution; never raises on a failing invariant (a failure is a passed=False row), so it is safe to call in a loop. Inspection only; mutates nothing.

handle: the part (must have a declared intent contract).

Returns a dict: handle (str) ok (bool) True iff every declared invariant passed results (list) one {invariant, passed, detail} per declared invariant — invariant in {watertight, airtight_path, required_faces}, detail a human-readable summary of what was measured

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses that it never raises on failing invariants, returns failures as passed=False rows, and is safe for repeated calls. It also states it is inspection-only and composes lower-level checks, giving the agent accurate expectations for side effects and 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.

Conciseness5/5

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

The description is compact, front-loaded with purpose and usage, and each subsequent sentence adds either behavioral nuance or return-format detail. No filler or redundant restatement of the tool name.

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 read-only verification tool with no output schema, the description fully documents the return dict fields, invariant names, failure semantics, and prerequisite. An agent has enough information to call the tool correctly and interpret results.

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?

With schema description coverage at 0%, the description compensates by explaining that handle refers to the part and must have a declared intent contract. It ties the parameter directly to the tool's operation, though it could add a bit more detail about handle format or examples.

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 action ('Re-run every invariant declared with declare_intent') and a clear resource (declared invariants for a part). It differentiates the tool from related siblings by naming its composed checks (check_shape / check_airtight_path / face-role resolution) and its relationship to declare_intent.

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 frames the tool as the regression gate to run after each edit and notes that it is safe to call in a loop. It does not name alternative tools or give when-not-to-use exclusions, but the intended usage context is clear.

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

verify_performanceVerify PerformanceA
Destructive

Prove (or fail to prove) every requirement declared with declare_performance — the step that turns "a solver printed 0.29" into a claim with a band and a provenance.

A verdict has THREE states. pass and fail each require the measurement's whole uncertainty band to sit on one side of the limit; a band that straddles it is indeterminate, meaning "escalate", not "probably fine". A correlation reading Cd = 0.28 ± 10 % against a limit of 0.30 spans 0.252–0.308 and has NOT shown the part passes — collapsing that to a pass is how a spec silently goes unmet.

tier picks the evidence:

  • 'screen' — each requirement's cheap estimator only. Milliseconds, no solver.

  • 'solver' — the real solve for every requirement.

  • 'auto' (default) — screen first, escalate only what the screen could not decide or what declares fidelity_floor: 'solver'. This is the ladder that keeps a design loop cheap: cheap measurements eliminate candidates, solves confirm survivors.

Trust is part of the measurement, not a footnote: trust: {converged: true} or a band_max_pct cap makes an unconverged (or insufficiently mesh-converged) solve come back indeterminate with the reason, never pass.

Solver-tier measurements are asynchronous, so this returns EITHER the finished verdict (screen-only, or everything already decided) or {job_id, status, pending, results} — poll job_result for the completed verdict. Never raises on a failing requirement; a failure is a row.

Every verdict is also RECORDED on the part, stamped with a geometry signature of the shape it measured (#261). That record is what merge_assembly, substitutability_check and component_contract_check consult, since a gate has to answer synchronously and this may not have: an in-flight solve records rows the gates read as unverified, and editing the part invalidates the signature so they read stale — never a pass on either path.

Returns {handle, tier, ok, n_requirements, passed, failed, indeterminate, escalate, results: [{name, tier, metric, state, measured, limit, band_pct, worst_case, best_case, margin, margin_pct, detail, trust_reasons?, screen?, job_id?}]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
tierNoauto
handleYes

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint:false, destructiveHint:true), the description details three verdict states, the trust conditions, asynchronous job returns, and the recording side effect with geometry signature invalidation. It also states it never raises on failure. This adds substantial behavioral context essential for correct invocation.

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 long but well-structured, with a clear opening statement and organized sections for tier and behavior. It front-loads the purpose and uses bullet-like formatting. Some redundancy exists (e.g., re-explaining verdict states), but every sentence adds value for a complex tool.

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?

Given the tool's complexity, asynchronous behavior, lack of output schema, and side effects, the description covers all necessary aspects: return format, recording behavior, invalidation, and how gates read the records. It leaves no critical gaps for an agent to invoke it 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?

The schema documents only tier and handle with no descriptions (0% coverage). The description explains the tier values and their semantics ('screen', 'solver', 'auto') and provides context for handle as a part identifier, but it does not explicitly define what handle refers to or its format. The tier explanation compensates partially, but the required handle parameter is left vague.

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 verb 'Prove or fail to prove' with a clear resource: every requirement declared with declare_performance. It distinguishes its role from declare_performance and from other verify tools like verify_intent or verify_contract, making its scope explicit.

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 explains the tier ladder and when screen vs solver is used, and mentions the asynchronous path for solver-tier, but it does not explicitly state 'use this when you have declared performance requirements' or name alternatives to avoid. However, the context is clear that this is the verification step for performance declarations.

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

versionVersionA
Read-only

Return FreeCAD and bundled Python versions from the worker.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, covering the safety profile. The description adds value by specifying what versions are returned (FreeCAD and bundled Python) and the source ('worker'), which is not in the annotations. No contradictions; the description is consistent with the read-only hint.

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 a single, front-loaded sentence with zero filler. Every word contributes: it names the verb, the resources, and the source. No redundancy or unnecessary detail.

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-parameter, read-only tool with no output schema, the description is complete. It tells the agent exactly what it will get (versions of FreeCAD and bundled Python). It does not specify the return format (e.g., string vs. structured object), but that is a minor gap for such a simple tool. The annotations cover safety, so nothing critical 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?

The tool has zero parameters, so there is nothing to explain beyond what the schema shows (an empty object). Baseline for 0 params is 4; the description does not need to add parameter details. It correctly omits any parameter info.

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 verb ('Return'), a specific resource ('FreeCAD and bundled Python versions'), and the source ('from the worker'). This clearly distinguishes it from sibling tools like ping or restart_worker, which serve different purposes. No ambiguity.

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 tool is trivial with no parameters, and there are no obvious alternative tools for retrieving version information. The description implicitly communicates when to use it (when versions are needed), and no exclusions are necessary. However, it does not explicitly state 'use this when you need to check versions,' but that is self-evident.

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

waveguide_cutoffWaveguide CutoffA
Read-only

Exact rectangular-waveguide cutoff frequency (NO solver) — the closed-form twin the openEMS FDTD full-wave solve (em_fullwave_submit) is gated against. Broad wall a_mm, narrow wall b_mm (default a/2, WR convention). mode is 'TE'/'TM'. f_c(m,n) = (c/2√εᵣ)·√((m/a)²+(n/b)²); dominant TE10 reduces to the EXACT f_c = c/(2a√εᵣ). Below f_c the guide is evanescent (axial β imaginary, nothing transmits), above it propagates with guided wavelength λ_g = 2π/β. With a probe freq_ghz the regime (propagating / evanescent), k, β, λ_g and (below cutoff) the exact attenuation α = √(k_c²−k²) are returned — α is what the FDTD solve's field probes are gated against (alpha_ratio).

Returns {mode, m, n, a_mm, b_mm, eps_r, cutoff_hz, cutoff_ghz, kc_per_m, next_mode_cutoff_ghz, single_mode_band_ghz, probe_freq_ghz, regime, k_per_m, beta_per_m, alpha_per_m, guided_wavelength_mm, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.

ParametersJSON Schema
NameRequiredDescriptionDefault
a_mmYes
b_mmNo
modeNoTE10
eps_rNo
freq_ghzNo

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, it discloses no-solver nature, the exact formula, evanescent vs. propagating behavior, and that below cutoff it returns attenuation α = √(k_c²−k²) as the gate signal for FDTD field probes. This is substantial behavioral context that annotations alone do not provide.

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 definition is dense but front-loaded with the core purpose and formula, then adds parameter semantics, physics, and output meaning. Given zero schema descriptions and no output schema, the length is earned; there is no filler or repetition.

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?

It covers the core call path, parameters, formula, regimes, and relationships to FDTD probes, and enumerates the full return set. A few return fields such as fidelity, band_pct, and escalate_to are listed but left to name-based inference, so with no output schema the completeness is not perfect.

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?

With schema description coverage at 0%, the description compensates fully: a_mm is broad wall, b_mm is narrow wall defaulting to a/2, mode format is TE<m><n>/TM<m><n>, eps_r appears in the formula, and freq_ghz is the probe that triggers regime/attenuation outputs. All five parameters get meaning beyond their raw names.

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 opening sentence names the exact quantity (rectangular-waveguide cutoff frequency), explicitly marks it as closed-form/no-solver, and ties it to the sibling em_fullwave_submit as the reference it is gated against. This immediately distinguishes it from the full-wave solver and the many other analysis tools.

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 explicitly contrasts with 'the openEMS FDTD full-wave solve (`em_fullwave_submit`)' and states the solver is gated against this closed-form result. It also defines when the optional probe applies (returning regime and attenuation vs. FDTD probes), giving an agent clear selection and invocation context.

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

wear_estimateWear EstimateA
Read-only

Estimate sliding wear (Archard): V = k·F·s/H. k (wear_coef) is empirical — pass it, or it's looked up by the material_pair's category pair (order-of- magnitude). H (hardness_mpa) defaults to Tabor 3·σ_y of the softer member. With apparent_area_mm2 a mean depth is reported and gated by max_depth_mm. Returns {wear_coef, hardness_mpa, volume_loss_mm3, depth_loss_mm, coef_basis, hardness_basis, pass}.

ParametersJSON Schema
NameRequiredDescriptionDefault
load_nYes
wear_coefNo
hardness_mpaNo
max_depth_mmNo
material_pairNo
sliding_dist_mYes
apparent_area_mm2No

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already indicate read-only behavior (readOnlyHint=true), so the bar is lower. The description goes far beyond by explaining the Archard formula, how k is derived (empirical or from material_pair), the Tabor hardness default, the gating by max_depth_mm, and the exact return structure. This gives an agent a full picture of the computation and its effects.

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 dense paragraph that packs the formula, defaults, gating condition, and return object into a few sentences. It is front-loaded with the core purpose and efficiently conveys the necessary technical details without unnecessary fluff.

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 an engineering calculation tool with no output schema and zero parameter descriptions, this description is remarkably complete. It covers the governing equation, parameter semantics, default behavior, output fields, and the pass/fail gating. An agent has everything needed to call the tool correctly and interpret results.

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 the roles of wear_coef, hardness_mpa, material_pair, apparent_area_mm2, and max_depth_mm, and implicitly covers load_n and sliding_dist_m via the formula (F and s). It does not explicitly name every parameter, but it provides sufficient semantic context for all required and optional inputs.

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 clearly states the tool estimates sliding wear using the Archard equation, including the formula and the specific outputs. It is unambiguous and distinguishes itself from sibling tools like cost_estimate or bearing_life by being specifically about wear.

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 description implies usage (estimating sliding wear) and explains the calculation mechanics, but it does not explicitly state when to prefer this tool over alternatives or mention any exclusions. There is no guidance on when not to use it or which sibling might be more appropriate.

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

weld_groupWeld GroupA
Read-only

Rate a planar fillet-weld group by Blodgett's treat-weld-as-a-line method. segments=[((x1,y1),(x2,y2)),...] (mm); an in-plane force_n=[Fx,Fy] at load_point_mm=[px,py] gives direct shear f=F/L plus torsional f=Tr/J from the eccentric moment about the weld centroid, added vectorially at the worst end. required_leg = f_r/(0.707allowable); given leg_mm, throat stress f_r/(0.707*leg) is checked vs allowable. Returns {weld_length_mm, centroid_mm, Ix_mm3, Iy_mm3, J_mm3, direct_shear_n_per_mm, max_shear_n_per_mm, worst_point_mm, required_leg_mm, throat_stress_mpa?, shear_sf?, pass}. weld_type ('fillet' default) labels the group and selects the throat convention.

ParametersJSON Schema
NameRequiredDescriptionDefault
leg_mmNo
force_nYes
segmentsYes
weld_typeNofillet
load_point_mmYes
allowable_shear_mpaNo

TDQS

A4.2/5.0
Behavior4/5

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

The annotations already mark readOnlyHint=true and openWorldHint=false, establishing a non-destructive calculation. The description adds substantial behavioral context: it details the calculation approach (direct shear plus torsional shear from eccentric load), the formulas used, and the exact output fields. It does not contradict annotations and provides useful technical detail beyond 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?

The description is a dense paragraph but well-organized, leading with the purpose, then parameter meanings, then formulas, then outputs. Every sentence carries technical value, though it could be improved by breaking into bullet points for readability. It is not excessive and stays focused.

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?

Given the tool's complexity and lack of an output schema, the description lists all return fields with units and explains the underlying method. It covers all parameters and the main computation path. Minor omissions are error cases or limits of applicability, but for a pure calculation tool the information is adequate.

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?

With 0% schema description coverage, the description fully compensates by explaining each parameter: segments as list of line segments in mm, force_n as [Fx,Fy], load_point_mm as [px,py], leg_mm as an optional given leg, allowable_shear_mpa as the allowable stress, and weld_type as 'fillet' default. It also clarifies the behavior when leg_mm is null (compute required leg) versus provided (check throat stress). This adds significant meaning beyond the raw schema.

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 verb ('Rate') and resource ('planar fillet-weld group') plus the precise method (Blodgett's treat-weld-as-a-line). It clearly distinguishes this from the many other analysis tools in the sibling list, which cover other domains (CFD, FEM, optics, etc.).

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 description implies usage for planar fillet-weld analysis, but it does not explicitly state when to use this tool versus alternatives or when not to use it. There are many other mechanical analysis tools in the sibling list, yet no exclusions or cross-references are provided, leaving the agent to infer applicability from the method name.

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

where_usedWhere UsedA
Read-only

Where-used / impact analysis (issue #142, C3; MULTI_AGENT.md §9): traverse the lockfile depends_on graph and report every parent that CONSUMES an item — the blast radius, so exactly those parents re-dispatch when the item changes. The lockfile records edges consumer -> consumed (lid depends_on housing); where-used is the reverse reachability of the item (everything that reaches it).

lockfile: path to the lockfile (the JSON assembly_lock wrote). item: the item / component id to query. direct: if true, also surface only the immediate mates separately.

Returns {item, where_used (the full transitive blast radius), direct (the §9 immediate-neighbour layer)} — an unknown item fails loudly, never a silent empty set.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemYes
directNo
lockfileYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses the return contract ({item, where_used, direct}), the transitive-vs-immediate distinction, and the loud-failure behavior for unknown items: 'fails loudly, never a silent empty set.' It also explains exactly what 'where used' means in terms of graph reachability. No contradiction with annotations.

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 dense but every sentence carries operational content: purpose, graph convention, per-parameter semantics, and return/error behavior. Reference tags like issue #142 are minor noise, but the core explanation is front-loaded and well structured.

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 non-trivial graph traversal with no output schema and sparse input schema, the description supplies all needed calling context: what the lockfile is, what item means, what direct controls, what the result shape is, and how failures behave. An agent can select and invoke this tool correctly without additional lookup.

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 manually documents all three parameters: lockfile (the JSON assembly_lock wrote), item (component id to query), and direct (whether to surface immediate mates separately). This fully compensates for the bare schema and ties each parameter to the traversal semantics.

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 names a specific operation—traversing the lockfile depends_on graph to find every consuming parent—and frames it as reverse reachability and blast radius. The graph-orientation examples make the resource and direction unambiguous, distinguishing it from forward-dependency or general impact tools.

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 when-to-use context: this is for impact/blast-radius analysis before re-dispatch, and it explains that the lockfile stores consumer->consumed edges while this tool computes the reverse. It does not explicitly name alternatives or state when not to use it, 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.

Tool Schema Changelog

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

  1. 5 tool updatesv0.5.6
    • Addedbar_impact
    • Addedimpact_dynamics_submit
    • Addedjournal_export
    • Addedsession_transcript
    • Changedsetup_status1 field changed
      • addedInput schema / properties / verify_image
        Added value: +{
        +  "default": false,
        +  "title": "Verify Image",
        +  "type": "boolean"
        +}
  2. 11 tool updatesv0.5.5
    • Changedem_fullwave_submit4 fields changed
      • addedInput schema / properties / decay_f_ratio
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Decay F Ratio"
        +}
      • addedInput schema / properties / end_criteria
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "End Criteria"
        +}
      • addedInput schema / properties / mesh_f_ghz
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Mesh F Ghz"
        +}
      • addedInput schema / properties / mesh_res_mm
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Mesh Res Mm"
        +}
    • Changedfem_buckling_results5 fields changed
      • addedInput schema / properties / analysis / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / analysis / default
        Added value: +null
      • removedInput schema / properties / analysis / type
        Removed value: -"string"
      • addedInput schema / properties / job_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Job Id"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "analysis"
        -]
    • Changedfem_modal_results5 fields changed
      • addedInput schema / properties / analysis / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / analysis / default
        Added value: +null
      • removedInput schema / properties / analysis / type
        Removed value: -"string"
      • addedInput schema / properties / job_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Job Id"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "analysis"
        -]
    • Changedfem_result_probe5 fields changed
      • addedInput schema / properties / analysis / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / analysis / default
        Added value: +null
      • removedInput schema / properties / analysis / type
        Removed value: -"string"
      • addedInput schema / properties / job_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Job Id"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "analysis"
        -]
    • Changedfem_results5 fields changed
      • addedInput schema / properties / analysis / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / analysis / default
        Added value: +null
      • removedInput schema / properties / analysis / type
        Removed value: -"string"
      • addedInput schema / properties / job_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Job Id"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "analysis"
        -]
    • Addedfem_run_submit
    • Changedfem_thermal_results5 fields changed
      • addedInput schema / properties / analysis / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / analysis / default
        Added value: +null
      • removedInput schema / properties / analysis / type
        Removed value: -"string"
      • addedInput schema / properties / job_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Job Id"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "analysis"
        -]
    • Changedhole1 field changed
      • addedInput schema / properties / strict
        Added value: +{
        +  "default": false,
        +  "title": "Strict",
        +  "type": "boolean"
        +}
    • Changedpocket1 field changed
      • addedInput schema / properties / strict
        Added value: +{
        +  "default": false,
        +  "title": "Strict",
        +  "type": "boolean"
        +}
    • Changedrender_photoreal11 fields changed
      • addedInput schema / properties / appearances
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Appearances"
        +}
      • addedInput schema / properties / device
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Device"
        +}
      • addedInput schema / properties / handle / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / handle / default
        Added value: +null
      • removedInput schema / properties / handle / type
        Removed value: -"string"
      • addedInput schema / properties / output_dir
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Output Dir"
        +}
      • addedInput schema / properties / parts
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Parts"
        +}
      • addedInput schema / properties / quality
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Quality"
        +}
      • changedInput schema / properties / renderer / default
        Previous value: -"Povray"New value: +"auto"
      • addedInput schema / properties / scene
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Scene"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "handle"
        -]
    • Changedrender_photoreal_submit11 fields changed
      • addedInput schema / properties / appearances
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Appearances"
        +}
      • addedInput schema / properties / device
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Device"
        +}
      • addedInput schema / properties / handle / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / handle / default
        Added value: +null
      • removedInput schema / properties / handle / type
        Removed value: -"string"
      • addedInput schema / properties / output_dir
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Output Dir"
        +}
      • addedInput schema / properties / parts
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Parts"
        +}
      • addedInput schema / properties / quality
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Quality"
        +}
      • changedInput schema / properties / renderer / default
        Previous value: -"Povray"New value: +"auto"
      • addedInput schema / properties / scene
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Scene"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "handle"
        -]
  3. 281 tool updates
    • First observedacoustic_fem_submit
    • First observedacoustic_radiation_submit
    • First observedacoustic_screen
    • First observedadd_annotation
    • First observedadd_bearing
    • First observedadd_dimension
    • First observedadd_fastener
    • First observedadd_feature_note
    • First observedadd_gdt_callout
    • First observedadd_gear
    • First observedadd_part
    • First observedadd_primitive
    • First observedadd_projection_group
    • First observedadd_pulley
    • First observedadd_rack
    • First observedadd_rib
    • First observedadd_section_view
    • First observedadd_sketch_constraint
    • First observedadd_sketch_external
    • First observedadd_sketch_geometry
    • First observedadd_spring
    • First observedadd_sprocket
    • First observedadd_thread
    • First observedadd_thumbnail
    • First observedannotate_face
    • First observedassembly_lock
    • First observedassembly_lock_check
    • First observedasync_demo_submit
    • First observedballoon_drawing
    • First observedbaseline_create
    • First observedbaseline_verify
    • First observedbeam_buckling
    • First observedbeam_modal
    • First observedbearing_life
    • First observedbelt_drive
    • First observedbolted_joint_check
    • First observedbom_extract
    • First observedboolean_op
    • First observedbounding_box
    • First observedcatalog_check
    • First observedcatalog_nearest
    • First observedcatalog_search
    • First observedcfd_body_drag
    • First observedcfd_external_flow_submit
    • First observedcfd_internal_flow_submit
    • First observedcfd_mesh_independence_submit
    • First observedcfd_pipe_flow
    • First observedchain_drive
    • First observedchamfer_edges
    • First observedchange_impact
    • First observedcheck_airtight_path
    • First observedcheck_shape
    • First observedcht_channel_submit
    • First observedcht_graetz_submit
    • First observedclassify_face_sides
    • First observedclose_document
    • First observedclose_sketch
    • First observedclose_workspace
    • First observedcnc_machinability_check
    • First observedcnc_time_estimate
    • First observedcomponent_contract_check
    • First observedcontact_setup
    • First observedcopy_shape
    • First observedcost_estimate
    • First observedcreep_flag
    • First observeddeclare_intent
    • First observeddeclare_performance
    • First observeddem_flow_submit
    • First observeddem_pack_submit
    • First observeddesignation_check
    • First observeddfa_check
    • First observeddfm_check
    • First observeddipole_resonance
    • First observeddraft
    • First observeddrawing_gate
    • First observeddrawing_legibility
    • First observeddrop_impact
    • First observedeco_create
    • First observedeco_validate
    • First observedelastica_deflection
    • First observedem_conduction_submit
    • First observedem_dc_resistance
    • First observedem_field
    • First observedem_fullwave_submit
    • First observedem_induction_heating_submit
    • First observedem_induction_submit
    • First observedem_skin_depth
    • First observedengrave_text
    • First observedenvelope_check
    • First observedexport_drawing
    • First observedexport_shape
    • First observedfai_report
    • First observedfamily_materialize
    • First observedfamily_validate
    • First observedfatigue_check
    • First observedfeature_instantiate
    • First observedfeature_list
    • First observedfeature_schema
    • First observedfeature_validate
    • First observedfem_add_constraint
    • First observedfem_buckling
    • First observedfem_buckling_results
    • First observedfem_cantilever_demo
    • First observedfem_mesh
    • First observedfem_mesh_refinement
    • First observedfem_modal
    • First observedfem_modal_results
    • First observedfem_new_analysis
    • First observedfem_result_probe
    • First observedfem_results
    • First observedfem_run
    • First observedfem_set_material
    • First observedfem_set_nonlinear_material
    • First observedfem_set_solver
    • First observedfem_thermal_results
    • First observedfillet_edges
    • First observedfit_check
    • First observedfit_class
    • First observedfit_page
    • First observedfluid_props
    • First observedfracture_check
    • First observedfsi_channel_pressure
    • First observedfsi_interface_balance
    • First observedfsi_plate_deflection
    • First observedfsi_pressure_plate_submit
    • First observedgdt_check
    • First observedgear_rating
    • First observedget_interface
    • First observedget_object
    • First observedgranular_screen
    • First observedgrid_convergence
    • First observedh_estimate
    • First observedharmonic_response
    • First observedharmonic_response_submit
    • First observedhelix
    • First observedhertz_contact
    • First observedhole
    • First observedinspection_plan
    • First observedinterface_align_check
    • First observedinterference_check
    • First observeditems_check_manifest
    • First observeditems_new
    • First observeditems_resolve
    • First observeditems_validate
    • First observedjob_list
    • First observedjob_result
    • First observedjob_status
    • First observedlaminate_properties
    • First observedlifecycle_apply_change
    • First observedlifecycle_classify_change
    • First observedlifecycle_editable
    • First observedlifecycle_transition
    • First observedlinear_pattern
    • First observedlist_assembly_parts
    • First observedlist_documents
    • First observedlist_edges
    • First observedlist_face_roles
    • First observedlist_faces
    • First observedlist_objects
    • First observedlist_thread_options
    • First observedlist_workspaces
    • First observedloft
    • First observedmake_assembly
    • First observedmake_body
    • First observedmake_datum_plane
    • First observedmake_drawing_page
    • First observedmake_sketch
    • First observedmass_properties
    • First observedmaterial_get
    • First observedmaterial_list
    • First observedmaterial_select
    • First observedmeasure_angle
    • First observedmeasure_distance
    • First observedmechanism_kinematics
    • First observedmechanism_simulate_submit
    • First observedmerge_assembly
    • First observedmin_clearance
    • First observedmirrored
    • First observedmoldability_check
    • First observedmoldability_screen
    • First observedmolding_fill_submit
    • First observedmolding_screen
    • First observedmolding_warpage_submit
    • First observedmonopole_sphere
    • First observednew_document
    • First observedopen_document
    • First observedoptics_lens_design
    • First observedoptics_lens_optimize
    • First observedoptics_moldability_check
    • First observedoptics_raytrace
    • First observedoptics_solid_trace
    • First observedoptimize_submit
    • First observedoring_groove
    • First observedpack_check
    • First observedpad
    • First observedpartdesign_chamfer
    • First observedpartdesign_fillet
    • First observedping
    • First observedplastic_collapse
    • First observedplate_check
    • First observedpocket
    • First observedpolar_pattern
    • First observedpress_fit_stress
    • First observedproject_check_references
    • First observedproject_resolve_manifest
    • First observedproject_validate
    • First observedpublish_interface
    • First observedquery_faces
    • First observedrandom_vibration
    • First observedrecipe
    • First observedrecipe_list
    • First observedrecipe_schema
    • First observedrecipe_validate
    • First observedregister_handle
    • First observedrelease_package
    • First observedrender_capabilities
    • First observedrender_fem_results
    • First observedrender_job
    • First observedrender_photoreal
    • First observedrender_photoreal_submit
    • First observedrender_view
    • First observedrender_views
    • First observedresolve_edge
    • First observedresolve_face
    • First observedrestart_worker
    • First observedrevolve
    • First observedrigid_sphere_scattering
    • First observedrun_script
    • First observedsave_document
    • First observedscaffold_project
    • First observedscale_shape
    • First observedseal_check
    • First observedsection_view
    • First observedset_active_document
    • First observedset_property
    • First observedset_title_block
    • First observedset_visibility
    • First observedsetup_status
    • First observedsheet_base
    • First observedsheet_check
    • First observedsheet_flange
    • First observedsheet_flat_export
    • First observedsheet_hem
    • First observedsheet_refold
    • First observedsheet_tab
    • First observedsheet_unfold
    • First observedshell_solid
    • First observedslice_estimate
    • First observedslice_gcode_submit
    • First observedsolve_capabilities
    • First observedspring_check
    • First observedstandard_part_designate
    • First observedstudy_submit
    • First observedsubstitutability_check
    • First observedsuggest_loosening
    • First observedsweep
    • First observedthermal_composite_wall
    • First observedthermal_lumped
    • First observedthermal_radiation_submit
    • First observedthermal_transient_1d
    • First observedthermal_transient_submit
    • First observedthickness
    • First observedtolerance_cost_check
    • First observedtolerance_stackup
    • First observedtopology_optimize_submit
    • First observedtopology_to_solid
    • First observedtransaction_abort
    • First observedtransaction_commit
    • First observedtransaction_open
    • First observedtransform
    • First observeduse_workspace
    • First observedvalidate_manifest
    • First observedverify_contract
    • First observedverify_feature
    • First observedverify_intent
    • First observedverify_performance
    • First observedversion
    • First observedwaveguide_cutoff
    • First observedwear_estimate
    • First observedweld_group
    • First observedwhere_used

TDQS

A3.6/5.0

Scored across 286 tools

Disambiguation3/5

Descriptions are exceptionally detailed with cross-references, but at 286 tools genuine boundary-blurring pairs exist: moldability_screen/moldability_check/optics_moldability_check/dfm_check all screen moldability, measure_distance vs min_clearance overlap, and fillet_edges vs partdesign_fillet require reading deep into descriptions to disambiguate. A capable agent can navigate most pairs, but the sheer surface area makes misselection likely.

Naming Consistency4/5

The verb_noun pattern is upheld across well-organized prefix families (add_*, make_*, list_*, fem_*, cfd_*, em_*, sheet_*, *_submit, *_check), and the sync/async pairing via submit/job_status/job_result is exemplary. Deviations exist — bare PartDesign feature nouns (hole, pad, pocket) next to verb-prefixed tools, the confusing fit_check vs fit_class pair, and outliers like ping, version, and where_used — but the dominant convention is clear and predictable.

Tool Count1/5

286 tools is an extreme mismatch for an agent-facing MCP surface, far beyond even the 50+ threshold for the lowest score. The server attempts to cover CAD modeling, FEM, CFD, DEM, optics, acoustics, EM, thermal, sheet metal, drawings, PLM, and project management in one namespace, and the resulting context-window and tool-selection burden undermines every other coherence dimension.

Completeness4/5

Coverage within each family is remarkably complete: CRUD-like lifecycles exist for sketches, bodies, assemblies, drawings, items, recipes, features, and ECOs; every solver family pairs an analytic oracle with a *_submit solve and a gate. Minor gaps include no delete_object/remove_feature tool (only transaction_abort) and no STEP/IGES import to complement export_shape, but these are workable rather than blocking.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables LLMs to safely generate parametric CAD parts (STEP/STL) using verified templates and FreeCAD, with validation and assembly support.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to programmatically build, analyze, and export 3D CAD geometry using FreeCAD through REST or MCP tools.
    1
    MIT