
A comprehensive 3D printing control bridge that wraps APIs for OctoPrint, Klipper/Moonraker, Bambu Labs, Prusa Connect, Creality Cloud, Duet, and Repetier systems. Beyond basic printer operations like starting jobs and monitoring temperatures, it handles advanced STL manipulation including scaling, rotation, sectional editing, and base extension for better bed adhesion. The server can slice models, generate G-code, and even send .3mf files directly to Bambu printers via MQTT. Reach for this when you want Claude to manage your entire 3D printing workflow from model preparation through print execution, or when building automated printing pipelines that need to work across different printer ecosystems.
Sponsors
Thank you, FULU Foundation, Louis Rossmann, and the OrcaSlicer-bambulab contributors. Thank you for standing up for consumer ownership, open-source developers, repair rights, and owners whose working hardware should not be made worse by locked-down software.
This server treats the FULU OrcaSlicer-bambulab fork as a first-class slicer for Bambu Lab projects. See the FULU guide for setup and current status.
An MCP server that connects Claude, Codex, and other MCP clients to 3D printers running OctoPrint, Klipper (Moonraker), Duet, Repetier-Server, Bambu Lab, PrusaLink or Prusa Connect, and Creality. Your agent can check status, upload and start jobs, cancel prints, edit STL meshes, run your slicer, and hand models to Blender through an optional Blender MCP bridge.
Browse the documentation site for searchable setup guides, per-printer credentials, slicing, and the full tool reference. It is generated from this README and the docs folder.
Only print on Bambu Lab printers? bambu-printer-mcp is a Bambu-focused fork of this project with more Bambu features, including AMS inventory and matching, camera snapshots, X2D support, and a Claude Desktop extension.
Built with help from our contributors. Thank you to everyone sharing fixes, careful bug reports, and real printer testing!
Tell your agent which printer system you use (OctoPrint, Klipper, Bambu Lab, Prusa, and so on) and its address, if you know them, then copy and paste this:
Install mcp-3d-printer-server in the agent/harness I'm using now.
Read https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SETUP.md
for the current setup instructions and supported printer backends.
Detect my OS and harness, then use its native MCP configuration or installer.
Preserve my existing servers and settings. Prefer the published npm package
(npx -y mcp-3d-printer-server, stdio); use Node.js 24 if a runtime is needed.
Ask which printer system I use and set PRINTER_TYPE to match. Never guess it.
Then ask only for the values that backend needs:
- octoprint: PRINTER_HOST, PRINTER_PORT if not 80, API_KEY
- klipper (Moonraker): PRINTER_HOST, PRINTER_PORT (usually 7125),
API_KEY if Moonraker requires authentication
- duet: PRINTER_HOST, PRINTER_PORT if not 80
- repetier: PRINTER_HOST, PRINTER_PORT (usually 3344), API_KEY
- bambu: PRINTER_HOST, BAMBU_SERIAL, BAMBU_TOKEN (the LAN access code),
and BAMBU_MODEL
- prusa: PRINTER_HOST (PrusaLink address or connect.prusa3d.com), API_KEY
- creality: PRINTER_HOST, PRINTER_PORT if not 80, API_KEY (bearer token)
For Bambu Lab, confirm the exact printer model with me; never guess it, and
explain any LAN Only Mode or Developer Mode setting I need to enable.
Keep keys, tokens, and access codes in local/private configuration; do not
repeat them in chat.
Bambu Lab has the most hardware testing. The other backends use each
system's HTTP API and rely on community reports, so tell me plainly if a
backend does not respond as the guide describes.
Offer these optional extras, and set them up only if I choose them:
- Blender MCP for model edits: uvx mcp-for-blender (formerly blender-mcp,
which now installs it as a compatibility wrapper). Its Blender addon must be
installed, enabled, and connected inside Blender.
- A slicer for slice_stl: look for an installed PrusaSlicer, OrcaSlicer,
FULU OrcaSlicer-bambulab, Bambu Studio, or CuraEngine before suggesting
an install.
Configure executables in the server environment. Do not enable
MCP_ALLOW_EXECUTABLE_ARG. Leave print confirmation on: do not set
PRINT_REQUIRE_CONFIRMATION=0 or BAMBU_REQUIRE_CONFIRMATION=0 unless I ask
for a headless setup.
Verify that the MCP initializes, lists its tools, and reads printer status.
Do not start a print or change printer settings, including temperatures, as
a setup test. Tell me what worked and whether I need to restart or reload
the harness.
Setup reference · Printer backends · Slicing guide · Blender MCP
Ask for the result you want, not the steps. Current models plan across tools: they search the web, read photos, look up exact dimensions, edit models, slice, and print. Expect a question or two when a choice matters, such as which printer or filament to use, or whether to start the print.
This server provides the printer, slicing, and mesh tools. Web search, photos, and Blender edits come from your agent and its other connections, such as a Blender MCP server. What your agent can read back depends on the printer system; see printer backends.
| I want to… | Read next |
|---|---|
| Connect this MCP to my agent | Copy the setup request |
| See what my agent can do with it | What to ask your agent |
| Find the credentials for my printer | Printer backend setup |
| Configure it by hand, with Docker, or over HTTP | Installation and configuration reference |
| Slice from my agent or troubleshoot slicing | Slicing guide |
| Use open-source slicing for a Bambu Lab printer | FULU guide |
| Model or refit a part in Blender | Blender guide and Blender tools |
| See release changes or contributor credit | Changelog, releases, and contributors |
See the changelog for versioned changes. The next release brings the print safety gate to every printer backend: a human confirms every print start and positive heating command, and the server checks the exact G-code against hardware and material ceilings. It also adds Bambu-compatible CLI slicing with resolved machine presets and a template registry, blender_mcp_export_stl for verified STL export from Blender, and this documentation site. Release 1.2.9 fixes Bambu FTPS uploads that failed with "Premature close" (#22), adds standard Blender MCP discovery, forwarding, and verified STL edits, requires the Bambu printer model for raw print starts, and isolates each server's scratch files. Separately, #20 and #21 made per-call executable selectors, such as a slicer path or bridge command, require an explicit opt-in.
mcp-3d-printer-server is a Model Context Protocol server for 3D printers. It gives an agent printer control (status, files, upload, start, cancel, and temperatures), STL mesh tools, slicer automation, Bambu Lab project printing, and an optional bridge to a Blender MCP server. One PRINTER_TYPE selects the default backend, and every printer tool accepts a per-call type and host, so one server can reach more than one printer.
| Backend | PRINTER_TYPE | Testing evidence |
|---|---|---|
| Bambu Lab | bambu | Most tested, including maintainer hardware testing shared with the Bambu-only fork |
| OctoPrint | octoprint | Community-reported |
| Klipper (Moonraker) | klipper | Community-reported, including a Creality K1 Max through Moonraker |
| PrusaLink and Prusa Connect | prusa | Community-reported |
| Duet | duet | Implemented; no hardware reports yet |
| Repetier-Server | repetier | Implemented; no hardware reports yet |
| Creality | creality | Implemented; no hardware reports yet |
What each backend reads and sends differs. See printer backend setup for the exact API calls, credentials, and linked reports.
Note on resource usage. The STL tools load the entire mesh into memory. Large or complex files (over about 10 MB) can use a lot of memory. See General Limitations and Considerations.
FULU OrcaSlicer-bambulab is a first-class slicer target for Bambu Lab projects (SLICER_TYPE=orcaslicer-bambulab; aliases include fulu-orca and orca-studio), and the default slicer when PRINTER_TYPE=bambu and no slicer is configured. slice_stl and print_3mf auto-slicing use its project command line, and check_fulu_orca_setup inspects the install and runtime payload.
The optional FULU BambuNetwork bridge is a separate runtime. fulu_bambu_network_rpc can probe it and send guarded RPC calls, but the server never switches a print from its local MQTT and FTPS path to BambuNetwork or the cloud on its own.
Follow the FULU guide for platform runtime setup, bridge probes, and the current macOS and Windows testing status.
PRINTER_TYPE: OctoPrint, Klipper (Moonraker), Duet, Repetier-Server, Bambu Lab, PrusaLink or Prusa Connect, and Crealitytype, host, port, and api_key arguments for working with more than one printercounterpart/1 tools shared with bambu-printer-mcp: one progress shape for every firmware (state, job, progress, time left, layers, temperatures, problems), detected printer capabilities, camera snapshots, and the loaded filament (Spoolman on Moonraker).3mf over FTPS and start it over MQTT with the plate's G-code path, MD5, AMS mapping, and calibration flags, after checking the plate against a fresh printer report; auto-slice unsliced projects with FULU OrcaSlicer-bambulab or Bambu StudioAll STL tools load the full mesh into memory. Tools that change a model write a new file to the server's temporary directory, named after the input with a suffix such as _scaled, and return its path; the input file is not modified.
Inspect an STL file without modifying it. Returns the bounding box, dimensions, center, vertex count, and face count.
{
"stl_path": "/path/to/model.stl"
}
Scale a model uniformly with scale_factor, or per axis with scale_x, scale_y, and scale_z. When any axis value is given, unspecified axes stay at 1.0.
{
"stl_path": "/path/to/model.stl",
"scale_factor": 1.2
}
{
"stl_path": "/path/to/model.stl",
"scale_x": 1.2,
"scale_y": 1.0,
"scale_z": 1.5
}
Rotate a model around the X, Y, and Z axes, in degrees. Omitted axes default to 0.
{
"stl_path": "/path/to/model.stl",
"rotate_x": 0,
"rotate_y": 0,
"rotate_z": 90
}
Move a model along the X, Y, and Z axes, in millimeters. Omitted axes default to 0.
{
"stl_path": "/path/to/model.stl",
"translate_x": 10,
"translate_y": 5,
"translate_z": 0
}
Add solid geometry underneath the model to raise and widen its base. extension_inches is in inches and is converted to millimeters (25.4 mm per inch).
{
"stl_path": "/path/to/model.stl",
"extension_inches": 0.25
}
Merge vertices closer together than tolerance (millimeters, default 0.01). This can close small gaps and slightly simplify the mesh.
{
"stl_path": "/path/to/model.stl",
"tolerance": 0.01
}
Move the model so the center of its bounding box is at the origin (0, 0, 0).
{
"stl_path": "/path/to/model.stl"
}
Find the model's largest flat face and rotate the model so that face rests on the XY plane (Z = 0). Works best on models with a clearly dominant flat face.
{
"stl_path": "/path/to/model.stl"
}
Apply a scale, rotation, or translation to one section of a model: the top, bottom, or center third of its bounding box, or a custom box. value_x, value_y, and value_z are scale factors, degrees, or millimeters depending on transformation_type.
{
"stl_path": "/path/to/model.stl",
"section": "top",
"transformation_type": "scale",
"value_x": 1.5,
"value_y": 1.5,
"value_z": 1.5
}
A custom section requires all six bounds:
{
"stl_path": "/path/to/model.stl",
"section": "custom",
"transformation_type": "rotate",
"value_x": 0,
"value_y": 0,
"value_z": 45,
"custom_min_x": -10,
"custom_min_y": 0,
"custom_min_z": -10,
"custom_max_x": 10,
"custom_max_y": 20,
"custom_max_z": 10
}
Render an SVG with front, side, top, and isometric views of a model. width and height set each view's size in pixels (default 300).
{
"stl_path": "/path/to/model.stl",
"width": 400,
"height": 400
}
The SVG is a simplified schematic, not a photorealistic render.
Every printer tool accepts host, port, type, and api_key, and Bambu printers also use bambu_serial and bambu_token. Omitted values fall back to PRINTER_HOST, PRINTER_PORT, PRINTER_TYPE, API_KEY, BAMBU_SERIAL, and BAMBU_TOKEN. Keep keys in the server configuration rather than passing them in calls.
What each call does depends on the backend; see printer backend setup for the exact API routes.
Every print start and positive heating command, on every backend, goes through a safety gate: the server inspects the exact G-code it will start, checks each heater target against hardware and material ceilings, checks that the printer is ready, and asks a human to confirm through MCP elicitation. Turning a heater off (temperature: 0), pause_print, and cancel_print are never gated. resume_print reheats and moves the printer, so it only resumes a job this server inspected and started, and asks a person first.
Read the printer's current status. The response is the backend's own status data: Bambu returns temperatures, job state, progress, layers, time remaining, and AMS data; OctoPrint returns printer state and temperatures; Klipper returns the Moonraker host state only.
{
"type": "klipper",
"host": "192.168.1.50",
"port": "7125"
}
List the files stored on the printer or its host software. On Bambu printers it lists the cache/, timelapse/, and logs/ directories.
{
"type": "octoprint",
"host": "192.168.1.100"
}
Upload G-code to the printer, and optionally start it. Pass gcode_path for a local file, or gcode with the content (or a local path). filename defaults to the basename of gcode_path; when printing, use a plain filename so the started file is exactly the uploaded one.
{
"type": "klipper",
"host": "192.168.1.50",
"port": "7125",
"gcode_path": "/path/to/benchy.gcode",
"print": true,
"material": "PETG"
}
print, the file is only uploaded and nothing is inspected or started.print: true, the exact uploaded bytes are inspected first (every S and R heater target, tool changes, and hardware and material ceilings), the printer's state is checked, and a human confirms before the job starts.; filament_type = PLA) or the material argument, which must not contradict the file.cache/ over FTPS, and printing also needs the model (bambu_model or BAMBU_MODEL). Automatic printing after upload supports .gcode only; print .3mf projects with print_3mf.jobName is the remote file name. counterpart_print_progress reports the same name as job.name while that job runs.Start a G-code file that is already stored on the printer. The server downloads that exact file, inspects it, checks the printer's state, asks a human to confirm, and then starts a uniquely named checked copy. This works on Bambu Lab, OctoPrint, Klipper (Moonraker), and Duet. Repetier, Prusa, and Creality refuse, because their adapters have no verified download route; use upload_gcode with print: true instead.
{
"type": "octoprint",
"host": "192.168.1.100",
"filename": "benchy.gcode",
"material": "PLA"
}
Pass material when the file has no filament_type metadata. On Bambu printers it also needs the model and supports .gcode files only; bare filenames are looked up in cache/. The result's jobName is the checked copy's name (checked-<id>-<file>), which is the name the printer reports for the job.
Cancel the current print job. Cancelling is never gated and also cancels checked prints still waiting to start, including a pending resume_print. A cancelled job cannot be resumed; use pause_print to stop temporarily.
{
"type": "prusa",
"host": "192.168.1.120"
}
Pause the current print. Pausing is never gated. Routes: OctoPrint POST /api/job ({"command":"pause","action":"pause"}), Moonraker POST /printer/print/pause, PrusaLink PUT /api/v1/job/<id>/pause, Duet M25, Repetier @pause, and Creality printers that run Moonraker. Bambu pause is in bambu-printer-mcp.
{
"type": "klipper",
"host": "192.168.1.50",
"port": "7125"
}
Resume a paused print. Resume reheats and moves the printer, so it is gated like a print start. It resumes only the job this server instance inspected and started, after a fresh report that the same job is paused, and after a person confirms through MCP elicitation (unless the server sets PRINT_REQUIRE_CONFIRMATION=0). OctoPrint, Klipper and Duet re-download the file and compare its SHA-256 with the inspected bytes before asking; PrusaLink, Repetier and Creality have no download route here, so the job is matched by name only. The printer is read again after the confirmation. Cancelling the job, or a report that it ended, retires it, so a later job that reuses the name is never resumed. A job started at the printer, from another app, or before the server restarted is refused; resume it at the printer. Duet's download route needs the Duet Software Framework, so a standalone board's resume is refused. The result's bytesVerified says whether the bytes were re-read. OctoPrint drops a resume sent while it is still pausing, so the server waits for a settled pause (job.stage "Pausing" means not yet). Routes: OctoPrint {"command":"pause","action":"resume"}, Moonraker POST /printer/print/resume, PrusaLink PUT /api/v1/job/<id>/resume, Duet M24, and Repetier continueJob.
Describe the printer in the shared counterpart/1 shape: the server's name and version, the printer's kind, host and any model, serial or name it reports, and which features work. Capabilities are detected from the firmware, never assumed. For example, camera is http-snapshot only when the firmware names a snapshot URL or the conventional one answers with a JPEG.
{
"contract": "counterpart/1",
"server": { "name": "mcp-3d-printer-server", "version": "1.2.21" },
"printer": { "kind": "klipper", "host": "192.168.1.50", "name": "voron" },
"capabilities": { "progress": true, "layers": true, "camera": "http-snapshot", "filaments": "single",
"pause": true, "resume": true, "cancel": true, "print3mf": false, "gcode": true }
}
Read the printer's state and current job in one shape for every firmware. state is one of idle, preparing, printing, paused, finished, failed, cancelled, offline, or busy. job carries the file name (the same as the upload's jobName), progress (0 to 100), elapsedSec, remainingSec, layer and totalLayers where the firmware reports them, and stage for transitional states. problems lists firmware errors and messages. Optional fields are omitted, never null. A printer that does not answer at all is offline. See progress, camera, pause and resume for each firmware's requests and mapping.
{
"contract": "counterpart/1",
"observedAt": "2026-11-01T12:00:00.000Z",
"state": "printing",
"job": { "name": "checked-4f2a-bracket.gcode", "progress": 25, "elapsedSec": 1200, "remainingSec": 3600, "layer": 12, "totalLayers": 80 },
"temps": { "nozzle": { "actual": 215, "target": 215 }, "bed": { "actual": 60, "target": 60 } },
"problems": []
}
Capture one JPEG frame and return it as base64, with the same arguments and result as bambu-printer-mcp's camera_snapshot plus capturedAt. Pass save_path to also write the file, and timeout_ms (default 8000).
plugins.classicwebcam.snapshot), webcam.snapshotUrl on 1.8, then http://<host>/webcam/?action=snapshot.snapshot_url from /server/webcams/list.staticUrl.PRINTER_CAMERA_SNAPSHOT_URL overrides the source for any printer.Relative URLs and loopback hosts in the firmware's settings are read as the printer itself. The API key is sent only to the printer's own API address, and only a JPEG is accepted.
{ "status": "success", "format": "image/jpeg", "sizeBytes": 78719, "base64": "/9j/4AAQ…", "capturedAt": "2026-11-01T12:00:00.000Z", "source": "moonraker-webcam" }
Report the loaded filament as one external slot, {"slots": [{"id": "ext", "material", "color", "name", "source", "profile"}]}. Moonraker printers with Spoolman report the active spool's material, #RRGGBB colour and name (source: "spoolman"); every other printer reports source: "unknown". Bambu AMS inventory is in bambu-printer-mcp.
Each slot also carries profile: the absolute path of the installed slicer filament profile for its material, which slice_stl takes as load_filaments. It is resolved in the slicer slice_stl uses by default (SLICER_TYPE, SLICER_PATH), for the printer in SLICER_PROFILE. OrcaSlicer searches its bundled profiles/<vendor>/filament, the OrcaSlicer/system copies and the user's OrcaSlicer/user/<id>/filament presets, reading filament_type and compatible_printers through inherits. PrusaSlicer and Slic3r search the data folder's filament/*.ini presets. The material must equal the profile's filament_type exactly (case aside): a PLA spool never gets a PLA-CF profile. Profiles that list other printers are skipped; one that lists this printer comes first, then profiles for every printer, user presets before bundled ones. With no reported material, profile is the filament slice_stl loads by default (FILAMENT_PROFILE), when that file exists. When nothing resolves, profile is omitted.
Set a target temperature for a printer component. Use bed or extruder; Bambu also accepts nozzle, tool, and tool0. OctoPrint nozzle targets are sent to tool0.
{
"type": "klipper",
"host": "192.168.1.50",
"port": "7125",
"component": "extruder",
"temperature": 215,
"material": "PLA"
}
temperature must be a finite number of 0 or more. 0 switches the heater off and is never gated.material (for example PLA, PETG, or ABS), including for spools without RFID.bambu_model (or BAMBU_MODEL), and nozzle heating uses nozzle_diameter (0.2, 0.4, 0.6, or 0.8; default NOZZLE_DIAMETER or 0.4). Both are checked against the live printer.These tools work with PRINTER_TYPE=bambu (or type: "bambu"). Set up LAN Only Mode, the serial number, the access code, and the model as described in Bambu Lab setup.
Upload a sliced .3mf project to a Bambu printer over FTPS and start it with an MQTT project_file command that carries the plate's G-code path, its MD5, the AMS mapping, and the calibration flags. bambu_model is required (or BAMBU_MODEL); without it the server asks through MCP elicitation when the client supports it, or returns an error. The wrong model can crash the bed into the nozzle.
Before anything is uploaded, the server inspects a private copy of the selected plate (model, nozzle, bed type, materials, and every heater target). It checks them against per-model hardware limits, material ceilings, and a fresh MQTT report of the printer's model, serial, nozzle, state, errors, and loaded filament. A human then confirms, and the report is checked again before dispatch.
{
"three_mf_path": "/path/to/bracket.gcode.3mf",
"bambu_model": "p1s",
"bed_type": "textured_plate",
"use_ams": true,
"ams_mapping": { "Generic PLA": 0 },
"bed_leveling": true,
"flow_calibration": true,
"vibration_calibration": true,
"layer_inspect": true,
"timelapse": false
}
ams_mapping is an object whose values are AMS slot numbers. When it is omitted, the mapping embedded in the 3MF is used; with no mapping at all, the print runs without AMS. use_ams: false turns AMS off.BAMBU_DISPATCH_CHECK_MS) and returns dispatch: "started" or "unconfirmed". If the firmware refuses the command (HMS 0500-0500-0001-0007 on firmware 01.08.05 and later without Developer Mode), the call fails and says so; the checked file stays on the printer's storage.nozzle_type (stainless_steel, hardened_steel, tungsten_carbide, brass) sets the installed nozzle when the project must be auto-sliced. The job's nozzle type must match the printer's report.bed_type is one of textured_plate, cool_plate, engineering_plate, or hot_plate (default BED_TYPE, else textured_plate). It must match the plate's bed metadata, so a file sliced for another plate, or without bed metadata, is refused until bed_type matches.nozzle_diameter accepts 0.2, 0.4, 0.6, or 0.8 (default NOZZLE_DIAMETER or 0.4).layer_height, nozzle_temperature, bed_temperature, and support_enabled are accepted but not applied: those settings are baked into the sliced file. Change them in the slicer.Inspect a FULU OrcaSlicer-bambulab install: the executable, the platform runtime payload, the install and verify commands, and optionally a BambuNetwork bridge handshake. Paths default to the server environment; see checking the setup.
{
"platform": "darwin",
"run_bridge_probe": true
}
bridge_command, and slicer_path, plugin_dir, or runtime_dir with run_bridge_probe: true, require MCP_ALLOW_EXECUTABLE_ARG=1.
Call one FULU BambuNetwork bridge method for diagnostics. Read-only methods such as bridge.handshake, bridge.runtime_info, and net.get_user_print_info are allowed by default. Agent and session setup methods require allow_mutating_method: true. Raw print methods (such as net.start_print), printer messages (net.send_message), file transfers, and unknown methods are refused, because they would bypass the print safety gate; print with print_3mf. bambu_model is informational only. See bridge RPC.
{
"method": "bridge.handshake"
}
The bridge command comes from FULU_BAMBU_BRIDGE_COMMAND; a per-call bridge_command requires MCP_ALLOW_EXECUTABLE_ARG=1.
See the slicing guide for slicer types, profiles, and troubleshooting. Slicing a file yourself in the slicer's GUI and uploading the result is the most predictable path.
Slice an STL or 3MF with the configured slicer and return the output path: G-code for PrusaSlicer, Slic3r, generic OrcaSlicer, and CuraEngine, or a sliced .3mf for the Bambu-compatible path.
The Bambu-compatible path is used for Bambu Studio, FULU OrcaSlicer-bambulab, and OrcaSlicer when the call passes bambu_model:
bambu_model (or BAMBU_MODEL, asked for when missing) and nozzle_diameter (default NOZZLE_DIAMETER or 0.4). The exact <model> <diameter> nozzle preset must exist in the selected slicer installation. Its inherits and include chains are resolved before the slicer runs.slicer_profile (or SLICER_PROFILE) is a process profile only. A machine;process list is rejected with instructions.p1s, p1p, p2s, x1c, x1e, a1, a1mini, h2d, h2s, and h2c when the installed slicer has that preset. Printing still accepts only the seven models in BAMBU_MODEL.Metadata/plate_<n>.gcode. Failures stop with the slicer's exit code or signal, the tails of its output, and slicing-specific advice.{
"stl_path": "/path/to/phone-case.stl",
"slicer_type": "bambustudio",
"bambu_model": "p1s",
"nozzle_diameter": "0.4",
"bed_type": "textured_plate",
"load_filaments": "/path/to/filaments/tpu-95a-hf.json",
"arrange": true,
"orient": false
}
Options for the Bambu-compatible path:
| Argument | What it does |
|---|---|
bed_type | Build plate: textured_plate, cool_plate, engineering_plate, or hot_plate (default BED_TYPE or textured_plate) |
nozzle_type | Installed nozzle: stainless_steel, hardened_steel, tungsten_carbide, or brass (default BAMBU_NOZZLE_TYPE, else the preset's stock nozzle). Printing requires it to match the printer's reported nozzle |
load_filaments | Filament profile JSON paths in slot order, ;-separated. One profile applies to every slot; otherwise give one per slot. PrusaSlicer and Slic3r take one .ini filament preset. filament_profile is an alias; get_printer_filaments reports a matching path as slots[].profile |
load_filament_ids | Comma-separated filament IDs mapping filaments to objects, such as 1,2,3,1 |
filament_colours | One #RRGGBB per filament slot, ;-separated. Defaults to the input 3MF's colours, then each profile's colour |
template_3mf_path, template_name, template_dir | Reuse a 3MF's or profile's slicer settings as the process profile (defaults: BAMBU_TEMPLATE_3MF_PATH, BAMBU_TEMPLATE_DIR). An explicit slicer_profile takes precedence |
uptodate, min_save, skip_modified_gcodes | Refresh 3MF presets to the installed slicer, write a smaller 3MF, or ignore custom G-code embedded in an input 3MF |
orient, arrange, ensure_on_bed, repetitions, clone_objects, skip_objects, slice_plate | Placement: auto-orient, auto-arrange (STL input is arranged by default; set false to keep a 3MF layout), drop floating models onto the bed, copies (OrcaSlicer copies an STL with --clone-objects), a total clone count for the loaded model, objects to skip, and which plate to slice (0 = all) |
scale, rotate, rotate_x, rotate_y | Transform before slicing (uniform scale; rotations in degrees). For OrcaSlicer STL input the server applies them to a mesh copy in Orca's order to avoid a CLI crash; see OrcaSlicer CLI limits |
enable_timelapse, allow_mix_temp | Insert timelapse parking moves; allow filaments with different temperature needs on one plate |
layer_height (mm), wall_loops (a whole number), and sparse_infill_density (such as "15%") are written over the selected profile on every slicer: as the process keys layer_height, wall_loops, and sparse_infill_density for Bambu Studio and OrcaSlicer, and as --layer-height, --perimeters, and --fill-density for PrusaSlicer and Slic3r. They win over a template. Cura refuses them; set them in its definition file. Your profile files are never modified.
Generic slicers keep their own profile formats: PrusaSlicer and Slic3r load one exported config, plus an optional filament preset .ini from load_filaments, and generic OrcaSlicer takes machine.json;process.json, optionally followed by |filament.json. slicer_type, slicer_profile, and filament_profile fall back to SLICER_TYPE, SLICER_PROFILE, and FILAMENT_PROFILE. The slicer executable comes from SLICER_PATH; a per-call slicer_path requires MCP_ALLOW_EXECUTABLE_ARG=1. See the slicing guide.
Slice an STL or 3MF with a named template from the local template registry. The template supplies the process settings; the machine preset still comes from bambu_model and nozzle_diameter. It takes the same arguments as slice_stl, and an explicit slicer_profile in the call overrides the template.
{
"stl_path": "/path/to/bracket.stl",
"template_name": "p1s-petg-strong",
"bambu_model": "p1s"
}
List the saved slicing templates (.3mf, .json, .config) in the registry directory, BAMBU_TEMPLATE_DIR (default ~/Sync/bambu/templates), or in template_dir.
{}
Copy a local .3mf, .json, or .config file into the template registry. template_name defaults to the source filename without its extension.
{
"source_path": "/path/to/p1s-petg-strong.3mf",
"template_name": "p1s-petg-strong"
}
Read the slicer settings in a 3MF, an extracted project_settings.config, or a profile JSON without slicing: layer height, infill, walls, supports, brim, bed, printer, and filaments. Pass source_path, or template_name to read a saved template.
{
"template_name": "p1s-petg-strong"
}
Report every heater target in a G-code file: S and R forms, tool-addressed targets, RepRapFirmware G10/M568, and Klipper SET_HEATER_TEMPERATURE. An expected extruder_temp or bed_temp matches only when it equals the file's highest target, which the result returns as peak. It is read-only; the printing tools enforce their own safety gate.
{
"gcode_path": "/path/to/model.gcode",
"extruder_temp": 240,
"bed_temp": 80
}
Extend an STL's base, slice it, and print it through the same checked print gate as upload_gcode and print_3mf, including the human confirmation. If you pass extruder_temp or bed_temp, each must equal the sliced job's highest target (S and R forms, every tool); a mismatch stops before anything is uploaded. Pass material when the sliced G-code has no filament_type metadata. On a Bambu printer with a Bambu-compatible slicer, the sliced .3mf goes through the print_3mf checks, and the printer model is required.
{
"stl_path": "/path/to/model.stl",
"extension_inches": 0.1,
"extruder_temp": 210,
"bed_temp": 60,
"material": "PLA",
"type": "octoprint",
"host": "192.168.1.100"
}
Use slice_stl, confirm_temperatures, and upload_gcode separately when you want to review the sliced file before the print is offered for confirmation.
Connect a standard stdio Blender MCP server with BLENDER_MCP_COMMAND (for example, the full path to uvx) and BLENDER_MCP_ARGS (for example ["mcp-for-blender"]). The mcp-for-blender project was formerly published as blender-mcp, which still works as a compatibility wrapper. Install and enable its addon in Blender and start the addon's connection. Blender and this server must be able to read the same local files. Printer tools work without Blender configured. Keep Blender open while your agent works: the addon does not run in background mode. See the Blender guide for setup, units, and a worked example that refits a phone case for a new phone end to end.
Inspect the Blender MCP configuration. With connect: true, it starts the configured server, initializes it, and lists its tools by name and summary. Pass tool_names to get the full input schemas of the tools you are about to call (include_schemas: true returns all of them, which is large). A successful connection does not prove the addon inside Blender is running; call get_scene_info through blender_mcp_call to check that.
{
"connect": true,
"tool_names": ["execute_blender_code"]
}
Call a tool the Blender MCP server advertises, such as get_scene_info or execute_blender_code, with arguments matching its discovered schema. The full MCP result, including images and errors, is returned. Calls can change the active Blender scene and are never retried automatically. Preserve the user's own words in user_prompt when the remote tool asks for it.
{
"tool_name": "get_scene_info",
"arguments": { "user_prompt": "Inspect the scene before preparing a print." }
}
Export named objects from the live Blender scene to a new STL for slicing. Use it after modelling or editing through blender_mcp_call; Blender MCP's own export_scene writes GLB or FBX, not STL. The export writes world-space geometry with modifiers applied, without changing the scene, selection, or mode.
{
"object_names": ["PhoneCase"],
"output_path": "/path/to/phone-case.stl",
"user_prompt": "Make it fit my iPhone 17 Pro Max."
}
output_verified: true, the triangle count, and bounding_box.dimensions measured from the written file. Compare the dimensions with what you expect before slicing.scale: 1 is right. If a part was modelled in metres, the result warns that it is under 1 unit across; export again with scale: 1000.output_path must be new and its parent must exist; nothing is ever overwritten. On any Blender error, mismatched receipt, or invalid file, nothing is published.Import an STL into Blender, apply ordered edits, and export a new STL. Supported operations are decimate:<ratio> (greater than 0, up to 1), remesh:<voxel size> (positive, in STL units), and boolean_union:<STL path>. Use blender_mcp_call for anything else.
{
"stl_path": "/path/to/model.stl",
"output_path": "/path/to/model-edited.stl",
"operations": ["decimate:0.5"],
"user_prompt": "Reduce the triangle count for printing.",
"execute": false
}
execute: false) validates the request and returns the plan and generated Python without launching Blender. Set execute: true to apply it, reusing the preview's output_path.output_path selects a unique model-edited-<id>.stl beside the input. Existing input and output files are never overwritten.BLENDER_MCP_TIMEOUT_MS, default 120000) that also cover file validation. Interrupted edits are never replayed; inspect Blender before retrying, because an edit may already have started.Legacy BLENDER_MCP_BRIDGE_COMMAND shell commands remain supported when no standard command is configured. They receive JSON on stdin (modelPath, operations, source, and stlPath) and the same JSON in MCP_BLENDER_PAYLOAD, and their results report output_verified: false. A per-call bridge_command requires MCP_ALLOW_EXECUTABLE_ARG=1.
Design parts from scratch in Autodesk Fusion through faust-machines/fusion360-mcp-server, pinned to commit 19b9f1e95192. Set FUSION_MCP_COMMAND to the full path of uvx; FUSION_MCP_ARGS defaults to the pinned server in socket mode. Install that commit's Fusion360MCP add-in in Fusion and set it to Run on Startup. The client stays connected for the life of this server, only FUSION_* settings reach the Fusion server, and requests are never replayed. See the Fusion guide for setup, units, and the open-document requirement.
Report configured, connected, addinReachable, fusionRunning, the Fusion server's tools with their schemas, launched, pin (the faust-machines commit), and error when the server could not start. addinReachable means the add-in answered its own ping within 2 s on FUSION_MCP_PORT (default 9877, because Blender's MCP addon holds 9876). connected is true only when the add-in also answered through the Fusion server. With launch: true and Fusion not running on this Mac, it runs open -a "Autodesk Fusion" --env FUSION_MCP_PORT=<port> and waits up to 90 s for the add-in.
{ "launch": true }
Call any tool the Fusion server advertises, such as create_sketch, extrude, fillet, set_parameter, or execute_code, with arguments matching its discovered schema. The full MCP result and errors are returned, as for blender_mcp_call. Calls change the active design and are never retried. Fusion lengths are in centimetres unless a tool says otherwise.
{ "tool_name": "create_sketch", "arguments": { "plane": "xy" } }
Open a new parametric design document, so the Fusion tools have an active design. At the pinned commit, Fusion must already have some document open: no tool works from Fusion's home screen (issue #12).
Write <name>.stl (from export_stl), <name>.f3d (from export_f3d), and <name>.parameters.json (the design's user parameters) into output_dir, and return their absolute paths as stl, f3d, and parameters. The STL is one body: the only visible solid body, or body_name, whose name must be unique across all bodies, hidden ones and component copies included. It is checked as a finite triangle mesh, and stlUnits reports whether its numbers are millimetres. Existing files are never overwritten, and a failed export publishes nothing.
{ "output_dir": "/path/to/project", "name": "bracket" }
Resources follow the MCP resource protocol. They use the configured PRINTER_TYPE and credentials; the host segment selects the printer address.
printer://{host}/status: the printer's current status, as returned by get_printer_statusprinter://{host}/files: the file list, as returned by list_printer_filesprinter://{host}/file/{filename}: details for one file. On Bambu printers this only reports whether the file exists.For example, printer://192.168.1.100/status reads the status of the printer at that address.
get_printer_status returns each backend's own status data: Bambu includes progress, layers, and time remaining; OctoPrint's /api/printer and Moonraker's /printer/info have no job progress. Use counterpart_print_progress for job progress on every backend. Its OctoPrint and Klipper mappings were checked against OctoPrint 1.8 and 1.11 virtual printers and a simulated Klipper printer; PrusaLink, Duet, Repetier, and Creality follow their API documentation and have not been checked on hardware.resume_print refuses a job it did not inspect and start, including one it started before a restart. Repetier's pause command and its time fields are not in Repetier's API manual.http://. The Prusa adapter uses HTTPS for Prusa Connect, an https:// host, or port 443.API_KEY for Moonraker hosts that require authentication. Leave it empty only when Moonraker trusts the MCP host. A password-protected Duet cannot be reached yet.print_3mf needs a .3mf with Metadata/plate_<n>.gcode, uploads it to cache/, and starts plate 1. Print settings such as layer height and temperatures cannot be changed at print time. start_print handles plain .gcode files only.ams_mapping values are sorted and padded to five entries; real behavior still depends on firmware, loaded filament, and the project's metadata. For AMS inventory and color matching, see bambu-printer-mcp.M104 or M140 over MQTT, so the printer's firmware and current state decide whether they apply.T0) heats it to the temperature already stored on the printer; activation-only M568 and M144 are refused, but a plain tool change is allowed because every firmware uses it. The safety gate is tested with mocked printer transports and loopback HTTP APIs, plus one real Bambu P1S run that reached the firmware's command check; other printer systems have not been exercised on real hardware in this release.start_print of a file already on the printer works on Bambu Lab, OctoPrint, Klipper, and Duet. Repetier, Prusa, and Creality refuse it; upload the local G-code with print: true instead.lay_flat looks for the largest flat face; results on organic or rounded models can be unpredictable.extend_stl_base adds new geometry beneath the model. Complex or non-planar undersides can produce gaps or intersections at the join, so inspect the result.merge_vertices with a large tolerance can change the model's shape. The 0.01 mm default is safe for most models.modify_stl_section works best on simple geometry. Non-manifold meshes (holes, overlapping faces, internal geometry) can produce unexpected results for any transformation; repair them first in your slicer or a mesh tool.generate_stl_visualization produces a simplified schematic, not a true 3D render, and very detailed models may lose detail.SLICER_TIMEOUT_MS (10 minutes by default).Prompt injection is an open problem for tool-using agents. A downloaded model's description, a README inside an archive, 3MF metadata, or a web page can all contain instructions aimed at your agent. Practical mitigations:
MCP_ALLOW_EXECUTABLE_ARG=1 is set.PRINT_REQUIRE_CONFIRMATION=0 (all printers) or BAMBU_REQUIRE_CONFIRMATION=0 (Bambu only) opts out for headless setups; the first print after a finished job still asks.PRINTER_MAX_NOZZLE_TEMP, PRINTER_MAX_BED_TEMP, PRINTER_MAX_CHAMBER_TEMP, or Bambu's per-model limits). Tool arguments and G-code never raise them.127.0.0.1 by default and has no built-in authentication.BAMBU_MODEL correctly and never substitute a similar model.