Developers

The modeler is an API.

The interface is one client of a catalogue of actions — 240+ in the core, more with each module — each with a JSON schema. Your scripts, your CI and your agents call exactly the same ones, held to the same scopes, revisions and undo.

RESTMCPPythonPluginsOpenAPI

REST

One endpoint per action.

List the catalogue with its schemas, then call any action on the revision you hold. Optimistic concurrency on every mutation: if someone edited in between, you are told, not overwritten.

  • Scoped tokens for read, write, AI and admin.
  • Batch: up to 100 commands as one revision and one undo step — all or nothing.
  • Deltas: a client holding a model gets the change, not the file.
  • Cancellation reaches the geometry worker; nothing is committed for a cancelled request.

$KOZOROSA is your Foundry address, or the local address Kozorosa for Mac gives under Help → Connect an AI Agent.

# Everything the modeler can do, with its schema
curl -H "Authorization: Bearer $TOKEN" \
     $KOZOROSA/api/studio/actions

# One edit, on the revision you hold
curl -X POST $KOZOROSA/api/studio/actions/push_pull \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"model_id":"…","expected_revision":12,
       "args":{"target":"body1","face_id":"f7","distance":40}}'

# A hundred commands as one revision and one undo step
curl -X POST $KOZOROSA/api/studio/actions/batch …

MCP

Your agent, at the controls.

The MCP endpoint serves the catalogue as tools. Settings → API → Connect an AI agent gives the ready-made configuration for Claude Code, Claude Desktop, Codex, Cursor, VS Code, Gemini and Windsurf.

  • Proposals: propose_changes shows the change as a ghost in the viewport, applied only when a person approves.
  • Reads that cost nothing: describe_body, mass_properties, measure and the module lists.
  • Notes: an agent keeps its memory of a model in the model's notes.
Connect an agent, step by step
POST /mcp
X-API-Key: ign_…          # scope: ai

{"jsonrpc": "2.0", "id": 1,
 "method": "tools/call",
 "params": {
   "name": "propose_changes",
   "arguments": {
     "model_id": "…",
     "title": "Lighten the web by 18%",
     "commands": [
       {"action": "shell",
        "args": {"target": "web", "thickness": 2.4}}
     ]
   }}}

Python

Loops, arithmetic, and the model read back.

The Python console binds the whole catalogue to one name, cad. A script runs in an isolated process of its own; it is one edit and one undo step, and a script that fails changes nothing.

Run a script, step by step
n = params["cells"]
pitch = params["pitch"]
strut = params["strut"]

for i in range(n + 1):
    for j in range(n + 1):
        cad.create_box(width=strut, depth=strut,
                       height=n * pitch,
                       position=[i * pitch, j * pitch, 0])

print("struts:", len(cad.features))
result = {"struts": len(cad.features),
          "extent_mm": n * pitch}

Extend it

Plugins and modules.

Parts

Parametric plugins

A plugin is a declarative recipe in a signed manifest — no plugin code ever runs. Start from the template, upload it for yourself, or install it for a whole organisation.

Library

Verified parts

Spur and bevel gears, ISO threads, hex bolts and nuts, washers, coil springs, pipe flanges and knurls, each pinned by a SHA-256 of its manifest.

Modules

Whole trades

Modules add kernel actions, reads, export formats, tools and pages — the construction modules are built this way.

Build on a modeler that answers.

Import a STEP file, push a face, put a dimension on it. 5 days, every tool, nothing to pay until you decide.