agent-first · headless · git-native CAD — mechanical + electrical, one substrate
$ pip install gitcad          # mech + ecad + MCP server + exact kernel (v0.9.9)

docs · github.com/gitcad-xyz/gitcad · Apache-2.0

start

There is no application to open. gitcad is an MCP server — you wire it into the agent you already use, once, and from then on you design by asking. Installing the package is only half of it; the agent has to be told the server exists.

$ pip install gitcad
$ claude mcp add gitcad -- gitcad-mcp     # Claude Code

Any other MCP client (Claude Desktop, Cursor, Zed, Codex) takes the same server in its own config file:

{ "mcpServers": { "gitcad": { "command": "gitcad-mcp" } } }

Then say what you want built. The agent's first call is get_started, which scans the working directory and hands back what is already there and what to do next — so a cold session knows where it is without being told:

you   "design a 72 mm floating crankbait — no electronics"

      get_started    what's in this directory, what to do next
      model_new      a project is a repo; the model is text
      viewer_open    ONE URL, opens your browser, outlives the session
      feature_add    build → model_validate → model_measure → export

67 tools, mechanical and electrical. The agent is expected to open the viewer early and leave it up, so you watch the design take shape rather than waiting for a report.

what

A CAD platform where the primary interface is an MCP tool surface, not a GUI. Models are canonical text — geometry (STEP, Gerbers, PDFs) is a build artifact, never source. So designs branch, merge, diff, blame, and release like code, and agents model by verifying — every operation returns machine-readable validation and measurement — instead of hoping.

why

how

m = model_new()
m = feature_add(m, op="box",      params={dx:60, dy:40, dz:8})
m = feature_add(m, op="cylinder", params={radius:3.2, height:8})
m = feature_add(m, op="boolean",  params={kind:"cut"}, inputs=[...])

model_validate(m)   # watertight? self-intersecting? → structured report
model_measure(m)    # volume, centroid → deterministic oracle

model_export(m, "step")   # → part.step
model_drawing(m)          # → dimensioned drawing on an ISO/ANSI sheet
board_export_fab(b)       # → Gerber X2 + Excellon + pick-and-place

viewer_open(path=".")      # one detached server per project; outlives the session

architecture

Six seams. Everything swappable lives behind one. The kernel is forge — the project's own exact-arithmetic b-rep kernel (the only one; OCCT was removed entirely, ADR-0020). Geometric and topological decisions use exact rationals or certified intervals; an operation the kernel cannot do exactly refuses by name instead of approximating.

Kernel          b-rep ops, validation, measurement   → forgekernel (+ Rust build)
IdentityService stable entity IDs (naming fix)       → lineage-hash
DocumentModel   feature tree ⇄ canonical text        → deterministic JSON
Renderer        headless tessellation → viewer/STL   → forge mesher
DrawingEngine   3D → 2D views, dimensions, sheets    → forge HLR → SVG/PDF
Storage         git models + content-addressed art.  → git

status

Fixes the field found, in 0.9.9: a union of coplanar-wall lofts crashed raw on 0.9.8 and now refuses by name; patch_flux was silently wrong on B-spline surfaces with interior knots; the planar STEP importer silently chorded curved edges and now refuses; the STEP tokenizer no longer loses entities containing quoted semicolons.

Durable decisions are written as ADRs before code. The rules agents must follow: CLAUDE.md.