ClassCAD
NPM · @CLASSCAD/MCP
Build and verify CAD parts and assemblies with the ClassCAD engine, locally, no server needed.
Available components
Last scanned (2 hours ago)
Scores higher than 58% of npm servers
Category Developer Tools
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security81
- No malware found by supply-chain analysis.Pass
- CVE check failed: a known high-severity CVE affects sharp 0.34.5, a direct dependency. A fixed version is available. View diagnostics → Fail
- No install/post-install scripts declared.Pass
- 30 of 126 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to awv-informatik/classcad-ai). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 15 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability58
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 10221 tokens (~486/item across 21 items; 21 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management55
- Stability check failed: the tool surface changed between 0.2.0 and 0.6.1: 3 tool removals, 12 breaking changes, 4 additions. See how to fix → Fail
Tool Coverage99
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 97% of tool parameters carry a description.Partial
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "run_script" implies "execute" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 22 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 30 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 48 to 52.
- 28 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 42 to 45.
- 26 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 35 to 38.
- 24 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 28 to 32.
- 22 Oct 26 0
- CVE-2026-114113 affects this package: high ▼ security
- CVE-2026-114111 affects this package: high ▼ security
- CVE-2026-114112 affects this package: high ▼ security
- GHSA-wq5f-xc86-pv6w no longer affects this package ▲ security
- GHSA-rgj7-g3m4-5g8c no longer affects this package ▲ security
- GHSA-f88m-g3jw-g9cj no longer affects this package ▲ security
- 21 Oct 26 +16
- Malware scan: unverified → pass ▲ security
- Package version: 0.4.1 → 0.6.1 functional
- 20 Oct 26 −19
- Malware scan: pass → unverified ▼ security
- Schema quality: 429 → 486 ▼ functional
- Package version: 0.5.4 → 0.6.1 functional
- Package version: 0.5.4 → 0.6.0 functional
- 18 Oct 26 +16
- Malware scan: unverified → pass ▲ security
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed npm/@classcad/mcp@0.6.1
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | awv-informatik/classcad-ai |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/awv-informatik/classcad-ai/.github/workflows/release.yml@refs/tags/mcp-v0.6.1 |
| Rekor log index | 3337710138 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:ebb6c4850f4bc30b09a3269fef4d7adc698bf9053424c4e9e4e40aa2d705139a1b8d9f7bb186d53a0071ba0b18c76659652bcbd29df64bb1326cccd43 |
Background: How many MCP packages publish verified provenance →
Vulnerabilities 3 findings
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-f88m-g3jw-g9cj | CVE-2026-114113 | high | yes | |
| GHSA-rgj7-g3m4-5g8c | CVE-2026-114112 | high | yes | |
| GHSA-wq5f-xc86-pv6w | CVE-2026-114111 | high | yes |
Background: What a vulnerability scan can and cannot prove →
Dependencies 126 packages
| Packages resolved | 126 |
|---|---|
| Stale | 30 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
account ClassCAD account and plan ~137
The signed-in classcad.ch account: its plan (and until when), whether it allows commercial use, which exports, and WHERE A WEB APP built with ClassCAD may run under it — localhost always (any port), public https domains only as registered on the account (from the plan that has them) — plus the public access token (ccpk_…) that goes into the app's page, or where to make one. Call it FIRST when the user wants their own app, website, configurator or deployment around a model; then follow docs(["recipes/buerli-app"]). Read-only: tokens and domains are made on the account page.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
checkpoint Checkpoint drawing ~200
Save the WHOLE drawing state under a label (in-memory, server-side — cheap and instant). Use BEFORE risky sequences (large booleans, trims, experiments): if the attempt goes wrong, restore({label}) brings the drawing back exactly instead of delete-archaeology. Re-using a label overwrites it; at most 5 checkpoints are kept (oldest dropped). Checkpoints die with the server process and with a use_session switch.
| Name | Type | Req | Description |
|---|---|---|---|
| drawing | string | yes | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
| label | string | – | Checkpoint name, e.g. "before-boolean". Default "checkpoint". |
No output schema declared.
No examples provided.
clear Clear drawing ~189
Empty the drawing (v1.common.clear), to start over in it: a drawing persists between requests, part.create refuses a second root, and anything built on the old part would carry its geometry along. For a new, unrelated model next to this one, open a new drawing instead (drawing: "new"). Not needed for changes to the current model. The graphic and renders are empty afterwards too — no reconnect needed.
| Name | Type | Req | Description |
|---|---|---|---|
| drawing | string | yes | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
| keepIds | array | – | Object IDs to preserve. Omit to wipe everything. |
No output schema declared.
No examples provided.
describe_method Describe API method ~147
Full documentation for ONE key — prefer docs([...]) to fetch everything you need in a single round; use this only for a single follow-up lookup. Accepts full ("v1.part.box") or bare ("box") names — ambiguous bare names list the candidates. Also serves whole documents ("DATA", "api/part", "recipes/parametric-part"). Same size cap and paging as docs: a large document answers with page 1 and names the next page ("api/part#2").
| Name | Type | Req | Description |
|---|---|---|---|
| method | string | yes | Method name ("v1.part.box", "box"), topic doc ("DATA") or recipe ("recipes/constrained-sketching", "recipes/parametric-part"). |
No output schema declared.
No examples provided.
docs Fetch documentation (bulk) ~331
Fetch documentation in BULK — one call, many documents. Keys can be: v1 methods ("v1.part.box" or a unique bare name), topic docs ("DATA", "STRUCTURE", "GRAPHICS"), recipes ("recipes/verification" — MANDATORY in every build fetch, "recipes/clean-construction" — every assembly and multi-part model, "recipes/constrained-sketching", "recipes/parametric-part", "recipes/assembly-parameters", "recipes/pattern-then-subtract", "recipes/direct-modeling-eif", "recipes/buerli-app"), guides ("part/expression-workflow", "assembly/generic", …) and domain overviews ("api/part"). PLAN FIRST: pick every method you will need from the method index, then request them plus the matching recipe/guide docs in ONE call (up to 24 keys), recipes first. Each response is capped at ~48k chars: docs that don't fit are listed at the TOP as "NOT included yet" — request exactly those keys in a follow-up call before building. Docs larger than one response are paged: "key" is page 1, "key#2" the next (the page footer says so). Unknown keys come back in a "not found" section with suggestions. Find recipes/guides by topic with the method search (list_methods), which also returns matching documents.
| Name | Type | Req | Description |
|---|---|---|---|
| keys | array | yes | Documentation keys, e.g. ["DATA", "v1.part.extrusion", "v1.part.chamfer", "recipes/parametric-part"]. |
No output schema declared.
No examples provided.
find Find nodes ~160
Search the cached structure tree by class and/or name substring. Returns slim records (id, class, name, parent).
| Name | Type | Req | Description |
|---|---|---|---|
| drawing | string | yes | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
| name | string | – | Match nodes whose name contains this substring (case-insensitive). |
| refresh | boolean | – | – |
| type | string | – | Match nodes whose class === type (e.g. "CC_Part", "CC_Box"). |
No output schema declared.
No examples provided.
get_selection What the user selected ~322
What the user has selected in the app docked into this session: faces, edges and vertices of a body, or objects of the model tree (sketch entities, dimensions, features). Call it when the user points at something instead of naming it ("this face", "the selected edges", "here"). Each item has `kind` (face | edge | vertex | object) and `objectId` — the tree object: the picked object itself, or the solid a picked face, edge or vertex belongs to (`object` names its class). Geometry also has `graphicId`, the id API calls take for that face, edge or vertex (e.g. v1.sketch.create({ planeId })), its `type` (plane, cylinder, line, arc, …), `containerId` and `prodRefId`. A selection keeps the ids it was made with: after a feature rebuilds the body, its `containerId` and `objectId` name the old, consumed body (faces and edges the feature did not touch keep their `graphicId`; a recalc renumbers them all). Read the selection right before you use it.
| Name | Type | Req | Description |
|---|---|---|---|
| drawing | string | yes | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
No output schema declared.
No examples provided.
inspect Inspect node ~121
Return the full record for a single tree node by ID, including members and children.
| Name | Type | Req | Description |
|---|---|---|---|
| drawing | string | yes | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
| id | string|number | yes | Node ID. |
| refresh | boolean | – | – |
No output schema declared.
No examples provided.
list_methods List API methods ~316
Search/list the v1.<domain>.<method> surface. `search` as a string: one BM25-ranked list over method name + summary (whole words), CAD synonyms expanded (split→slice, hole→bore, round→fillet, …). `search` as an ARRAY with ONE CONCEPT PER ENTRY (e.g. ["expression", "box", "fastened constraint", "mass properties"]): one group per entry, each ranked on its own, so every concept gets its own top matches (a group note flags entries that are likely workflows, not methods). PLUS `docs`: the recipes/guides whose title, headings or text match (e.g. "shared parameters assembly" → recipes/assembly-parameters) — search by what you want to build, then fetch those docs. Without `search`: the full method listing plus `documents` (every recipe and guide, key — title). withSummaries=false returns bare names (token-cheap). A no-hit result does NOT mean the operation is missing — browse the domain instead.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | string | – | Restrict to one domain. |
| limit | integer | – | Max ranked results: total for a string search (default 25), per group for an array (default 8). |
| search | – | – | Keyword(s) to rank against name + summary (case-insensitive, synonyms expanded). Array = one group per entry — put one concept in each. |
| withSummaries | boolean | – | Include one-line summaries (default true). |
No output schema declared.
No examples provided.
load Load drawing ~219
Load a drawing, replacing the current one: from a file on disk (`path`) or from base64-encoded content. Formats: STP (STEP), STL, OFB, JSON. Prefer `path`: the file is read here and never passes through the conversation, which is the only practical way for a model file of real size. Give exactly one of `path` and `content`.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | – | Base64-encoded payload, when there is no file. |
| drawing | string | yes | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
| format | string | yes | Input format. |
| path | string | – | Absolute path of the file to load, e.g. /Users/me/parts/bracket.step. |
No output schema declared.
No examples provided.
login Sign in to ClassCAD ~137
Sign this machine in to ClassCAD (a free classcad.ch account; Google, GitHub or email). Call it RIGHT AFTER installing the MCP. Not signed in: the first call opens the sign-in page in the user's browser and returns its link — show it to the user as a clickable link too — and the next call WAITS (up to ~50 s per call) until they have signed in in the browser, then returns their account. Call again while it reports "still waiting". Already signed in: returns the account at once. logout: true signs the machine out.
| Name | Type | Req | Description |
|---|---|---|---|
| logout | boolean | – | Sign this machine out instead. |
No output schema declared.
No examples provided.
restore Restore checkpoint ~151
Replace the drawing with a previously checkpointed state (clear + reload). Without a label, the MOST RECENT checkpoint is restored. All ids from after the checkpoint are stale afterwards — re-read them (tree/find) before further operations.
| Name | Type | Req | Description |
|---|---|---|---|
| drawing | string | yes | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
| label | string | – | Checkpoint name. Default: the most recently created one. |
No output schema declared.
No examples provided.
run_script Run script ~579
Execute JavaScript against the CAD session — THE tool for any build involving computation, repetition, or more than a handful of operations. The script runs as an async function body with: • api.v1.<domain>.<method>(params) — ClassCAD calls, await-able, → { result, maxLevel, messages }. Typos throw immediately with suggestions. Strict: a call that ends at maxLevel ≥ 51 THROWS (the message carries the engine error) — method docs describing "null/[] with maxLevel 51" are the non-script result; wrap intentional probes (e.g. getGeometryIds where a miss is expected) in try/catch. • await api.tree({ refresh? }) — the structure tree (id → node): find parts, features, sketches by class/name. Returns a Promise: without await, Object.values(api.tree()) is silently [] (looks like an empty drawing). • await api.graphic({ recalc? }) — the graphic payload (containers with face meshes, edges, vertices): find and FILTER GEOMETRY yourself — e.g. locate a bore wall by vertex radius, collect edge ids for a chamfer. Exact shapes + selection idioms: docs(["DATA"]). • Math, full JS (variables, loops, functions); console.log/log(...) captured and returned. • return <small summary> — results are size-capped; keep big data in the drawing, not the return value. Compute coordinates IN the script (trigonometry, loops) instead of inlining hand-evaluated numbers. Pass recalc:false to api.graphic() in solid.*/entity-injection sessions (a recalc invalidates curve shape ids and can destroy injected bodies in complex cases). No DOM/network/filesystem access; awaited work times out (default 60s). Prefer several small verified scripts over one huge one — STATE PERSISTS in the drawing between scripts: a follow-up script ATTACHES to the existing model (re-discover via await api.tree(); tree ids are stable; NEVER part.create when a part already exists). Even a single operation is a run_script.
| Name | Type | Req | Description |
|---|---|---|---|
| drawing | string | yes | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
| label | string | – | Short label describing what this script does. |
| script | string | yes | JavaScript source. Executed as an async function body — use await directly, return a (small) summary value. |
| timeoutMs | integer | – | Timeout for awaited work in ms (default 60000). |
No output schema declared.
No examples provided.
save Save drawing ~322
Write the current drawing to a file, or return it as base64. Formats: STP (STEP, exact geometry), STL (triangles), GLB (binary glTF: triangles with colours, for 3D viewers and the web), OFB (ClassCAD's own format: the model with its features, to open again in ClassCAD or Buerligons), JSON. With `path` the file is written to disk and only its path and size come back — the way to hand the user a model (give them the path); without it the content is returned base64-encoded, which is large. The user can also save the model themselves from what `view` opens.
| Name | Type | Req | Description |
|---|---|---|---|
| analytic | boolean | – | STP only: write planes, cylinders, cones, spheres and tori as such instead of as B-spline surfaces. Other CAD systems read such a file faster and recognise its holes and flats. |
| drawing | string | yes | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
| format | string | yes | Output format. |
| path | string | – | Absolute file path to write, e.g. /Users/me/Desktop/flange.stp (folders are created). Omit to get the content back as base64. |
No output schema declared.
No examples provided.
session_info Session info ~408
Return ClassCAD MCP session status: the drawing's id, the link of the app docked into this session (app) or of the read-only 3D view (viewer), the link the session is shared with others under (shared; null while it is not), who else is in the session (peers), sign-in (auth), transport (ws = ClassCAD worker, wasm = the MCP's own local engine), engine policy, whether a local WASM engine is available, WS URL, current session id, the invite this session joined with (shareToken), connection state, package version. DAEMON: every connection of a host to this MCP is a session in ONE shared daemon process per machine (127.0.0.1:9097), with the drawings its conversations opened; it exits a minute after its last session. Rebuilt MCP/renderer code only runs in a new daemon — an idle one is replaced automatically. Shell commands: `node "/workdir/node_modules/@classcad/mcp/dist/server.js" status` (pid, build, sessions); `node "/workdir/node_modules/@classcad/mcp/dist/server.js" stop` (stops it only when no session is active); `node "/workdir/node_modules/@classcad/mcp/dist/server.js" stop --force` (terminates it NOW — every connected host, this one included, loses its drawings: ask the user first. Tabs reconnect to a fresh daemon on their next tool call; tabs started before this MCP version need a host restart). Never kill daemon processes by hand.
| Name | Type | Req | Description |
|---|---|---|---|
| drawing | string | – | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
No output schema declared.
No examples provided.
set_selection Select something for the user ~221
Selects things in the app docked into this session, so the user sees what you mean: faces, edges or vertices by their `graphicId` (from getGeometryIds, pick results or get_selection), tree objects by their `objectId`. The app highlights them. Returns what is selected there afterwards. Geometry ids must be current ones (see get_selection); pass `prodRefId` from a previous get_selection when the part is an instance in an assembly. An empty `items` clears the selection.
| Name | Type | Req | Description |
|---|---|---|---|
| drawing | string | yes | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
| items | array | yes | What to select. |
| replace | boolean | – | Replace the current selection (default) or add to it (false). |
No output schema declared.
No examples provided.
share Share the session ~355
A link to this session's app that works from ANYWHERE: for another person, or for the user on another device (the link `view` returns works on this machine only). Whoever opens it is in this session like the user at the app — they see the model live as you build it, and can turn, select and edit it. Call it when the user asks to share, send or show the model to somebody, or to open it somewhere else. Not on your own: the link lets EVERYONE who has it into the session, so it is a secret between the user and whom they send it to — hand it to the user, as a clickable link on its own line, and put it nowhere else. The session stays on this machine; guests reach it through the ClassCAD share relay, which passes the data on and keeps none of it. The link works until the session ends or sharing is stopped. When the share service cannot be reached, nothing fails: you are told so, the app keeps working on this machine, and the session is shared as soon as the service is back. stop: true takes it back: it stops working and whoever joined with it is disconnected. Sharing again afterwards gives a new link.
| Name | Type | Req | Description |
|---|---|---|---|
| drawing | string | yes | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
| stop | boolean | – | Stop sharing: the link stops working and its guests are disconnected. |
No output schema declared.
No examples provided.
snapshot Snapshot drawing ~1,179
Render the current drawing as an inline PNG (also written to disk: outDir, else $CLASSCAD_SNAPSHOT_DIR, else <tmpdir>/classcad-snapshots). The image is returned to the MODEL as an inline image block — no follow-up Read is needed to see it. The USER usually does not see tool results. At the end of a build (not after every tweak), SHOW them the render: with a file-sending tool (Claude Code: SendUserFile), send the saved PNG; otherwise embed it in your reply as a Markdown image with its absolute path,  — Codex and most chat hosts display that. Hosts preview only files inside the session's own folders (Claude Code: the scratchpad directory or the project) — anywhere else the user gets a grey placeholder card. So when you intend to send the render, pass outDir = your scratchpad directory (or a folder in the project). Call after a meaningful geometry change, NOT after every parameter tweak. Verification options: section (cut through internals), sheet (four labeled views, shared ortho scale), drawing (technical drawing: front/top/side with hidden lines dashed, placed first- or third-angle — compare against a reference drawing), lines (line style: visible edges solid, hidden dashed), highlight (face/edge/body ids in signal color), markers (probe crosshairs at world points), sketchOverlay (sketch curves on their real plane), annotate (extents + axes triad + scale bar), xray (hidden geometry shines through), colors "distinct" (one color per body — booleans/splits/patterns), frame (pin an earlier snapshot's reported frame for pixel-comparable before/after).
| Name | Type | Req | Description |
|---|---|---|---|
| annotate | boolean | – | Measurement overlay: bbox extents, view-oriented axes triad, scale bar. |
| colors | string | – | "native" (default): the model's own colors. "distinct": one palette color per body. |
| drawing | – | yes | Technical drawing in ONE image: front, top and side view in line style (hidden edges dashed), aligned at one scale, plus a shaded iso. "first-angle" (ISO E, Europe; true): top view BELOW front, view… |
| frame | object | – | Pin the frame reported by an earlier snapshot (same view/size) for pixel-comparable before/after. |
| height | integer | – | Pixels (default 900). |
| highlight | array | – | Ids rendered in signal color: graphic container ids, owning solid ids, face mesh ids, edge ids. CAUTION: face/edge ids are only stable within one graphic payload (recalc reassigns them) — across tool… |
| highlightAt | array | – | World points [[x,y,z],…]: the closest FACE in the rendered payload is highlighted per point. Geometrically anchored — the robust way to highlight a face found via run_script (return a point on it, no… |
| label | string | – | Filename label. Default "snapshot". |
| layers | array | – | Content layers to render. Default ["solid"]. |
| lines | boolean | – | Line style instead of shading: visible edges and silhouettes solid, hidden edges dashed. Hidden lines show bores, pockets, hollow vs solid. Works for the single view and every sheet panel. |
| lookAt | array | – | World-space [x,y,z] that lands at screen center. Omit for bbox center. |
| markers | array | – | Probe markers (crosshair + label) at world coordinates, drawn on top. |
| outDir | string | – | Absolute directory for the PNG (created if missing). Pass your session scratchpad when the user should see the file — hosts preview only files in session folders. |
| recalc | boolean | – | Default false. Opt in only to regenerate; keep false for solid.*/entity-injection sessions — a recalc invalidates curve shape ids and can destroy injected bodies. |
| section | object | – | Cut the solids at a plane; the positive side of the normal is removed. The cut faces are filled and hatched like a drawing's section (wall thicknesses, bores and pockets read directly); cap: false le… |
| sheet | – | – | Multi-view sheet in ONE image. true or 4 views = quadrants (default top/iso/front/right; ortho views share one scale). 2 views = side-by-side panels labeled A | B — use for the mirror check: [matched… |
| sketchOverlay | boolean | – | Draw sketch curves in 3D on their actual plane over the solid render. |
| source | string | – | "stl": render the tessellated STL export instead of the engine graphic (explicit fallback; no brep edges). |
| supersample | integer | – | Anti-aliasing: render at k× and downscale to width×height (default 2; 1 = raw aliased pixels). Output size and image tokens are unchanged. |
| view | – | – | Camera: named view (default "iso") or arbitrary orthographic camera. |
| width | integer | – | Pixels (default 1200). |
| xray | boolean | – | Translucent bodies — hidden geometry shines through. |
| zoom | number | – | Multiplier on auto-fit scale. 1=fit-all (default), >1 zooms in. |
No output schema declared.
No examples provided.
tree Structure tree ~120
Return the cached drawing structure tree. Pass refresh=true to force a fresh server fetch first.
| Name | Type | Req | Description |
|---|---|---|---|
| drawing | string | yes | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
| refresh | boolean | – | Force a server round-trip before reading the cache. |
No output schema declared.
No examples provided.
use_session Switch session ~631
Make this the FIRST call of a drawing (drawing: "new") when the user names a session or hands you a session/token URL — a drawing opens its engine link lazily, so its first tool call decides which session it is. Modes: (1) sessionId — attaches to a named ClassCAD session (ClassCAD-Session-Id header) on the configured worker; empty/omitted = fresh worker-assigned session. (2) url — a ws(s):// URL from a multi-client server, typically carrying an invite token (wss://host/?invite=…); connected VERBATIM. (3) an http(s):// APP SHARE LINK from a buerli app's Session Management (…?invite=…): the MCP joins the app's session as a guest, wherever its engine runs — on a ClassCAD server (the token is applied to the configured worker URL) or in the app's own page (WASM; the app must stay open: on this machine, or anywhere when it shares on the ClassCAD share relay, as buerligons.io does). Without a url the MCP runs its own session — and the user's app docks into THAT with the link `view` returns. (4) engine — WHICH ENGINE runs that own session: "drogon" = the configured ClassCAD worker (server), "wasm" = the MCP's OWN local engine (the published WASM build hosted in this process, no server and no browser needed; requires a configured key), "auto" (default) = the worker if reachable, otherwise the local engine. Use "drogon" when the user says to connect to their (Drogon/ClassCAD) server, "wasm" when they say WASM/local/offline; a token or URL always decides by itself. Reconnecting clears cached structure/graphic state — the next tool call repopulates it.
| Name | Type | Req | Description |
|---|---|---|---|
| drawing | string | yes | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
| engine | string | – | Engine for the MCP's own session when no url is given: auto (worker, else local WASM), drogon (the ClassCAD worker only), wasm (the local engine only). Sticks for the session until changed. |
| sessionId | string | – | Target session id (named-session model, worker only). Empty string or omitted = no header (worker-assigned session). |
| url | string | – | ws(s):// URL to connect to VERBATIM — e.g. a multi-client token/invite URL (wss://host/?invite=…). An http(s):// app share link with ?invite= is accepted too: the invite token is extracted and applie… |
No output schema declared.
No examples provided.
view Open the app ~359
The live CAD app of this session (Buerligons), docked into the same engine: returns its link and says how to bring it up. Where the session is shared from the start the link is its share link (it works from anywhere); local: true returns the link that works on this machine only instead — for when the share link does not load. The app shows every change as it happens, and the user can work in it — turn and zoom, select, measure, edit sketches and features, export STEP or STL. Call it when the user asks to see, turn or edit the model, or asks for the link. If the user already has it open, nothing is opened. Otherwise it is opened in the user's default browser — or, when your host has a browser pane of its own, you are told to open the link there. open: false only returns the link; open: true opens the user's default browser whatever the host.
| Name | Type | Req | Description |
|---|---|---|---|
| drawing | string | yes | The drawing this call works on. "new" opens a new, empty drawing, and the answer names its id; from then on pass that id (e.g. "d-k3v9q2xa") in every call of this conversation about that model. A dra… |
| local | boolean | – | Return the link of the app on this machine (127.0.0.1), which needs no share service: use it when the share link does not load. |
| open | boolean | – | true: open the user's default browser now. false: only return the link. Default: bring it up where it belongs, unless the user already has it open. |
No output schema declared.
No examples provided.
How do I install the ClassCAD MCP server?
ClassCAD runs locally as an npm package, launched with npx -y @classcad/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @classcad/mcp
claude mcp add awv-informatik-classcad -- npx -y @classcad/mcp
What is the ClassCAD MCP server?
ClassCAD is an MCP server listed in the public MCP registry as io.github.awv-informatik/classcad. Build and verify CAD parts and assemblies with the ClassCAD engine, locally, no server needed. This page covers its npm package (@classcad/mcp).
Is the ClassCAD MCP server safe to use?
ClassCAD scores 78 out of 100 on VerifyMCP. We recorded 3 known advisories against it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the ClassCAD MCP server expose?
ClassCAD exposes 21 tools: login, account, view, share, get_selection, and 16 more. Their descriptions and schemas cost roughly 6,604 tokens of context every time the server is loaded.
Is the ClassCAD MCP server still maintained?
ClassCAD is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the ClassCAD MCP server under?
ClassCAD declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.