# ClassCAD (npm · @classcad/mcp)

Build and verify CAD parts and assemblies with the ClassCAD engine, locally, no server needed.

- Trust score: 78/100 (medium)
- Change this week: +1
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- npm · `@classcad/mcp`: 78/100 (this document), [markdown](https://verifymcp.io/servers/awv-informatik-classcad/classcad-mcp.md), [page](https://verifymcp.io/servers/awv-informatik-classcad/classcad-mcp)

## Channel facts

- Registry: `npm`
- Package: `@classcad/mcp`
- Version: `0.6.1`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 81/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known high-severity CVE affects sharp 0.34.5, a direct dependency. A fixed version is available.
  - No install/post-install scripts declared.
  - 30 of 126 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to awv-informatik/classcad-ai).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 15 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 58/100
  - AI-judged instruction clarity (excellent).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 55/100
  - Stability check failed: the tool surface changed between 0.2.0 and 0.6.1: 3 tool removals, 12 breaking changes, 4 additions.
- **Tool Coverage**: 99/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 97% of tool parameters carry a description.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 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.
  - An AI judge read all 22 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### 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.

### Claude

```bash
claude mcp add awv-informatik-classcad -- npx -y @classcad/mcp
```

### Cursor

```json
{
  "mcpServers": {
    "awv-informatik-classcad": {
      "command": "npx",
      "args": [
        "-y",
        "@classcad/mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "awv-informatik-classcad": {
      "command": "npx",
      "args": [
        "-y",
        "@classcad/mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add awv-informatik-classcad -- npx -y @classcad/mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "awv-informatik-classcad": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@classcad/mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add awv-informatik-classcad --command npx --arg -y --arg @classcad/mcp
```

### Hermes

```yaml
mcp_servers:
  awv-informatik-classcad:
    command: "npx"
    args: ["-y", "@classcad/mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "awv-informatik-classcad": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@classcad/mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add awv-informatik-classcad -t stdio -c npx -a -y @classcad/mcp
```

### Other

```json
{
  "mcpServers": {
    "awv-informatik-classcad": {
      "command": "npx",
      "args": [
        "-y",
        "@classcad/mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-30 (score 78, +1)

No change was recorded against any check on this day. Stability & Change Management went from 48 to 52.

### 2026-10-28 (score 77, +1)

No change was recorded against any check on this day. Stability & Change Management went from 42 to 45.

### 2026-10-26 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 35 to 38.

### 2026-10-24 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 28 to 32.

### 2026-10-22 (score 74, 0)

- [security regression] CVE-2026-114113 affects this package: high
- [security regression] CVE-2026-114111 affects this package: high
- [security regression] CVE-2026-114112 affects this package: high
- [security improvement] GHSA-wq5f-xc86-pv6w no longer affects this package
- [security improvement] GHSA-rgj7-g3m4-5g8c no longer affects this package
- [security improvement] GHSA-f88m-g3jw-g9cj no longer affects this package

### 2026-10-21 (score 74, +16)

- [security improvement] Malware scan: unverified → pass
- [functional] Package version: 0.4.1 → 0.6.1

### 2026-10-20 (score 58, −19)

- [security regression] Malware scan: pass → unverified
- [functional regression] Schema quality: 429 → 486
- [functional] Package version: 0.5.4 → 0.6.1
- [functional] Package version: 0.5.4 → 0.6.0

### 2026-10-18 (score 77, +16)

- [security improvement] Malware scan: unverified → pass

## MCP tools (21)

### `login` (~137 tokens)

Sign in to ClassCAD

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.

Input parameters:

- `logout` (boolean): Sign this machine out instead.

### `account` (~137 tokens)

ClassCAD account and plan

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.

### `view` (~359 tokens)

Open the app

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.

Input parameters:

- `drawing` (string, required): 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.

### `share` (~355 tokens)

Share the session

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.

Input parameters:

- `drawing` (string, required): 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.

### `get_selection` (~322 tokens)

What the user selected

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.

Input parameters:

- `drawing` (string, required): 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…

### `set_selection` (~221 tokens)

Select something for the user

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.

Input parameters:

- `drawing` (string, required): 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, required): What to select.
- `replace` (boolean): Replace the current selection (default) or add to it (false).

### `session_info` (~408 tokens)

Session info

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.

Input parameters:

- `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…

### `use_session` (~631 tokens)

Switch session

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.

Input parameters:

- `drawing` (string, required): 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…

### `clear` (~189 tokens)

Clear drawing

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.

Input parameters:

- `drawing` (string, required): 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.

### `save` (~322 tokens)

Save drawing

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.

Input parameters:

- `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, required): 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, required): 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.

### `load` (~219 tokens)

Load drawing

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`.

Input parameters:

- `content` (string): Base64-encoded payload, when there is no file.
- `drawing` (string, required): 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, required): Input format.
- `path` (string): Absolute path of the file to load, e.g. /Users/me/parts/bracket.step.

### `checkpoint` (~200 tokens)

Checkpoint drawing

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.

Input parameters:

- `drawing` (string, required): 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".

### `restore` (~151 tokens)

Restore checkpoint

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.

Input parameters:

- `drawing` (string, required): 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.

### `tree` (~120 tokens)

Structure tree

Return the cached drawing structure tree. Pass refresh=true to force a fresh server fetch first.

Input parameters:

- `drawing` (string, required): 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.

### `find` (~160 tokens)

Find nodes

Search the cached structure tree by class and/or name substring. Returns slim records (id, class, name, parent).

Input parameters:

- `drawing` (string, required): 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").

### `inspect` (~121 tokens)

Inspect node

Return the full record for a single tree node by ID, including members and children.

Input parameters:

- `drawing` (string, required): 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, required): Node ID.
- `refresh` (boolean)

### `list_methods` (~316 tokens)

List API methods

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.

Input parameters:

- `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).

### `docs` (~331 tokens)

Fetch documentation (bulk)

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.

Input parameters:

- `keys` (array, required): Documentation keys, e.g. ["DATA", "v1.part.extrusion", "v1.part.chamfer", "recipes/parametric-part"].

### `describe_method` (~147 tokens)

Describe API method

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").

Input parameters:

- `method` (string, required): Method name ("v1.part.box", "box"), topic doc ("DATA") or recipe ("recipes/constrained-sketching", "recipes/parametric-part").

### `snapshot` (~1179 tokens)

Snapshot drawing

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, ![render](/abs/path.png) — 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).

Input parameters:

- `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` (required): 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.

### `run_script` (~579 tokens)

Run script

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.

Input parameters:

- `drawing` (string, required): 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, required): 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).

## Diagnostics

Captured diagnostic sections: Provenance, Vulnerabilities, Dependencies. The full working is on the page: https://verifymcp.io/servers/awv-informatik-classcad/classcad-mcp#diagnostics

## Score history

- 2026-11-05: 78
- 2026-11-04: 78
- 2026-11-03: 78
- 2026-11-02: 78
- 2026-11-01: 78
- 2026-10-31: 78
- 2026-10-30: 78
- 2026-10-29: 77
- 2026-10-28: 77
- 2026-10-27: 76
- 2026-10-26: 76
- 2026-10-25: 75
- 2026-10-24: 75
- 2026-10-23: 74
- 2026-10-22: 74
- 2026-10-21: 74
- 2026-10-20: 58
- 2026-10-19: 77
- 2026-10-18: 77
- 2026-10-17: 61
- 2026-10-16: 76
- 2026-10-15: 76
- 2026-10-14: 29
- 2026-10-13: 44
- 2026-10-12: 44
- 2026-10-11: 44
- 2026-10-06: 44
- 2026-10-05: 73
- 2026-10-04: 73
- 2026-10-03: 57

## Common questions

### 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.

## Links

- npm package: https://www.npmjs.com/package/@classcad/mcp
- Socket report: https://socket.dev/npm/package/@classcad/mcp
- Repository: https://github.com/awv-informatik/classcad-ai
- Website: https://classcad.ai/
- Changelog RSS feed: https://verifymcp.io/servers/awv-informatik-classcad/classcad-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/awv-informatik-classcad/classcad-mcp.json
- HTML version of this page: https://verifymcp.io/servers/awv-informatik-classcad/classcad-mcp
