# An agent that designs my 3D prints; I press Start

My agent measures, models, checks and slices parts for my Bambu Lab H2C, then uploads the file. I load filament, clear the plate and press Start.

Topic: Agents &amp; review
Tested: 2026-10-27
Revision: 1
By Roman Vaisman
Page: https://eng.vaisman.me/entries/agent-3d-printing/

## In 30 seconds

- The agent measures, models, renders, checks and slices in code; I load filament, clear the plate and press Start.
- It's good at strain, wall and clearance maths and fast changes, and bad at what it can't see.
- Every geometry check runs a should-hit control first; every sliced file is checked before it leaves the machine.
- It never starts, pauses or heats the printer; only a small upload tool reads the printer's access code, and never prints it.

## Problem

I wanted an AI agent designing and printing real parts on my Bambu Lab H2C, a dual-nozzle printer whose right nozzle swaps hotends.

My plan from 2026-10-17 had the agent, on my Mac, design, preview and slice the parts. A printer is a heater with moving parts, so the agent never prints on its own.

## What I tried

| Attempt | What happened |
| --- | --- |
| A community printer MCP server | Passed over: its print and set-temperature tools had no gate. |
| A start command gated by my phone go | Dropped: a third-party start needs LAN Only plus Developer Mode, which cuts the printer off the cloud. I press Start myself. |
| Slicing a bare STL with the built-in profiles | It failed on my dual-nozzle printer: "filaments can't be mapped". |
| Trusting the slice | Three prints stopped at layer 3. The agent blamed filament, speed, then the hotend; its slice told the screen one nozzle and the G-code the other. |
| A collision check with no control | It silently returned "no collision", and a wrong claim got through. |
| Flat 4 mm rails over air | They strung. |
| Modelling only what it could see | It missed a phone's camera bump until I told it. |

## What worked

**Setup, on a Mac.** OpenSCAD, build123d, trimesh and Bambu Studio's built-in command-line slicer, at the versions in the brief; Linux is untested by me.

**A project file as the template.** I save a project file from Bambu Studio for the exact printer and filament, and the agent swaps its own mesh into it.

**Three ways to get a file to the printer.** I use the first:

- Cloud mode plus a small local upload tool, so the Bambu app keeps working. Upload only worked with a USB stick in the printer.
- LAN Only plus Developer Mode: third-party tools can start prints, but the cloud and the app are cut off.
- Sending the file from Bambu Studio over the cloud, by hand.

The agent never uses Bambu Studio's Print, which per its behaviour also starts the job (untested by me).

**A loop with me in it.** From a phone photo or a downloaded model, the agent measures, models parametrically, renders a preview and looks, then checks fit, overhangs and collisions in code. It slices; I print and report; the next version starts.

**A broken community design, fixed.** [A Cybertruck wheel-cap design on Thingiverse](https://thingiverse.com/thing:6558347) was broken. The agent estimated about 10% bending strain per click; with 12 tapered fingers its estimate fell to about 1.7%. The set of 4, printed in PETG, fit the truck after 3 failed runs.

**Every file checked before it leaves the machine.** The agent now slices both nozzles with one command, and that command refuses a file whose nozzle settings don't match. Rails over air get 45° undersides, and the same tool warns about overhangs.

**Every check proves it can fail.** Each geometry check first runs a should-hit control, and collisions are checked in OpenSCAD: without their extra libraries, trimesh's booleans returned empty with no error.

**Hands off the printer.** The agent never starts, pauses or heats the printer. I typed the access code from the printer screen into a helper on my Mac, so it never passed through chat or the agent. The upload tool has no start, pause, stop, heat, raw G-code or camera command; three models reviewed it before use. Uploading needs no go from me: nothing prints until I load filament, clear the plate and press Start.

**Fast turns on small parts.** A phone holder went from 2 photos to a first slice in about 5 minutes. It took 4 versions over about 3 hours, driven by my feedback; the first one failed mid-print.

## Numbers

The strain figures above are estimates from a beam-bending calculation on the measured finger shape; the real test was the set of 4 fitting the truck.

| Label | Value | Kind |
| --- | --- | --- |
| Tapered fingers on the new cap | 12 | configured |
| Prints that stopped at layer 3 before the nozzle check | 3 | measured |
| Phone holder, 2 photos to first slice | about 5 min | measured |
| Phone holder versions | 4 in about 3 h | measured |

## When it stops being true

This worked on my H2C in cloud mode in October 2026, firmware version unknown. Newer firmware may break what the upload tool reads; it's specified to report unknown fields rather than guess. The nozzle check guards one slicer quirk, not every quirk.

On a single-nozzle P1S or A1 the nozzle mismatch can't happen, and the template approach should carry over; that's untested.

## Agent brief

```agent-brief
Set yourself up to design and print 3D parts with me on my Bambu printer. "(general)" marks advice not from my setup.

First ask me:
- Printer model, nozzles, filament, AMS or external spool (general: affects filament mapping), and storage (general: USB stick on my H2C, microSD on a P1S).
- Mac or Linux (Linux is untested).
- Transfer route: upload tool (cloud mode; it needs the printer's local IP and serial, general), LAN Only plus Developer Mode (no cloud or app), or me sending from Bambu Studio.
- Early photos and measurements; load or weight; fit, wall, clearance and overhang limits (general; overhangs default to 45°).

Constraints:
- Never start, pause or heat the printer; I start every print.
- Never see the access code; I type it into a prompt-based helper that writes an owner-only file.
- In Bambu Studio use Send, never Print, which per its behaviour (untested here) also starts the job.

Steps:
- Install, pinned: OpenSCAD 2026.10 nightly (that dated build, no auto-update; general); build123d 0.13 and trimesh 5.1 on Python 3.12; Bambu Studio 2.6, whose version is its slicer's.
- Take ports, topics, the status request, storage path, slicer options and project-file layout from published vendor or community docs for my printer and firmware; confirm each read-only on the printer first (general).
- Upload-tool route: build or adopt a tool that does only this: status by MQTT over TLS on the LAN, one standard full-status request per call, never looped (general: frequent requests can lag some printers); upload by implicit FTPS to the printer's storage; both with LAN Only off. The certificates chain to Bambu's private CA and won't match a hostname (general), so pin each port's fingerprint instead, trusted on first use with me present. Refuse a loosely permissioned code file. Leave out start, pause, stop, heat, raw G-code and the camera rather than gate them. Unique upload names (same names overwrite); log checksums. A second model reviews it against this list first (general).
- Swap your parts into a project file I save for my exact printer and filament: keep one object, replace its mesh (all copies as one mesh), delete the rest, slice. A bare STL or extra STLs fail filament mapping.
- Measure a downloaded mesh in code, or use my measurements; model parametrically; render and look first.
- Check fit, overhangs, walls, clearances and collisions in code against my limits, each first on a known hit; estimate strain by beam bending with the filament maker's published stiffness (general).
- Before handover (an upload to the printer's storage, which needs no go, or Send in Bambu Studio), check the file: dual nozzle, both nozzle choices match; single nozzle, diameter and filament match printer and project (general).

Pitfalls:
- After a swap: fix the height offset (shorter parts float; the slice fails), set both nozzle choices (dual nozzle only), replace the plate thumbnail.
- trimesh booleans without their extra libraries return empty, no error: check collisions in OpenSCAD.
- Newer firmware may differ from mine (October 2026); check yours on the printer screen. If upload fails, use Send (general).

Done when:
- Each tool reports its pinned version; the upload tool reads status.
- A 20 mm cube with a hole is modelled, previewed, sliced from my project file and handed over, nothing started.
- The known-hit case hits; a mismatched file is refused.
- I print the cube and it comes out right.
```
