Engineering AlmanacAlmanac

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.

By Roman VaismanTested · 6 min read

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

AttemptWhat happened
A community printer MCP serverPassed over: its print and set-temperature tools had no gate.
A start command gated by my phone goDropped: 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 profilesIt failed on my dual-nozzle printer: “filaments can’t be mapped”.
Trusting the sliceThree 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 controlIt silently returned “no collision”, and a wrong claim got through.
Flat 4 mm rails over airThey strung.
Modelling only what it could seeIt 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 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

Tapered fingers on the new cap12configured
Prints that stopped at layer 3 before the nozzle check3measured
Phone holder, 2 photos to first sliceabout 5 minmeasured
Phone holder versions4 in about 3 hmeasured

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.

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

Paste into your own agent
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.