bambu-printer-mcp
Control Bambu Lab printers, prepare and slice 3D models, manage AMS/filaments, and run end-to-end print workflows from an MCP-compatible agent.
Get printer status: temperatures, progress, layer, time remaining, HMS/errors.
Read live AMS filament inventory, resolve slicer profiles, and auto-match AMS slots by RFID.
Print pre-sliced or auto-sliced 3MF via direct LAN (MQTT/FTPS), FULU BambuNetwork bridge, or native X2D path.
Slice STL/3MF with Bambu Studio, OrcaSlicer, FULU Orca, and manage slicing templates.
Manipulate STL files: scale, rotate, extend base, merge vertices, center, lay flat, inspect.
Capture chamber camera JPEG snapshots via TCP or RTSP/ffmpeg.
List, upload, and delete files on the printer's SD card; start or upload G-code.
Control jobs: pause, resume, cancel, skip objects, set speed, bed/nozzle temperature, fans, light, airduct.
Start/stop AMS filament drying and trigger AMS RFID re-read.
Integrate Blender MCP for advanced mesh edits like decimate, remesh, and boolean union.
Hand off printable files to Bambu Connect or use X2D native controls.
Enables direct control and monitoring of Bambu Lab 3D printers, supporting status updates, file management via FTPS, and full 3MF/STL print workflows.
Integrates with an optional Blender MCP bridge to perform advanced mesh operations and 3D model manipulations.
Employs the MQTT protocol for real-time printer communication, allowing for job management and G-code command dispatch.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@bambu-printer-mcpcheck the status of my current print and the nozzle temperature"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
bambu-printer-mcp
Thank you, FULU Foundation, Louis Rossmann, and the OrcaSlicer-bambulab contributors. We stand with open-source developers, the right to repair, and your right to control hardware you own. You should be able to choose your software and print without a vendor cloud standing in the way.
Want to skip Bambu's software and cloud? Use FULU OrcaSlicer-bambulab to slice and export, then this MCP's direct LAN path on supported printers and firmware. That workflow does not require Bambu Studio, Bambu Connect, or Bambu Cloud. Start with the FULU setup guide. The optional BambuNetwork bridge is a separate path that still uses Bambu's networking runtime; cloud jobs still use Bambu's services.
A Bambu Lab-focused MCP server for controlling Bambu printers, manipulating STL files, and managing end-to-end 3MF print workflows from Claude Desktop, Claude Code, or any MCP-compatible client.
Browse the documentation site for searchable setup guides, slicing and AMS guidance, and the full tool reference. It is generated from this README and the docs folder.
Built with help from our contributors. Huge thanks to everyone sharing fixes, careful bug reports, and real printer testing!
This is a stripped-down, Bambu-only fork of mcp-3D-printer-server. All OctoPrint, Klipper, Duet, Repetier, Prusa Connect, and Creality Cloud support has been removed. What remains is a focused, lean implementation for Bambu Lab hardware.
Set up with your agent
Tell your agent your printer's model and LAN address, if you know them, then copy and paste this:
Install bambu-printer-mcp in the agent/harness I'm using now.
Read https://github.com/DMontgomery40/bambu-printer-mcp/blob/main/docs/SETUP.md
and https://github.com/DMontgomery40/bambu-printer-mcp/blob/main/docs/FULU.md
for the current setup instructions and supported workflows.
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 bambu-printer-mcp, stdio); use Node.js 24 if a runtime is needed.
Find existing printer settings in relevant local configuration or available
LAN discovery. Confirm the detected printer's model, address, and identity
with me before connecting. Ask only for values you cannot find:
PRINTER_HOST, BAMBU_MODEL, BAMBU_SERIAL, and BAMBU_TOKEN (the LAN access code).
Keep credentials in local/private configuration; do not repeat access codes
or tokens in chat. Never guess the printer model.
Use direct LAN printing by default. Explain any LAN/Developer Mode setting
I need to enable. Prefer FULU OrcaSlicer-bambulab GUI slicing/export; discover
an existing slicer before suggesting an install. For FULU/Orca CLI auto-slicing,
require MCP 1.1.11+ and its matching installed profile tree (see guide).
A slicer is not needed here to print a pre-sliced file. Configure the optional FULU
BambuNetwork bridge only if I choose it, and explain its runtime/auth needs.
X2D supports status and slicing; native printing requires macOS and a locally built helper.
If this harness does not already provide code mode or an equivalent, suggest
a compatible code-mode integration as an optional addition. It is not required;
finish ordinary MCP setup without it unless I choose to add it.
Verify that the MCP initializes, lists its tools, and reads printer status.
Do not start a print or change printer settings as a setup test. Tell me what
worked and whether I need to restart or reload the harness.Setup reference · FULU guide · Optional code mode
Related MCP server: Klipper MCP Server
What to ask your agent
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 filament to use or whether to start the print.
This server provides the printer, slicing, AMS, and mesh tools. Web search, photos, and Blender edits come from your agent and its other connections, such as a Blender MCP server. Printing a model your agent edited uses CLI slicing with your installed slicer presets; see the slicing guide.
Start from anything
"Here's a phone stand on MakerWorld. Make it fit the new iPhone and print it in black."
Your agent looks up Apple's published dimensions, adjusts the stand in Blender, slices it for your printer, and finds the AMS tray with black filament."I want one of these." (with a photo of a planter you saw at a café)
It works out the shape and size from the photo, finds or models a matching design, and asks about anything the photo can't show."Can you print a replacement?" (with a photo of a snapped dishwasher rack clip)
It asks for a measurement or two where the fit matters, models the part, and prints it in a loaded material that suits the job.
From anywhere, while it prints
If your agent is always on, such as OpenClaw or Hermes Agent running on a computer at home, message it from Telegram or any other chat app. For direct LAN printing, the server runs on the printer's local network; you don't have to.
"How's the print going? Send me a picture."
It reports progress and time remaining, and sends a snapshot from the chamber camera."The corner is lifting. Pause it."
It pauses the job so you can decide whether to resume or cancel."One of the parts came loose. Skip it and keep printing the rest."
It finds that object on the plate and skips only that one."Start drying the PETG so it's ready when I get home."
On a heated AMS, it starts the drying cycle for the unit holding that spool.
Before you print
"Take a picture and make sure the bed is clear, then start the bracket I sliced last night."
It checks the camera image before it sends the job."What's loaded in the AMS? Print this in whatever black I have."
It reads the live AMS inventory and matches the file's filaments to your trays."Are there any errors on the printer?"
It reads the printer's HMS diagnostics and explains them.
Start here
I want to… | Read next |
Use open-source slicing and a cloud-free print workflow | |
Connect this MCP to my agent | |
See what my agent can do with it | |
Troubleshoot setup or configure it manually | |
Prepare a printable file or troubleshoot slicing | |
Choose filament trays or inspect a printer | |
Edit an STL through Blender | |
See release changes or contributor credit | Changelog, releases, and contributors |
What's new in bambu-printer-mcp
See the changelog for versioned changes. Recent releases add reliable npm and desktop-extension installs, standard Blender MCP integration, corrected P2S/A1 routing, and safer multi-filament CLI slicing. X2D status and slicing are available, with optional native printing on macOS through the installed Bambu Studio networking plug-in.
Table of Contents
Description
bambu-printer-mcp is a Model Context Protocol server for Bambu Lab 3D printers. A straightforward workflow is: slice in FULU OrcaSlicer-bambulab, OrcaSlicer, or Bambu Studio, export a sliced .gcode.3mf, then pass its path to print_3mf. The default direct LAN path uploads via FTPS and chooses the MQTT command for the target model. See the slicing guide for CLI options, model routing, and validation limits.
What this is not. This package intentionally supports only Bambu Lab printers. It does not include adapters for OctoPrint, Klipper (Moonraker), Duet, Repetier, Prusa Connect, or Creality Cloud. If you need multi-printer support, use the parent project mcp-3D-printer-server instead.
Why a separate package? The parent project carries all printer adapters in a single binary. When working exclusively with Bambu hardware, that breadth adds unnecessary weight. This fork strips the project to its Bambu core for a smaller, faster install. See each project's changelog for its current fixes and supported workflows.
Note on resource usage. STL manipulation loads entire mesh geometry into memory. For large or complex STL files (greater than 10 MB), these operations can be memory-intensive. See General Limitations and Considerations for details.
FULU and open-source printing
FULU OrcaSlicer-bambulab is a supported slicer target (SLICER_TYPE=orcaslicer-bambulab; aliases include fulu-orca and orca-studio). Use its GUI to export a sliced project for direct LAN printing, or configure its CLI with matching installed profiles. From 1.1.11, FULU/Orca share the machine-preset gate and profile safety checks.
The optional FULU BambuNetwork bridge exposes bambu_network_bridge_status, bambu_network_call, and print_3mf_bambu_network, also reachable through print_3mf with connection_mode: "bambu_network". Slicer selection does not enable the bridge. It needs a separately installed FULU runtime and an explicit launch command; cloud printing also needs an authenticated BambuNetwork session.
Follow the FULU setup guide for the direct LAN recipe, Linux/Windows/macOS bridge setup, connection probes, authentication, and troubleshooting. Bridge protocol tests and a successful handshake do not establish a successful physical print.
Features
Get detailed printer status: temperatures (nozzle, bed, chamber), print progress, current layer, time remaining, and live AMS slot data
Query live AMS inventory with resolved Bambu/Orca filament profile paths via
get_printer_filaments. Includes per-tray display names, match confidence (high/medium/low/none), resolution tier (exact-model-nozzle/model/generic/unresolved), and a summary with recommended auto-slice filament. Retries automatically when AMS data hasn't arrived yet (common on first MQTT push from idle printers).List, upload, and delete files on the printer's SD card via FTPS
Capture a JPEG snapshot from the chamber camera. Supports A1, A1 mini, P1S, P1P (TCP-on-6000), and X1, X1C, X1E, P2S, H2, H2S, H2D, H2C, H2D Pro, X2D (RTSP via ffmpeg). Requires ffmpeg in PATH for the RTSP path.
Upload and print pre-sliced
.3mfprojects with checked plate selection and calibration flags. Legacy.gcode.3mfroutes require a single external-spool-only plate; see the slicing guide.Slice through BambuStudio CLI with automatic BBL inheritance/include resolution, per-slot filament colours, and fallback prime-tower placement for multi-nozzle printers. Missing dependencies stop the slice; custom settings and saved project tower positions are preserved. Multi-colour slicing is verified by the contributor on BambuStudio 02.08.02.60 for Windows; older CLI versions have separate limitations. See slicing guide.
Recognize X2D status and slice with its own installed BambuStudio preset (
BAMBU_MODEL=x2d). On macOS,print_3mfselects the native eMMC route after resolving the model, including an elicited model. Install the optional helper as described below; Linux/Windows native print requests fail before slicing or contacting the printer. Legacy FTPS and remote G-code starts remain unsupported for X2D.Parse AMS mapping from the 3MF's embedded slicer metadata (
Metadata/plate_<n>.json+ gcode filament header) and send it correctly formatted per the OpenBambuAPI spec, with correct H2S/H2D/H2Cams_mapping2parallel array formatAuto-match AMS slots by RFID (
auto_match_amsflag onprint_3mf). Resolves requiredtray_info_idxfrom the sliced 3MF against live AMS inventory. Handles same-SKU different-color filaments by matching on(tray_info_idx, tray_color)and tracking already-claimed slots. Dry-run withresolve_3mf_ams_slotsbefore printing.Cancel, pause, and resume in-progress print jobs via MQTT
Skip specific objects during a running multi-object print via
skip_objects(uselist_3mf_plate_objectsto find object IDs first)Set print speed mode (
silent/standard/sport/ludicrous), clear HMS/print errors, trigger AMS RFID re-read, and control H2/P2 airduct mode (cooling/heating) via MQTTStart/stop AMS filament drying (
set_ams_drying) on heated AMS units (AMS Pro / AMS-HT). Sendsprint.ams_controlMQTT command.Set nozzle and bed temperature via G-code dispatch over MQTT
Confirm print starts and positive manual heating through a human preflight prompt. Finished-bed clearance and hardware-error clearing require explicit human acknowledgment; see hardware safety and headless configuration.
Set fan speed (part, auxiliary, chamber) and chamber light mode (on/off/flashing) via MQTT
Read HMS (Health Management System) diagnostics as an MCP resource at
printer://{host}/hms— read-only error summary from the printer, with automatic settle retryStart G-code files already stored on the printer
Collar charm print wrapper (
print_collar_charm) — specialized two-color workflow with fixed tray policy for inner (black, AMS 1 slot 1) and outer (white, AMS 2 slot 1) charm partsSTL manipulation: scale, rotate, extend base, merge vertices, center at origin, lay flat, and inspect model info
Slice STL or 3MF files using an external CLI. BambuStudio, FULU, and Orca require the exact machine preset and resolve BBL dependencies before slicing; see FULU/Orca CLI setup and validation limits.
Inspect slicer settings from a saved 3MF template or extracted profile via
get_slice_settingsEnumerate saved slicing templates from the local registry via
list_templatesSave templates into the local registry via
save_templateSlice directly from a named template via
slice_with_templateFor simple single-material slices, auto-select the printer's current or first loaded AMS filament when no explicit slicer profile or
load_filamentsoverride is providedTemplate-driven slicing can reuse a saved 3MF's process settings while still pulling the live printer filament choice over MQTT
Optional Blender MCP bridge for advanced mesh operations
Dual transport: stdio (default, for Claude Desktop / Claude Code) and Streamable HTTP
AMS (Automatic Material System) Setup
The Bambu AMS is a multi-spool feeder that lets you assign different filaments to different parts of a multi-color or multi-material print. This section explains how AMS slot mapping works with this MCP server.
How AMS slots work
The AMS has 4 slots per unit, numbered 0 through 3. If you have multiple AMS units chained together, the second unit's slots are 4 through 7, and so on. When you slice a model in Bambu Studio or OrcaSlicer, each color/material in the print is assigned to a specific AMS slot.
Automatic AMS mapping from the 3MF
When you slice a model in Bambu Studio, the slicer embeds AMS mapping information inside the 3MF file at Metadata/project_settings.config. The print_3mf tool reads this file automatically and extracts the correct mapping. In most cases, you do not need to specify ams_mapping manually -- the tool handles it.
Manual AMS mapping
If you need to override the embedded mapping (for example, you swapped filament positions since slicing), pass the ams_mapping array to print_3mf:
{
"three_mf_path": "/path/to/model.3mf",
"ams_mapping": [0, 2],
"use_ams": true
}Each element in the array corresponds to a filament slot used in the print file, in the order they appear in the slicer. The value is the physical AMS slot number (0-based) where that filament is currently loaded. In the example above, the first filament in the print uses AMS slot 0, and the second uses AMS slot 2.
Mapping is positional: each entry corresponds to a project filament, and -1 means unused. H2/P2S project-file commands use project-length mapping plus a parallel ams_mapping2; other project-file routes retain at least five positions without truncating longer projects. Prefer ams_slots in plate filament order or auto_match_ams: true when you do not already have the full project mapping.
Single-material prints
For a single-material plate, explicitly select its loaded tray. For example, use AMS slot 2:
{
"three_mf_path": "/path/to/model.3mf",
"ams_slots": [2]
}This expands slot 2 into the correct project filament position. There is no universal fixed default mapping for every model and project.
Printing without AMS
If you are using the direct-feed spool holder (no AMS attached) or want to bypass the AMS entirely, set use_ams to false:
{
"three_mf_path": "/path/to/model.3mf",
"use_ams": false
}For H2 projects with declared filaments, also provide the required mapping; use_ams: false alone does not remove the firmware's mapping requirement. See print_3mf.
Auto-match AMS by RFID
For pre-sliced 3MFs that declare filament types, the auto_match_ams flag on print_3mf (or the standalone resolve_3mf_ams_slots dry-run tool) automatically resolves the required filaments against your live AMS inventory. The matcher works as follows:
Reads the required
tray_info_idxvalues from the 3MF'sMetadata/slice_info.configandMetadata/plate_<n>.jsonReads your live AMS trays from the printer's MQTT status push
Matches on
(tray_info_idx, tray_color)— so two filaments of the same SKU but different colors (e.g. two GFG02 PETG HF spools in black and white) resolve to different slotsTracks already-claimed slots so two requirements can't collapse onto the same physical position
Falls back to SKU-only matching when the 3MF carries no color data or only one tray of that SKU is loaded
If resolution fails, returns a structured missing report with per-requirement reasons:
no_loaded_match— no AMS tray of that SKU is loadedcolor_mismatch— the SKU matches but the loaded color differsexhausted— all matching trays are already claimed by other requirementsno_sku— the 3MF doesn't declare atray_info_idxfor this filament
Dry-run with resolve_3mf_ams_slots before printing to preview the match without uploading or starting a job.
AMS settle-time handling
The first MQTT status push from an idle printer is often sparse (model/module info only) — AMS slot data arrives on a second push. The server's filament inventory and HMS handlers both retry after a 1.5-second settle window when the expected data isn't present in the first response. This is transparent to the caller.
Checking AMS status
Use get_printer_filaments for the parsed, enriched view (profile paths, display names, match confidence) or get_printer_status for the raw AMS data from the printer:
"What filaments are loaded in my AMS right now?"Bambu Communication Notes (MQTT and FTP)
Bambu Lab printers do not use a conventional REST API. Instead, they expose two local protocols that this server uses directly:
MQTT (port 8883, TLS): All printer commands and state reports flow over an MQTT broker running on the printer itself. Authentication uses username bblp and your LAN access code; the serial number identifies the device topics. Commands like starting a print, cancelling a job, and dispatching G-code lines are all MQTT publishes to the device topic. Status data is received by subscribing to the printer's report topic and requesting a push_all refresh. This implementation is based on community reverse engineering documented in the OpenBambuAPI project.
FTPS (port 990, implicit TLS): File operations (upload and directory listing) use FTPS. The printer's SD card is accessible as a filesystem with directories including cache/ (for 3MF and G-code print files), timelapse/, and logs/. Authentication uses the username bblp and your access token as the password.
What this fork fixes
This package works around two protocol-level issues in the underlying bambu-js library.
Bug 1: FTP double-path error in bambu-js.
The bambu-js library's sendFile method has a path construction bug. It calls ensureDir to change the working directory into the target directory (e.g., /cache), and then calls uploadFrom with the full relative path including the directory prefix (e.g., cache/file.3mf). The result is that the file lands at the wrong path on the printer (e.g., /cache/cache/file.3mf instead of /cache/file.3mf), and the subsequent print command fails because it references a file that does not exist at the expected path.
This fork bypasses bambu-js for all uploads and uses basic-ftp directly. The upload function (ftpUpload) connects to the printer, resolves the absolute remote path, changes to the correct directory with ensureDir, and then uploads using only the basename -- avoiding the double-path construction entirely.
// From src/printers/bambu.ts
private async ftpUpload(host, token, localPath, remotePath): Promise<void> {
const client = new FTPClient(15_000);
await client.access({ host, port: 990, user: "bblp", password: token,
secure: "implicit", secureOptions: { rejectUnauthorized: false } });
const absoluteRemote = remotePath.startsWith("/") ? remotePath : `/${remotePath}`;
const remoteDir = path.posix.dirname(absoluteRemote);
await client.ensureDir(remoteDir);
// basename only -- no double-path
await client.uploadFrom(localPath, path.posix.basename(absoluteRemote));
client.close();
}Bug 2: AMS mapping format in the project_file MQTT command.
The bambu-js library's project file command hardcodes use_ams: true and does not support the ams_mapping field at all. Without the fix, the mapping is a simple array of slot indices (e.g., [0, 2]), which does not match the OpenBambuAPI specification.
For the non-H2/P2S project-file route, this implementation retains at least five positions in the ams_mapping array where position i is the project filament index and the value is the AMS slot feeding that filament. For example, a single-filament print from AMS slot 0 sends [0, -1, -1, -1, -1].
This fork sends the project_file command directly via bambu-node (bypassing bambu-js entirely for print initiation) and constructs the mapping in the format the target firmware expects:
// Non-H2/P2S project_file: at least five entries; preserve longer projects
ams_mapping = [0, -1, -1, -1, -1];
// H2S/H2D/H2C/P2S: project-length lookup table + parallel ams_mapping2
ams_mapping = [-1, 1, -1, -1];
ams_mapping2 = [
{ ams_id: 255, slot_id: 255 },
{ ams_id: 0, slot_id: 1 },
{ ams_id: 255, slot_id: 255 },
{ ams_id: 255, slot_id: 255 }
];The command payload also includes all required fields per the OpenBambuAPI spec: param (the internal gcode path within the 3MF), url (the sdcard path), md5 (computed from the plate's embedded gcode), and all calibration flags.
Verified print procedure (H2S, LAN-only, no client cert)
This is the sequence that successfully started a print on an H2S in the original LAN-only test. It's documented here because several common approaches fail on this firmware, and this fork's transport is what makes it reliable.
Result: print started in RUNNING state, printer accepted the MQTT project_file command, no client certificate was required. Authentication was plain bblp + LAN access code over TLS with rejectUnauthorized: false.
What doesn't work on stock bambu-cli:
bambu-cli print start <file>andbambu-cli files uploadboth fail with522 SSL connection failed: session reuse required. Bambu's FTPS server requires TLS session reuse between the control and data channels, which the Go FTPS client in bambu-cli does not negotiate correctly.bambu-cli print start --no-uploadstill opens an FTPS session (to stat the remote file) and hits the same 522.
What works — two-step upload + MQTT dispatch:
Upload the
.gcode.3mfvia curl (curl's OpenSSL backend negotiates FTPS session reuse correctly):curl -k --ftp-pasv --ssl-reqd \ -u "bblp:<ACCESS_CODE>" \ -T /path/to/file.gcode.3mf \ "ftps://<PRINTER_IP>:990/<remote-name>.gcode.3mf"Keep
<remote-name>simple ASCII, ending in.gcode.3mf. The file lands at the FTP root, which corresponds to/data/on the printer's SD card.Send the
project_filecommand over MQTT todevice/<SERIAL>/request:import mqtt from "mqtt"; const payload = { print: { sequence_id: "0", command: "project_file", param: "Metadata/plate_1.gcode", // path inside the 3MF subtask_name: "<remote-name>.gcode.3mf", file: "<remote-name>.gcode.3mf", url: "ftp:///<remote-name>.gcode.3mf", // three slashes, FTP root md5: "", project_id: "0", profile_id: "0", task_id: "0", subtask_id: "0", timelapse: false, bed_type: "auto", bed_leveling: true, bed_levelling: true, flow_cali: true, vibration_cali: true, layer_inspect: true, use_ams: true, ams_mapping: [0, -1, -1, -1, -1] } }; const client = mqtt.connect(`mqtts://<PRINTER_IP>:8883`, { username: "bblp", password: "<ACCESS_CODE>", rejectUnauthorized: false, }); client.on("connect", () => { client.publish(`device/<SERIAL>/request`, JSON.stringify(payload)); });
Notes:
urlmust beftp:///<filename>(three slashes) — the empty host component is required; the printer rejectsftp://<filename>as "unsupported print file path or name".paramuses the internal plate path inside the 3MF (Metadata/plate_1.gcodefor plate 1), not a filesystem path.md5: ""is accepted; populating it is optional.On AMS-equipped H2 printers,
use_ams: falsedoes not suppress mapping lookup if the sliced file declares filaments. The working H2 path is to senduse_ams: trueplus a valid mapping. For H2, the mapping length must match the project-level filament declaration length, and the populated positions must matchplate_<n>.json.filament_ids. Preferams_slotsat the tool layer and let the server expand it. If no mapping is provided for an H2 pre-sliced job with declared filaments, the server fails before sending; pass explicitams_slots, rawams_mapping, orauto_match_ams: true.No client X.509 certificate was needed. The earlier assumption that post-Jan 2025 firmware mandates mTLS on all models does not hold for the H2S in LAN mode — user/password over TLS is sufficient.
The MCP server's
ftpUploadhelper (basic-ftp withsecure: "implicit"and a short idle timeout) performs the equivalent upload natively and is the preferred path when using the server itself; the curl form is the manual-debug equivalent.
Available Tools
STL Manipulation Tools
All STL tools load the full mesh geometry into memory. For files larger than 10 MB, monitor memory usage and prefer testing on smaller files first.
get_stl_info
Inspect an STL file without modifying it. Returns bounding box dimensions, face count, vertex count, and model center.
{
"stl_path": "/path/to/model.stl"
}scale_stl
Scale an STL model along individual axes. Omit any axis to leave it unchanged (defaults to 1.0).
{
"stl_path": "/path/to/model.stl",
"scale_x": 1.5,
"scale_y": 1.5,
"scale_z": 1.0
}For uniform scaling, set all three axes to the same value:
{
"stl_path": "/path/to/model.stl",
"scale_x": 2.0,
"scale_y": 2.0,
"scale_z": 2.0
}rotate_stl
Rotate an STL model around one or more axes. Angles are in degrees. Omitted axes default to 0.
{
"stl_path": "/path/to/model.stl",
"angle_x": 0,
"angle_y": 0,
"angle_z": 90
}extend_stl_base
Add solid geometry underneath the model to increase its base height. Useful for improving bed adhesion on models with a small or unstable footprint.
{
"stl_path": "/path/to/model.stl",
"extension_height": 3.0
}extension_height is in millimeters.
merge_vertices
Merge vertices that are closer together than the specified tolerance. This can close small gaps in a mesh and slightly reduce file size. Useful as a cleanup step before slicing.
{
"stl_path": "/path/to/model.stl",
"tolerance": 0.01
}tolerance is in millimeters and defaults to 0.01 if omitted.
center_model
Translate the model so the center of its bounding box sits at the world origin (0, 0, 0). Useful before applying transformations or exporting for use in another tool.
{
"stl_path": "/path/to/model.stl"
}lay_flat
Identify the largest flat surface on the model and rotate the model so that face is oriented downward on the XY plane (Z = 0). This is a common preparation step before slicing to minimize the need for supports.
{
"stl_path": "/path/to/model.stl"
}Note: this works best on models with a clearly dominant flat face. Results on organic or rounded shapes may be unpredictable.
Printer Control Tools
All printer tools accept optional host, bambu_serial, and bambu_token arguments. If omitted, values fall back to the environment variables PRINTER_HOST, BAMBU_SERIAL, and BAMBU_TOKEN. Passing them explicitly is useful when working with more than one printer.
The server also accepts the alias variables BAMBU_PRINTER_HOST, BAMBU_PRINTER_SERIAL, and BAMBU_PRINTER_ACCESS_TOKEN, plus BAMBU_PRINTER_MODEL and BAMBU_STUDIO_PATH.
get_printer_status
Retrieve current printer state including temperatures, print progress, layer count, time remaining, and AMS slot data. Internally sends a push_all MQTT command to force a fresh status report before reading cached state.
{
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}Returns a structured object with fields including status (gcode_state string), temperatures.nozzle, temperatures.bed, temperatures.chamber, print.progress, print.currentLayer, print.totalLayers, print.timeRemaining, and ams (raw AMS data from the printer).
get_printer_filaments
Read the live AMS inventory and resolve each loaded tray to Bambu Studio
filament profile JSON paths when bambu_model is known. The result includes a
summary, per-slot display labels, profile match confidence, and a recommended
load_filaments value for simple single-material CLI slicing.
{
"bambu_model": "h2d",
"nozzle_diameter": "0.4",
"host": "192.168.1.100",
"bambu_serial": "094...",
"bambu_token": "your_access_token"
}High-signal fields:
summary.loaded_slots,summary.resolved_profile_slots,summary.unresolved_loaded_slots,summary.empty_slotstrays[].display_name,trays[].tray_color,trays[].remain_percenttrays[].resolved_profile_pathtrays[].profile_resolution:exact-model-nozzle,model,generic, orunresolvedtrays[].match_confidence:high,medium,low, ornonerecommended.load_filaments: the profile path the MCP will use for auto-slicing when no explicit filament override is provided
list_printer_files
List files stored on the printer's SD card. Scans the cache/, timelapse/, and logs/ directories and returns both a flat list and a directory-grouped breakdown.
This is a read-only query: it never creates directories. Optional directories absent from a successful root listing return empty lists. Authentication, TLS, permission, and transfer failures are reported as errors rather than empty or partial results.
{
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}camera_snapshot
Capture a single JPEG frame from the printer's chamber camera. Read-only.
Two transports are wired in, picked by bambu_model:
TCP-on-6000 for A1, A1 mini, P1S, P1P. Native protocol per OpenBambuAPI/video.md: TLS on port 6000, 80-byte auth packet (
bblp+ access token), repeating 16-byte frame header + JPEG payload.RTSP for X1, X1 Carbon, X1E, P2S, X2D and H2, H2S, H2D, H2C, H2D Pro. Shells out to ffmpeg with
rtsps://bblp:<token>@<host>:322/streaming/live/1 -frames:v 1. The H2 series wasn't documented in OpenBambuAPI'svideo.mdbut its firmware uses the same RTSP endpoint as X1 (verified live against an H2S, 2026-04-27).
Requires ffmpeg in PATH for the RTSP path. Install with brew install ffmpeg on macOS. Configure a trusted custom binary with the server-side FFMPEG_PATH environment variable, or set MCP_ALLOW_EXECUTABLE_ARG=1 before using the ffmpeg_path tool argument. The TCP-on-6000 path uses native Node TLS and does not require ffmpeg.
{
"save_path": "/tmp/snap.jpg",
"timeout_ms": 8000,
"bambu_model": "h2s",
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}Returns { status, format: "image/jpeg", sizeBytes, base64, savedTo?, transport }. transport is "tcp-6000" or "rtsps-322" so callers can tell which path produced the frame. Pass save_path to also write the bytes to disk; otherwise only the base64 payload is returned.
delete_printer_file
Delete a single file from the printer's SD card via FTPS. Destructive. Requires confirm: true — without it the call returns status: "skipped" and does not contact the printer. Path traversal segments (..) are rejected. Only files under cache/, timelapse/, and logs/ can be deleted.
{
"filename": "old_print.gcode.3mf",
"confirm": true,
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}A bare filename defaults to cache/<filename>. To target other directories pass a relative path:
{ "filename": "timelapse/2026-04-26_12-00.mp4", "confirm": true }{ "filename": "logs/printer.log", "confirm": true }upload_gcode
Write G-code content from a string directly to the printer's cache/ directory. The content is written to a temporary file and uploaded via FTPS.
{
"filename": "calibration.gcode",
"gcode": "G28\nM104 S210\nG1 X100 Y100 Z10 F3000\n",
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}upload_file
Upload a local file (G-code or 3MF) to the printer. If print is true and the file is a .gcode file, start_print_job is called automatically after a successful upload. For .3mf files, upload completes normally but you must use print_3mf to initiate the print (which handles plate selection and metadata).
{
"file_path": "/Users/yourname/Downloads/part.3mf",
"filename": "part.3mf",
"print": false,
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}start_print_job
Start printing a .gcode file that is already on the printer's SD card. Do not use this for .3mf files -- use print_3mf instead, which handles the project_file MQTT command with proper metadata.
{
"filename": "cache/calibration.gcode",
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}If filename does not include a directory prefix, the server prepends cache/ automatically.
cancel_print
Cancel the currently running print job. Sends an UpdateState MQTT command with state: "stop". Not resumable — use pause_print if you may want to continue.
{
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}pause_print
Pause the currently running print job. Sends an UpdateState MQTT command with state: "pause". Resumable via resume_print.
{
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}resume_print
Resume a paused print job. Sends an UpdateState MQTT command with state: "resume".
{
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}clear_hms_errors
Clear HMS or print error state on the printer. Sends Bambu's clean_print_error MQTT command.
{
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}set_print_speed
Set the active print speed mode. Accepted mode values are silent, standard, sport, ludicrous, or their numeric equivalents 1, 2, 3, and 4.
{
"mode": "sport",
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}set_airduct_mode
Set H2/P2 airduct mode to cooling or heating. This is intended for supported printers only.
{
"mode": "cooling",
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}reread_ams_rfid
Trigger a Bambu AMS RFID re-read for one AMS slot. This can move AMS filament; use it only when the printer is idle and unloaded.
{
"ams_id": 0,
"slot_id": 1,
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}set_temperature
Set a checked target temperature for the bed or nozzle through MQTT. Positive targets require the printer model and fresh matching printer telemetry; nozzle heating also requires the declared loaded material and matching nozzle_diameter (default 0.4). Independent model/component and material ceilings apply. A target of zero turns the heater off without requiring material or nozzle metadata. Accepted component values are bed, nozzle, extruder, tool, and tool0.
Manual nozzle heating checks the reported currently loaded AMS tray or external spool. It refuses ambiguous active-nozzle/material selection on multi-nozzle printers; use a checked sliced job or the printer's own controls there. Stop and heater-off commands cancel pending server print/heating operations. Resuming through MCP requires the same paused job inspected and started by this server instance, with fresh matching telemetry; other paused jobs remain controllable at the printer.
{
"component": "nozzle",
"temperature": 220,
"bambu_model": "p1s",
"material": "PLA",
"nozzle_diameter": 0.4,
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}set_fan_speed
Set a printer fan speed from 0 to 100 percent. Accepted fan values are part, auxiliary, chamber, 1, 2, and 3.
{
"fan": "chamber",
"speed": 40,
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}set_light
Set a printer light node mode. Common Bambu firmware reports the chamber light as chamber_light; valid modes are on, off, and flashing.
{
"light": "chamber_light",
"mode": "on",
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}skip_objects
Skip specific object IDs during a running multi-object print. Use list_3mf_plate_objects on the sliced 3MF to find the IDs first.
{
"object_ids": [6495, 6496],
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}set_ams_drying
Start or stop the AMS filament drying cycle on heated AMS units (AMS Pro / AMS-HT). The action parameter accepts start or stop. The ams_id must be an integer from 0 to 3.
{
"action": "start",
"ams_id": 0,
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token"
}To stop drying:
{
"action": "stop",
"ams_id": 0
}print_3mf
The primary tool for starting a Bambu print. Recommended input: a pre-sliced .gcode.3mf exported from FULU OrcaSlicer-bambulab, OrcaSlicer, or Bambu Studio — see slicing guide. This tool handles the complete workflow:
Checks whether the 3MF contains embedded G-code (
Metadata/plate_<n>.gcodeentries).If no G-code is found, attempts to auto-slice via the configured slicer. Profile preparation or slicing failures stop the operation before upload. See the slicing guide for tested CLI versions and combinations.
Parses the sliced 3MF to extract the correct plate file and compute its MD5 hash.
Reads slicer metadata and any explicit AMS selection to build the filament mapping.
Uploads via
basic-ftpto the model-specific location: SD root for H2/full-size A1,cache/for P1/X1/A1 mini/P2S. X2Dprint_3mfinstead uses its checked native eMMC route on macOS.Sends the correct MQTT print command for the target printer family. For H2S/H2D/H2C that means
project_filewith project-lengthams_mapping, parallelams_mapping2, and H2-compatible calibration flags.
{
"three_mf_path": "/Users/yourname/Downloads/bracket.3mf",
"bambu_model": "p1s",
"bed_type": "textured_plate",
"host": "192.168.1.100",
"bambu_serial": "01P00A123456789",
"bambu_token": "your_access_token",
"bed_leveling": true,
"flow_calibration": true,
"vibration_calibration": true,
"timelapse": false,
"use_ams": true,
"ams_mapping": [0, 1]
}bambu_model is required for model-specific routing and preset selection. It does not by itself validate pre-sliced G-code. BambuStudio, FULU, and Orca CLI preparation additionally require the exact model/nozzle machine preset and reject incomplete profiles. Using the wrong model can damage hardware. If bambu_model is not provided in the tool call and BAMBU_MODEL is not set in the environment, the server will ask you interactively via MCP elicitation (if your client supports it) or return a clear error.
bed_type defaults to textured_plate if omitted. nozzle_type (stainless_steel, hardened_steel, tungsten_carbide, brass; default BAMBU_NOZZLE_TYPE) sets the installed nozzle when the project must be auto-sliced; the job's nozzle type must match the printer's report, and stock P1S/P1P/A1 presets assume stainless steel. After an MQTT print command the server listens to the printer's pushed reports for up to 15 seconds (BAMBU_DISPATCH_CHECK_MS) and returns dispatch: "started" or "unconfirmed"; if firmware 01.08.05+ refuses the command (HMS 0500-0500-0001-0007, needs LAN Only Mode and Developer Mode), the call fails and says so; clear that fatal HMS entry with clear_hms_errors before printing again. ams_slots is the preferred override input; ams_mapping remains the raw escape hatch. On AMS-equipped H2 printers, use_ams: false does not suppress mapping lookup if the sliced file declares filaments. If no mapping is provided for an H2 pre-sliced job with declared filaments, the server fails before sending; pass explicit ams_slots, raw ams_mapping, or auto_match_ams: true.
Set auto_match_ams: true to match the sliced 3MF's tray_info_idx values against the live AMS inventory and use the matching ams_slots. The matcher joins on (tray_info_idx, tray_color) and tracks already-claimed slots, so prints with two filaments of the same SKU but different colors (e.g. two GFG02 PETG HF in black and white) resolve correctly. Falls back to SKU-only when the 3MF's filament has no color set or only one tray of that SKU is loaded. Returns a structured missing report (reason: "no_loaded_match" | "color_mismatch" | "exhausted" | "no_sku") when a filament can't be resolved. Ignored when you provide ams_slots or ams_mapping explicitly.
Layer height, nozzle temperature, and other slicer parameters cannot be overridden via this tool -- they are baked into the 3MF's G-code at slice time. Apply those settings in your slicer before generating the 3MF.
For the optional FULU bridge, set connection_mode: "bambu_network" and explicitly choose connection_type: "cloud" or "lan"; see FULU setup. A successful command submission is not proof that the printer accepted it: inspect printer state, HMS errors, and the printer itself.
bambu_network_bridge_status
Inspect the configured FULU bridge without starting it using {}. Use {"connect": true} to launch the host, handshake, and initialize an agent. See bridge probes for interpreting the result.
bambu_network_call
Call an allowed read-only probe such as {"method": "net.is_user_login", "payload": {}}. The default injects the initialized agent; use with_agent: false for bridge.handshake. Raw printer mutations and unknown methods are refused; use the dedicated checked print or printer tools.
X2D native transport (macOS)
Install Bambu Studio and its networking plug-in, plus the Apple command-line developer tools (clang++). The plug-in is loaded at runtime and is not redistributed. In the installed bambu-printer-mcp package directory, run npm run build:native. For a global install, locate that directory with npm root -g; for an extracted desktop extension, run the same command in the extension directory. Rebuild after updating the package. Linux and Windows can still use status and slicing, but this native helper supports macOS only.
The npm package and desktop bundle include native/bambu-native-print.cpp and scripts/build-bambu-native.zsh, never a developer's compiled binary. The server finds the built helper relative to its installed package, regardless of the launch directory. A trusted server setting BAMBU_NATIVE_HELPER can select an alternate executable.
For X2D, print_3mf defaults to connection_mode: "bambu_native"; legacy lan_mqtt_ftps requests are redirected to it. Supply ams_slots, a complete project-level ams_mapping, or auto_match_ams: true. An external-spool job requires explicit use_ams: false. Raw ams_mapping2 and nozzle/extra-option overrides are rejected before dispatch; the server derives both AMS representations from the checked structured mapping. Model/nozzle/material inspection, fresh printer-state checks, and human preflight apply before the helper receives a private snapshot. The native helper requests fresh shared printer-state authorization immediately before each print submission, including a certificate retry, and before checked heating, resume, or error-clearing commands; custom helpers must support this handshake. Stop and heater-off remain available without preflight. Native upload-only requests use the same all-plate inspection as FTPS uploads. They accept project_name, preset_name, bed_type, and an existing plate_index; AMS, nozzle, and calibration print options are rejected. Use print_3mf for checked print settings.
The helper waits for connection/certificate exchange and retries only the initial -4030 send once. Previous hardware testing reached RUNNING on X2D; this revision is validated with mocked transport regressions and clean installs, not a new physical print. bambu_connect is an optional macOS handoff for user review in Bambu Connect and does not start a print. Native task, heater, and error controls retain the common safety checks; raw controls cannot bypass them. Request cancellation, stop, and heater-off interrupt pending native helpers; the server waits for process exit before releasing a checked file. A command already sent to the printer cannot be recalled by cancelling the request, so verify printer state before retrying.
x2d_native_control
This optional X2D metadata tool accepts ams_filament_setting and extrusion_cali_sel, plus the read-only queries extrusion_cali_get, extrusion_cali_get_result, and flowrate_get_result. It validates command fields, numeric metadata, and AMS unit/slot selection. Motion, filament loading, heating, safety-setting changes, and task control are not exposed through raw JSON; use the dedicated checked tools where available. A metadata declaration does not verify the physical spool contents.
print_3mf_bambu_network
Submit a sliced project through FULU's separately configured networking runtime. connection_type defaults to cloud. Both cloud and LAN bridge jobs require a printer IP, LAN access code, matching serial/device ID, and fresh MQTT safety telemetry. File, raw AMS/nozzle mapping, and extra-option overrides cannot replace checked parameters. See print examples and AMS requirements. A zero bridge return code confirms submission, not a physical print or direct X2D support.
resolve_3mf_ams_slots
Dry-run the AMS match without uploading or starting a print. The tool reads Metadata/plate_<n>.json and Metadata/slice_info.config, then compares required tray_info_idx values against live AMS trays.
{
"three_mf_path": "/Users/yourname/Downloads/bracket.gcode.3mf",
"bambu_model": "h2d",
"host": "192.168.1.100",
"bambu_serial": "094...",
"bambu_token": "your_access_token"
}list_3mf_plate_objects
List object IDs from a sliced 3MF plate. Use this before skip_objects so you pass real Bambu object IDs instead of display-order guesses.
{
"three_mf_path": "/Users/yourname/Downloads/bracket.gcode.3mf",
"plate_index": 0
}print_collar_charm
High-level wrapper for a prepared two-part dog-collar-charm workflow. This tool is intentionally specialized: it expects a prepared two-part charm project and applies a fixed tray policy.
Smaller inner object -> black -> AMS 1 slot 1
Larger outer object -> white -> AMS 2 slot 1
The tool will:
Resolve a local
.3mfortemplate_name.Auto-slice if the 3MF is still an unsliced project.
Inspect
Metadata/plate_1.jsonto identify the smaller inner part and larger outer part.Preflight the required AMS trays on the printer.
Dispatch the print through the existing H2-safe
print3mfpath usingams_slots.
{
"template_name": "collars/letter_charm_a",
"bambu_model": "h2d",
"host": "192.168.1.100",
"bambu_serial": "03W09C123456789",
"bambu_token": "your_access_token",
"bed_leveling": true,
"flow_calibration": true,
"vibration_calibration": true,
"timelapse": false
}You can also pass source_path directly instead of template_name.
This wrapper currently assumes:
the input is a prepared two-part charm
.3mf, not a bare STL that needs color-region generationthe selected plate has exactly 2 objects
the selected plate has exactly 2 used filament positions
the smaller object is the inner insert/letter and the larger object is the outer body
If the project does not match those assumptions, the tool fails fast with a structured error instead of guessing. The role-to-color and color-to-tray mapping is isolated in code so the next version can evolve toward customer-requested colors without replacing the whole wrapper.
Slicing Tools
Note: the verified workflow is to slice in Bambu Studio (GUI) and feed the resulting
.gcode.3mftoprint_3mf. The CLI-driven slicing tools below (slice_stl,slice_with_template) work but are sensitive to profile drift and are not the recommended path for production prints. See slicing guide.
list_templates
List saved templates from the local registry directory. You can override the registry root with BAMBU_TEMPLATE_DIR.
{}Each result includes the template name, absolute path, source type, and relative path inside the registry. You can then pass template_name to get_slice_settings, slice_stl, or print_3mf instead of a raw path.
save_template
Copy a local 3mf, json, or .config file into the template registry and register it under a reusable template name.
{
"source_path": "/path/to/sliced_project.3mf",
"template_name": "collars/p1p_petg_default"
}This creates the destination under the template registry directory and makes it available immediately to list_templates, get_slice_settings, slice_with_template, slice_stl, and print_3mf.
get_slice_settings
Inspect the slicer settings embedded in a saved 3MF template or in an extracted JSON/config profile without slicing anything.
{
"template_name": "h2s_template"
}This returns a compact summary of the high-signal settings such as printer preset, default print profile, filament profiles, layer height, infill density, shell counts, support mode, and bed type. It accepts either source_path or template_name. For 3MF inputs it also writes the extracted settings blob to a temp path so the result can be reused directly.
slice_with_template
Slice an STL or 3MF using a named template from the local registry. This is a higher-level wrapper over slice_stl for template-based workflows.
{
"stl_path": "/path/to/model.stl",
"template_name": "collars/p1p_petg_default",
"bambu_model": "p1p"
}This uses the named template as the slicing profile source and still supports live printer filament selection unless you explicitly override load_filaments. The template settings are applied at slice time, and the later print_3mf step computes H2-safe AMS mapping from the newly sliced output.
slice_stl
Slice an STL or 3MF file using an external slicer and return the path to the output file. The output is a sliced 3MF (for BambuStudio, OrcaSlicer, and FULU OrcaSlicer-bambulab) or a G-code file (for PrusaSlicer, Cura, Slic3r).
{
"stl_path": "/path/to/model.stl",
"slicer_type": "bambustudio",
"bambu_model": "p1s"
}slicer_type options: bambustudio, orcaslicer, orcaslicer-bambulab (FULU), prusaslicer, cura, slic3r. Aliases include fulu-orca and orca-studio. When omitted, the value from the SLICER_TYPE environment variable is used (default: bambustudio).
FULU/Orca CLI safety: from 1.1.11, these backends require the exact model/nozzle preset from the selected installation and stop on profile preparation failures. A process override cannot bypass that gate. See configuration and validation limits.
slicer_path and slicer_profile fall back to the SLICER_PATH and SLICER_PROFILE environment variables when omitted. Per-call slicer_path overrides require MCP_ALLOW_EXECUTABLE_ARG=1.
You can provide either template_3mf_path or template_name when you want to slice from a saved template. template_name resolves through the local template registry directory configured for the server.
For printing on a Bambu printer, the recommended workflow is: export a sliced 3MF from your selected Bambu-compatible slicer, then pass that output path to print_3mf.
BambuStudio Slicer Options
When slicer_type is bambustudio (the default), these additional parameters are available on slice_stl:
Parameter | Type | Description |
| boolean | Update 3MF configs to latest BambuStudio presets |
| number | Number of copies to print |
| boolean | Auto-orient model for optimal printability |
| boolean | Auto-arrange objects on the build plate |
| boolean | Lift floating models onto the bed |
| string | Clone counts per object, comma-separated (e.g. |
| string | Object indices to skip, comma-separated (e.g. |
| string | Filament profile paths, semicolon-separated |
| string | Filament-to-object mapping, comma-separated |
| string | Slot colours, one |
| boolean | Enable timelapse-aware slicing |
| boolean | Allow mixed-temperature filaments on one plate |
| number | Uniform scale factor |
| number | Z-axis rotation in degrees |
| number | X-axis rotation in degrees |
| number | Y-axis rotation in degrees |
| boolean | Produce smaller output 3MF (faster uploads) |
| boolean | Ignore stale custom gcodes in the 3MF |
| number | Which plate to slice (0 = all plates, default: 0) |
Example: Slice with auto-orient and 3 copies
{
"stl_path": "/path/to/model.stl",
"bambu_model": "p1s",
"orient": true,
"arrange": true,
"repetitions": 3
}Smart Defaults (print_3mf auto-slice)
When print_3mf detects an unsliced 3MF and auto-slices it, these defaults are applied automatically:
uptodate: true-- prevents stale config bugs from downloaded 3MFsensure_on_bed: true-- safety net, lifts floating models onto the bedmin_save: true-- smaller output for faster FTP uploads to the printerskip_modified_gcodes: true-- strips custom gcodes from other users' profiles
These defaults reduce stale-profile problems; inspect downloaded models and their slice preview before printing. When calling slice_stl directly, you have full control over every flag.
Advanced Tools
Blender MCP
Use a standard stdio Blender MCP server with BLENDER_MCP_COMMAND and
BLENDER_MCP_ARGS. For the common Blender MCP server, install uv and its
matching Blender addon, enable the addon, and start its connection inside
Blender. Set the command to your full uvx path and the argument array to
["blender-mcp"]. The Claude Desktop extension also offers these two optional
settings. Printer tools work without Blender configured.
Call
blender_mcp_statuswith{"connect": true}to initialize the server and discover its tools and input schemas. A connected MCP server does not by itself prove that the Blender addon is running.Call
blender_mcp_callwith a discovered tool name and its arguments. The full MCP result, including images and errors, is returned. For example:
{
"tool_name": "get_scene_info",
"arguments": {"user_prompt": "Inspect the scene before preparing a print."}
}For advanced Blender operations, forward execute_blender_code with code
and the user's original user_prompt. These calls may edit the active scene.
Use the discovered schema rather than assuming a tool exists.
blender_mcp_edit_model
The standard MCP edit helper imports an STL, applies ordered edits, and exports
an STL without replacing the input or an existing output. Supported operations
are decimate:<ratio> (greater than 0 through 1), remesh:<voxel size> (positive,
in STL coordinate units), and boolean_union:<STL path>. Other operations can
use blender_mcp_call. Both processes must have access to the same file paths.
When BLENDER_MCP_COMMAND selects standard MCP, the advertised tool schema
requires an explicit output_path for both preview and execution. Legacy-only
bridge configurations keep output_path optional for compatibility.
{
"stl_path": "/path/to/model.stl",
"output_path": "/path/to/model-edited.stl",
"operations": ["decimate:0.5"],
"user_prompt": "Reduce the triangle count of this model for printing.",
"execute": false
}The default preview returns the plan and generated Python without launching
Blender. Set execute to true to run it. A successful standard edit returns
output_verified: true, output_path, byte count, and triangle count after
checking the matching export receipt and a valid finite mesh. The helper
preserves existing scene objects and requires Object Mode. Inspect the result
before slicing; a valid STL is not a guarantee of printability.
The bridge enforces request deadlines, closes child connections, and never replays interrupted editing requests. After a timeout, inspect Blender before trying the edit again because execution may already have started.
Existing custom executables still work through BLENDER_MCP_BRIDGE_COMMAND.
They receive MCP_BLENDER_PAYLOAD with the requested file and operations;
their results explicitly report output_verified: false. A missing executable
configuration is an error when execution is requested. Per-call legacy
bridge_command overrides remain disabled unless MCP_ALLOW_EXECUTABLE_ARG=1.
Available Resources
Resources follow the MCP resource protocol and can be read by calling ReadResource with a URI. The server also lists them via ListResources.
Printer resources
printer://{host}/status-- Current printer status. Equivalent to callingget_printer_status. Returns a JSON object with temperature, progress, layer, AMS, and raw state data.printer://{host}/files-- File listing for the printer's SD card. Equivalent to callinglist_printer_files. Returns files grouped by directory.printer://{host}/hms-- HMS and error diagnostics from the latest status payload. Returns connection state, printer status, explicit HMS payloads when present, and shallow raw fields whose names indicate errors, failures, warnings, or HMS data.
Example: To read the status of the default printer, use URI printer://192.168.1.100/status. The host segment must match a configured printer IP; the server uses PRINTER_HOST if the default URI template is used.
Bambu Lab Printer Limitations
Understanding these constraints will help you avoid frustrating errors and set appropriate expectations.
Printable 3MF required for print_3mf. The
print_3mftool expects a sliced 3MF containing at least oneMetadata/plate_<n>.gcodeentry. If you pass an unsliced 3MF (one exported from a CAD tool without slicing), the server attempts auto-slicing. BambuStudio, FULU, and Orca CLI paths require the matching machine preset and complete profile preparation; any inspection or slicing failure stops before upload. For a previewable workflow, pre-slice in FULU OrcaSlicer-bambulab, OrcaSlicer, or Bambu Studio and pass the resulting.gcode.3mf. See slicing guide for the full procedure.Layer height, temperature, and slicer settings are baked in. The
project_fileMQTT command tells the printer which plate to run. It does not support overriding layer height, temperature targets, infill percentage, or other slicing parameters at print time. These must be set in your slicer before generating the 3MF.G-code and 3MF jobs use different command paths.
start_print_jobsends aGCodeFileCommandover MQTT and is intended only for plain G-code files stored in thecache/directory. Sliced 3MF files must go throughprint_3mf, which selects the model-specific command and upload location. See the routing table. Mixing these up will result in the printer either ignoring the command or displaying an error.Temperature commands depend on printer state.
set_temperaturedispatches M104 or M140 G-code via MQTT. Whether the printer accepts these commands depends on its current firmware version and operational state. Some printer states (such as the idle screen with AMS management open) may ignore or queue the commands.Status and command submission are separate evidence. Local MQTT connections are reused and status is read from received printer reports. Reports can lag during startup, sleep, or state transitions. Inspect HMS errors and the printer's actual state after submitting a job; a tool's success response is not physical-print confirmation.
Network requirements depend on the path. Direct MQTT/FTPS tools require local reachability and compatible LAN/Developer Mode settings. FULU bridge cloud jobs use BambuNetwork and require its runtime, internet access, and authentication. Standard status, camera, file, and control tools remain local; bridge printing does not turn them into cloud tools.
Self-signed TLS certificate. The printer's FTPS server uses a self-signed certificate. The
basic-ftpclient is configured withrejectUnauthorized: falseto accept it. This is standard for local network Bambu connections but assumes a trusted local network environment.
General Limitations and Considerations
Memory usage
STL manipulation tools load the entire mesh into memory as Three.js geometry. For large files:
Files over 10 MB can consume several hundred MB of RAM during processing.
Running multiple operations sequentially on large files may cause memory to accumulate between garbage collection cycles.
If you encounter out-of-memory errors, try splitting large operations or working with smaller/simplified meshes.
The server has no built-in memory cap. On constrained systems, set the
TEMP_DIRto a fast local path and avoid processing multiple large files concurrently.
STL manipulation limitations
lay_flatidentifies the largest flat face by analyzing surface normals. It works reliably on mechanical parts with clear flat faces and less reliably on organic or curved models where no single dominant face exists.extend_stl_baseadds a new rectangular solid beneath the model. For models with complex or non-planar undersides, the result may include gaps or intersections at the join. Review the modified STL before printing.merge_verticesuses a distance tolerance to identify near-duplicate vertices. Setting the tolerance too high can alter model geometry. The default of 0.01 mm is safe for most models.Non-manifold meshes (meshes with holes, overlapping faces, or internal geometry) may produce unpredictable results for any transformation operation. Use a mesh repair tool (Meshmixer, PrusaSlicer's repair function, or Bambu Studio's repair option) before working with problematic files.
Performance considerations
Slicing with BambuStudio CLI can take 30 seconds to several minutes depending on model complexity, layer height, and your system's CPU. The
slice_stlcall is synchronous and will block until the slicer process completes.FTPS uploads for large 3MF files (multi-plate prints, high-detail models) may take 15 to 60 seconds depending on your local network speed.
MQTT connections are pooled by
host + serialkey. The first call to any printer tool in a session establishes the MQTT connection; subsequent calls reuse it. If the connection drops (printer power cycled, network interruption), the next call will reconnect automatically.
License
GPL-2.0. See LICENSE for the full text.
This project is a fork of mcp-3D-printer-server by David Montgomery, also GPL-2.0.
Acknowledgements
Thank you to FULU Foundation, Louis Rossmann, and the OrcaSlicer-bambulab community for advancing user choice and interoperability. Our support for open-source tools, repair rights, and printing without Bambu's software or cloud is a project priority. See the FULU setup guide and contributor credits.
Some printer command surfaces and workflow priorities were informed by Bambuddy, an AGPL-3.0 Bambu Lab printer management project. This project does not vendor Bambuddy code.
Available Tools
45 toolsbambu_connect_import_fileA
Open an existing G-code or sliced 3MF file in the signed-in Bambu Connect app through its official URL scheme. This is a cloud-mode handoff and does not start printing by itself.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional project name shown by Bambu Connect | |
| version | No | Optional integration version sent to Bambu Connect (default: 1.0.0) | |
| file_path | Yes | Readable local path to a .gcode, .3mf, or .gcode.3mf file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it usefully discloses the handoff mechanism, the cloud-mode dependency, and that no print is triggered. However, it omits prerequisites (signed-in app state required, what happens if the app is not running), failure behavior, and whether the operation leaves any persistent state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, and the core action is front-loaded ahead of the disambiguating caveat. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations mean the description must stand alone; it adequately covers purpose, mechanism, and the 'no print' constraint. It is slightly thin on prerequisites and error conditions for a tool that depends on an external app being available.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents name, version, and file_path, including file extensions. The description only loosely echoes the accepted file types via 'G-code or sliced 3MF file' and adds no new meaning for name or version. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Open') and resource ('existing G-code or sliced 3MF file') plus the mechanism ('Bambu Connect official URL scheme'). This clearly distinguishes it from siblings like upload_file, print_3mf, and start_print, which move or execute files rather than hand them off.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the tool as a 'cloud-mode handoff and does not start printing by itself,' which tells the agent when this tool is and is not the right choice versus print tools. It stops short of naming a specific alternative (e.g., print_3mf/start_print) for when printing IS desired.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bambu_network_bridge_statusC
Inspect or probe the FULU OrcaSlicer-bambulab BambuNetwork bridge runtime used for cloud and restored BambuNetwork printing.
| Name | Required | Description | Default |
|---|---|---|---|
| connect | No | When true, start the bridge command and run a handshake plus agent initialization probe. | |
| user_info | No | Optional BambuNetwork user_info JSON string to pass to net.change_user after the agent starts. | |
| timeout_ms | No | Bridge request timeout in milliseconds for the connect probe. | |
| country_code | No | BambuNetwork country code, such as US, used by the agent during startup. | |
| bridge_command | No | Override command for the FULU bridge host or macOS/WSL wrapper; defaults to BAMBU_NETWORK_BRIDGE_COMMAND. Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1. | |
| bambu_network_config_dir | No | Config/log directory used by the BambuNetwork agent; defaults to BAMBU_NETWORK_CONFIG_DIR or a user config directory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it does not disclose that the tool can start a bridge process/execute a command (connect=true, bridge_command), that per-call command overrides require MCP_ALLOW_EXECUTABLE_ARG=1, or what a successful/failed probe reports. Only the vague verb 'probe' hints at side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no padding. It is efficient, though dense with product-specific jargon that slightly raises interpretation cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with six optional parameters, no annotations, and no output schema that can launch an external bridge process, the description omits the most decision-relevant facts: side effects of connect, return/result shape, failure modes, and prerequisites. What an agent needs to call it confidently is largely missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (connect, user_info, timeout_ms, country_code, bridge_command, bambu_network_config_dir) are already fully documented by the schema. The description adds no syntax, default, or interaction detail beyond it, which is the expected baseline of 3 when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb pair (inspect/probe) and resource (the FULU OrcaSlicer-bambulab BambuNetwork bridge runtime), with an additional scope note about cloud and restored BambuNetwork printing. An agent can tell this apart from an ordinary network call, but the description never names the sibling tools (bambu_network_call, print_3mf_bambu_network) it should be preferred over.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all: no statement of when to inspect versus when to actually invoke bambu_network_call or print_3mf_bambu_network, and no hint about when the connect probe is appropriate versus a plain status read. Usage is only implied by the word 'probe'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bambu_network_callC
Call a raw FULU OrcaSlicer-bambulab BambuNetwork bridge method, optionally with an initialized network agent injected into the payload.
| Name | Required | Description | Default |
|---|---|---|---|
| method | Yes | FULU bridge method name, for example bridge.handshake, net.is_user_login, or net.get_user_selected_machine. | |
| payload | No | JSON payload passed to the bridge method. | |
| user_info | No | Optional BambuNetwork user_info JSON string to pass to net.change_user after the agent starts. | |
| timeout_ms | No | Bridge request timeout in milliseconds. | |
| with_agent | No | When true, initialize a BambuNetwork agent and add its agent id to the payload before calling the method. | |
| country_code | No | BambuNetwork country code, such as US, used by the agent during startup. | |
| bridge_command | No | Override command for the FULU bridge host or macOS/WSL wrapper; defaults to BAMBU_NETWORK_BRIDGE_COMMAND. Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1. | |
| bambu_network_config_dir | No | Config/log directory used by the BambuNetwork agent; defaults to BAMBU_NETWORK_CONFIG_DIR or a user config directory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It hints that arbitrary bridge methods are invoked ('raw'), but never discloses side effects, permission requirements, risk of destructive methods, or return/error behavior. For an unconstrained low-level call tool this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that conveys the core action and the agent-injection option with no filler. It is tightly sized, though the dense jargon reduces immediate readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter power tool with no annotations and no output schema, the description leaves too much unsaid: which methods are safe, how errors surface, or how it relates to the higher-level Bambu tools. The safety-neutral annotation gap makes this incompleteness more costly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all eight parameters in detail. The description adds only a marginal restatement by noting the optional agent injection into the payload. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb (call) and resource (raw FULU OrcaSlicer-bambulab BambuNetwork bridge method), and the scope term 'raw' signals it is a low-level escape hatch. It implicitly separates itself from status-oriented siblings like bambu_network_bridge_status, but never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, nor any reference to the higher-level siblings (print_3mf_bambu_network, start_print). An agent is left to infer that this is the fallback for methods not covered elsewhere, without any statement to that effect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blender_mcp_callA
Call a discovered tool on the configured Blender MCP server, preserving its full MCP content and errors. Discover tool schemas with blender_mcp_status first; execute_blender_code accepts Python code and user_prompt. Calls can modify the active Blender scene and are never automatically retried.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | Arguments matching the remote tool's discovered input schema. Preserve the user's own words in user_prompt when the remote tool requests it. | |
| tool_name | Yes | Exact name advertised by Blender MCP, such as get_scene_info or execute_blender_code. | |
| timeout_ms | No | Total connection, discovery, and tool deadline in milliseconds; defaults to BLENDER_MCP_TIMEOUT_MS or 120000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers the key traits: 'Calls can modify the active Blender scene and are never automatically retried.' That mutation warning and no-retry disclosure are exactly the safety context an agent needs. It omits auth/permission or concurrency details, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and the discovery prerequisite. Each sentence carries information, though the mid-sentence mention of execute_blender_code's parameters is slightly tangential to the tool's own purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description compensates by stating it preserves 'its full MCP content and errors.' Combined with the mutation and no-retry disclosures and a documented timeout default, an agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents tool_name, arguments, and timeout_ms. The description only lightly augments this, noting that execute_blender_code accepts Python code and user_prompt. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Call a discovered tool on the configured Blender MCP server.' It names the sibling it depends on (blender_mcp_status) and clarifies the proxy nature of the tool, distinguishing it from the actual Blender tools it dispatches to.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear prerequisite flow: 'Discover tool schemas with blender_mcp_status first,' and names a concrete example (execute_blender_code). It does not, however, explain when to prefer this over blender_mcp_edit_model, leaving one sibling relationship implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blender_mcp_edit_modelA
Import, edit, and export a local STL through standard Blender MCP with verified output and existing scene objects preserved. Requires a shared local filesystem and Blender Object Mode. Also supports a separately configured legacy executable bridge.
| Name | Required | Description | Default |
|---|---|---|---|
| execute | No | Apply edits and export (true) or validate and return the prepared request without connecting (false, default). | |
| stl_path | Yes | Path to the local STL file | |
| operations | Yes | Ordered operations: decimate:<ratio greater than 0 and at most 1>, remesh:<positive voxel size in STL units>, boolean_union:<STL path>. Legacy custom bridges define their own operations. | |
| timeout_ms | No | Total Blender request deadline in milliseconds; defaults to BLENDER_MCP_TIMEOUT_MS or 120000. | |
| output_path | No | Required for standard MCP previews and execution: new local STL output path whose parent exists. Existing files are never overwritten. Optional for legacy-only bridge configuration. | |
| user_prompt | No | The user's own words describing the edit, passed unchanged to Blender MCP. | |
| bridge_command | No | Legacy custom bridge executable override, not a standard MCP command. Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose notable traits: output is verified, existing scene objects are preserved, and it needs a shared filesystem and Object Mode. It omits the dry-run default (execute=false validates only), though that is covered in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences that front-load the core pipeline and guarantees before the legacy-bridge caveat. The legacy sentence is niche but relevant; little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no output schema, the description supplies the key operational constraints (filesystem, Object Mode, non-destructive scene handling) and implies an export flow. It could state the validate-vs-apply default behavior more prominently, but coverage is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (including the execute flag, operations format, timeout, and overwrite protection) is already documented. The description adds no parameter-level detail beyond that, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb chain and resource: import/edit/export a local STL through Blender MCP, which distinguishes it from siblings like blender_mcp_call, blender_mcp_status, and get_stl_info. It does not explicitly name a sibling alternative, but the scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives prerequisites (shared local filesystem, Blender Object Mode) and notes a legacy bridge mode, which is real context. However, it never says when to use this tool versus blender_mcp_call or the other STL-manipulation siblings, so routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blender_mcp_statusA
Inspect Blender MCP configuration or connect and discover the remote server's tools and schemas. Connecting does not edit the scene; use get_scene_info through blender_mcp_call to check the Blender addon.
| Name | Required | Description | Default |
|---|---|---|---|
| connect | No | Initialize the configured stdio MCP server and discover its tools (default false). | |
| timeout_ms | No | Total connection and discovery deadline in milliseconds; defaults to BLENDER_MCP_TIMEOUT_MS or 120000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the key behavioral trait that connecting does not mutate the scene, which is valuable. However, it omits other side effects of connect (e.g., that it initializes/starts a stdio process and may block up to the timeout) and any error/auth behavior, leaving meaningful gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, front-loaded with the primary action, and the routing note placed second. Every clause earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two fully documented parameters and no output schema, the description covers purpose, mode selection, and the non-mutating trait adequately. It could say a bit more about what 'discover tools and schemas' returns or how connection failures surface, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both 'connect' and 'timeout_ms' fully documented including defaults and bounds, so the schema does the heavy lifting. The description adds no syntax or format detail beyond what the schema already provides, which is the expected baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs and resource: inspect the Blender MCP configuration, or connect and discover the remote server's tools and schemas. It also explicitly routes to blender_mcp_call for scene inspection, distinguishing it from the call/edit siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context on the two modes (inspect vs. connect) and clarifies that connecting does not edit the scene. It names an alternative path (get_scene_info via blender_mcp_call) for checking the Blender addon, but does not state when NOT to use this tool beyond that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
camera_snapshotA
Capture a single JPEG frame from the printer's chamber camera. A1/P1 use TCP-on-6000; X1/P2S/H2/X2D use RTSP via ffmpeg. Returns JPEG as base64; pass save_path to also write the bytes to disk.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| save_path | No | Optional absolute path to write the JPEG to disk. If omitted, only the base64 payload is returned. | |
| timeout_ms | No | Max ms to wait for a full frame (default 8000). Camera may take a few seconds on cold start. | |
| bambu_model | No | Printer model. Used to route to the correct protocol or fail fast on unsupported models. Defaults to BAMBU_MODEL. | |
| bambu_token | No | Access token (default: value from env) | |
| ffmpeg_path | No | Override path to the ffmpeg binary used by the RTSP path. Defaults to FFMPEG_PATH or ffmpeg via $PATH. Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1. Required only for the RTSP transport (X1, P2S, H2 series, X2D). | |
| bambu_serial | No | Serial number (default: value from env) | |
| experimental | No | Deprecated and ignored. Earlier this flag let callers probe H2 series via the A1/P1 TCP-on-6000 path; live testing on an H2S confirmed H2 uses RTSP instead, so the flag has no effect now. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the return format (base64 JPEG), the optional disk write, the cold-start delay risk behind timeout_ms, and that ffmpeg overrides require MCP_ALLOW_EXECUTABLE_ARG=1. It stops short of describing error behavior for unsupported models or auth failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences, zero filler, and the primary action plus return contract lead. The protocol routing could arguably move to a schema note, but its placement is still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, no-annotation, no-output-schema tool, the description supplies the essential return contract (base64 JPEG, optional disk write) and the transport gotchas. It is nearly complete, lacking only failure-mode detail for unsupported models or token/auth errors.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 8 parameters, including save_path, timeout_ms, and ffmpeg_path. The description re-states the save_path and base64 return behavior, adding only marginal value beyond the structured fields, which is the baseline-3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Capture a single JPEG frame from the printer's chamber camera.' It also names the protocol split by model, which no sibling tool covers, so an agent can distinguish it immediately from the print-file and STL manipulation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The model-to-transport mapping (A1/P1 vs X1/P2S/H2/X2D) is implied usage context, but the description never states when an agent should reach for this tool versus the status/inspection siblings, nor any exclusions or prerequisites beyond the protocol routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_printB
Cancel the current print job on the Bambu Lab printer
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It states 'cancel' but does not clarify whether the job is removed from the queue, if it can be resumed, or if any confirmation is required. The lack of detail on side effects reduces transparency for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that efficiently communicates the purpose. No unnecessary words or repetitions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple cancel action with three optional parameters and no output schema, the description is minimally adequate. However, it lacks mention of prerequisites (e.g., an active job), irreversibility, or what happens to the job data, leaving some gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and each parameter has clear descriptions (hostname, serial, token) with defaults from environment. The description adds no extra meaning beyond the schema, meeting the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Cancel' and the resource 'current print job on the Bambu Lab printer'. It distinguishes from sibling tools like pause_print and resume_print by implying finality, though it could explicitly note that it terminates rather than pauses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like pause_print or start_print_job. Context signals indicate ample siblings, but the description does not specify that this is for stopping a running job irreversibly or that it should be used after confirming no further output is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
center_modelB
Translate the model so its geometric center is at the origin (0,0,0)
| Name | Required | Description | Default |
|---|---|---|---|
| stl_path | Yes | Path to the STL file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It mentions translation but does not disclose whether the operation modifies the file in-place, returns a new file, or has other side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single, front-loaded sentence with no redundancy. Could be slightly more structured, but effective for a simple operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Lacks details about return values or file handling. With no output schema and no annotations, the agent is left guessing what happens post-operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter (stl_path), but the description adds no extra meaning beyond the schema's 'Path to the STL file'. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('translate') and resource ('model'), specifying the exact goal: geometric center at origin. It distinguishes from sibling tools like rotate_stl or scale_stl.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance. Sibling tools like lay_flat or merge_vertices are not mentioned, leaving the agent to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_hms_errorsB
Clear HMS or print error state on the Bambu Lab printer using the clean_print_error MQTT command.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It mentions using an MQTT command but does not disclose side effects, required printer state, or whether it clears all errors or specific ones.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb 'clear', no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with 3 optional parameters and no output schema, the description is minimal but functional. However, it lacks explanation of 'HMS errors', what clearing entails, or examples. Slightly below adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter described. The description adds no extra meaning beyond the schema (host, serial, token with defaults). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool clears HMS or print error state on a Bambu Lab printer using a specific MQTT command. It distinguishes from sibling tools like cancel_print, pause_print, and resume_print.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. Given many printer-related siblings, the description lacks context about the appropriate scenario (e.g., after a print error) or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_printer_fileA
Delete a file from the Bambu Lab printer's SD card via FTPS. Destructive: requires confirm:true. Restricted to cache/, timelapse/, and logs/ directories. Path traversal segments (..) are rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| confirm | No | Must be true to actually delete. When false or omitted the call returns without sending an FTP request. | |
| filename | Yes | File to delete. Bare names default to cache/<name>; pass a relative path like timelapse/foo.mp4 to target other allowed directories. | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: it deletes via FTPS, requires explicit confirmation (confirm:true), restricts directories, and blocks path traversal. This is comprehensive for a deletion tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences, each delivering key information: action, destructive guard, directory restriction, and path traversal check. No redundancy; well front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all essential aspects: operation, safety, constraints. A minor gap is lack of error handling info (e.g., file not found), but overall it is sufficiently complete for a file deletion tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds significant value: it clarifies default path for bare names ('cache/') and provides usage examples (e.g., 'timelapse/foo.mp4'). The confirm parameter behavior is clearly explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('delete a file'), the target ('Bambu Lab printer's SD card'), and the mechanism ('via FTPS'). It effectively distinguishes this tool from siblings like 'list_printer_files' and 'upload_file'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides important usage constraints: destructive nature requiring confirm:true, allowed directories (cache/, timelapse/, logs/), and rejection of path traversal. It does not explicitly compare with alternatives, but the constraints offer sufficient guidance for safe usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extend_stl_baseC
Extend the base of an STL file by a specified amount
| Name | Required | Description | Default |
|---|---|---|---|
| stl_path | Yes | Path to the STL file to modify | |
| extension_height | Yes | Height in mm to extend the base by |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description should disclose behavioral traits like whether the file is modified in-place or a new file is created, but it does not. Side effects and requirements are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no unnecessary words. It effectively communicates the core purpose without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema and the presence of sibling STL manipulation tools, the description is too brief. It does not explain the output, error conditions, or how it differs from similar tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds no extra meaning beyond the schema's property descriptions; it merely restates the schema information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action 'extend the base' on an STL file, which distinguishes it from sibling tools like scale_stl or rotate_stl. However, it is slightly vague on what 'extend the base' entails (e.g., adding material to the bottom vs. increasing thickness).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as scale_stl or lay_flat. The description does not mention any prerequisites or contextual usage hints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_printer_filamentsA
Get the live AMS/external filament inventory from the printer over MQTT, including loaded/empty slot summary, resolved slicer profile paths, match confidence, and recommended load_filaments when the printer model is known.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP address of the printer (default: value from env) | |
| bambu_model | No | Optional model hint used to resolve Bambu/Orca filament profile JSONs for each tray. | |
| bambu_token | No | Access token for the Bambu Lab printer (default: value from env) | |
| bambu_serial | No | Serial number for the Bambu Lab printer (default: value from env) | |
| nozzle_diameter | No | Optional nozzle diameter used when resolving model-specific filament profile JSONs (default: 0.4). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden. It helpfully discloses that the data is live over MQTT and enumerates the returned content, but says nothing about failure modes, connectivity/auth needs (token, serial), or whether the call blocks or is read-only. Partial behavioral coverage only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the core action and then lists the returned fields. Efficient, though the trailing enumeration of outputs makes it dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does describe the return content, which is its main job here. However, it omits prerequisites (printer reachability, credentials) and any failure/error context, leaving gaps for a tool that talks to hardware over MQTT.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters, giving a baseline of 3. The description adds minor value by linking bambu_model to the recommended load_filaments output, but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Get) plus resource (live AMS/external filament inventory) with the transport (MQTT) called out. It clearly distinguishes itself from siblings like get_printer_status or resolve_3mf_ams_slots by naming the filament inventory and the several derived outputs (slot summary, profile paths, match confidence, recommendations).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the resource it reads, but the description never states when to reach for this tool versus alternatives such as get_printer_status, reread_ams_rfid, or resolve_3mf_ams_slots. No prerequisites or exclusions are given, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_printer_statusC
Get the current status of the Bambu Lab printer
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP address of the printer (default: value from env) | |
| bambu_token | No | Access token for the Bambu Lab printer (default: value from env) | |
| bambu_serial | No | Serial number for the Bambu Lab printer (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must convey behavioral traits. It only states a simple read operation, but fails to disclose potential side effects (if any), error behavior (e.g., if printer is offline), or authentication requirements beyond the parameter defaults. This leaves the agent unaware of safety or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no wasted words. However, it could benefit from slight expansion (e.g., a brief note on output format) without losing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema and three optional parameters, the description should provide more context, such as the return format or typical use cases. Currently, it only states the basic action, leaving the agent uncertain about what data the tool returns and how to interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage, describing each parameter with its purpose and default behavior. The description adds no additional meaning beyond the schema, so a baseline score of 3 is appropriate. The tool is simple and the schema is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Get' and the resource 'current status of the Bambu Lab printer', making the tool's purpose apparent. It distinguishes itself from sibling tools like cancel_print or pause_print, but could be more specific about what aspects of status are retrieved (e.g., printing, idle, errors).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. For example, it doesn't suggest checking status before printing or mention related tools like get_printer_filaments or list_printer_files. The agent is left without context for selecting this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_slice_settingsA
Inspect slicer settings from a saved 3MF template or a JSON/config slicer profile without slicing anything.
| Name | Required | Description | Default |
|---|---|---|---|
| source_path | No | Path to a 3MF template, extracted project_settings.config, or slicer profile JSON. | |
| template_dir | No | Optional template directory override when resolving template_name. | |
| template_name | No | Optional named template from the local registry. If provided, resolves source_path automatically. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It explicitly states 'without slicing anything', which indicates the tool is non-destructive and read-only. However, it does not disclose other behavioral traits such as required permissions, file format limitations, or potential errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is perfectly concise, with no extraneous information. Every word adds value, and the key point about not slicing is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with 3 parameters and no output schema. The description adequately explains the tool's purpose and behavior, but lacks details about what the returned settings look like or how to interpret them. For a complete understanding, an agent would benefit from knowing the output structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for parameter descriptions, so the baseline is 3. The description adds context by mentioning 'saved 3MF template or a JSON/config slicer profile', which elaborates on the source_path parameter, but does not add significant additional meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'inspect' and the resource 'slicer settings from a saved 3MF template or a JSON/config slicer profile', and explicitly distinguishes itself from slicing operations. This differentiates it from sibling tools like slice_with_template or slice_stl, which perform actual slicing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for inspecting settings without slicing, but does not provide explicit guidance on when to use this tool versus alternatives like get_stl_info or list_templates. No exclusions or alternative suggestions are given, so the agent must infer the use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stl_infoA
Get detailed information about an STL file (bounding box, face count, dimensions)
| Name | Required | Description | Default |
|---|---|---|---|
| stl_path | Yes | Path to the STL file to analyze |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden. It indicates a read-only operation by stating 'Get detailed information', but does not disclose error behavior, permissions needed, or any side effects. It adds some value by listing the exact information returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that immediately conveys purpose. No unnecessary words, well front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple query tool with one parameter and no output schema, the description is nearly complete. It states what it does and what information it returns. Minor improvement could include noting it does not modify the file.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (the single parameter 'stl_path' is described). The tool description adds no additional meaning beyond the schema's 'Path to the STL file to analyze'. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and resource 'STL file', and specifies the kind of information (bounding box, face count, dimensions). It distinguishes from sibling tools that modify STL files, making it unambiguously a read-only information retrieval tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when needing STL file details, but gives no explicit guidance on when to use this tool versus alternatives like scale_stl or slice_stl. No when-not or exclusion criteria are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lay_flatA
Rotate the model so its largest flat face lies on the XY plane (Z=0)
| Name | Required | Description | Default |
|---|---|---|---|
| stl_path | Yes | Path to the STL file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the core action but lacks details on side effects (e.g., whether the file is modified in place), error handling for models without a flat face, or return value. With no annotations, more disclosure would be beneficial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single, well-structured sentence that front-loads the action and outcome with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple tool but missing expected output description (e.g., returns path or modifies in place). Could mention prerequisites like presence of a flat face.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 100% schema coverage, but the description adds no extra meaning beyond the schema's 'Path to the STL file'. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool rotates the model so its largest flat face lies on the XY plane, using a specific verb and resource that distinguishes it from sibling tools like rotate_stl which require manual angles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., rotate_stl, center_model). The description does not specify prerequisites or scenarios where this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_3mf_plate_objectsA
List object IDs from a sliced 3MF plate. Use these IDs with skip_objects during a running print.
| Name | Required | Description | Default |
|---|---|---|---|
| plate_index | No | 0-based plate index to inspect (default: 0) | |
| three_mf_path | Yes | Path to a sliced 3MF/.gcode.3mf file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is transparent about the read-only nature of listing object IDs. No annotations are provided, so the description carries the burden and does so adequately.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The first sentence states the purpose, and the second gives actionable guidance. Excellent front-loading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a simple list operation, but lacking an output schema, it does not specify the format of the returned object IDs. However, the purpose and usage are clear enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description does not add significant meaning beyond the schema's parameter descriptions. The additional context about skip_objects is usage guidance, not parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'object IDs from a sliced 3MF plate', and distinguishes itself from siblings by specifying the use with skip_objects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises to use the IDs with skip_objects during a running print, providing clear context. It does not state when not to use it or list alternatives, but the usage is well-defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_printer_filesC
List files stored on the Bambu Lab printer
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but only states 'list files'. It does not disclose whether the result includes file sizes, timestamps, or if pagination is used. For a read operation, more behavioral context would be expected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence. While it is concise, it could benefit from a bit more structure (e.g., specifying what information is returned).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation, the description is minimally adequate. However, given the lack of an output schema and the presence of many sibling tools, additional details about the returned file list (e.g., format, fields) would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds no additional meaning beyond the schema's parameter descriptions, which only indicate default values from environment variables.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('list files') and the target ('stored on the Bambu Lab printer'). It distinguishes from sibling tools like 'delete_printer_file' or 'upload_file' which perform different operations on printer files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as 'get_printer_status' or 'slice_stl'. No mention of prerequisites, context, or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesB
List saved slicing templates from the local template registry directory.
| Name | Required | Description | Default |
|---|---|---|---|
| template_dir | No | Optional template directory override. Defaults to BAMBU_TEMPLATE_DIR or the server's configured local template registry. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral aspects. It only says 'list' without describing return format, error handling, or side effects. No indication that this is a read-only operation or what happens if the directory is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no extraneous information. Every word is necessary, and it is front-loaded with the action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (one optional param, no output schema), the description is minimally adequate. However, it lacks details on return values and edge cases, which could be added for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter. The description does not add new information beyond the schema. Baseline 3 is appropriate as the schema already covers parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists saved slicing templates from a specific local directory. The verb 'List' and resource 'saved slicing templates' are precise, distinguishing it from siblings like save_template and slice_with_template.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool or when to avoid it. No mention of prerequisites, default behavior, or alternatives. The description only states the source directory without context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_verticesB
Merge vertices in an STL file closer than the specified tolerance
| Name | Required | Description | Default |
|---|---|---|---|
| stl_path | Yes | Path to the STL file | |
| tolerance | No | Max distance to merge (mm, default: 0.01) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does not disclose whether the file is modified in place, side effects, performance implications, or if the operation is destructive. The agent lacks crucial behavioral cues.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It is concise, though it could optionally provide a bit more context about the operation's effect without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and low complexity, the description should at least hint at return value or side effects (e.g., whether the file is overwritten). It lacks this context, making it incomplete for the agent to fully understand the tool's behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (both parameters have descriptions). The description adds no additional meaning beyond what is in the schema, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Merge vertices in an STL file') and the condition ('closer than the specified tolerance'). It distinguishes from siblings like scale_stl, rotate_stl, etc., which perform different operations on STL files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus other STL tools, nor any prerequisites or exclusions. The description simply states what it does without context on alternatives like manual editing or other merge strategies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_printA
Pause the current print job on the Bambu Lab printer (resumable via resume_print)
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full burden. It discloses the action is non-destructive and resumable, but lacks details on permissions, timeouts, or state prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the verb, every word adds value. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given low complexity and good schema, description is nearly complete. Only minor gap: it doesn't explicitly state that the printer must be printing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions. The description adds no additional parameter info, but baseline 3 is appropriate since schema already covers meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Pause', the resource 'current print job on the Bambu Lab printer', and distinguishes this from sibling tools like cancel_print (destructive) and resume_print (reversal).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use (pause current print job) and implies that resume_print is for resuming. However, it does not explicitly state when not to use or list all alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
print_3mfB
Print a 3MF file on a Bambu Lab printer. Auto-slices if the 3MF has no gcode. IMPORTANT: bambu_model must be specified to ensure safe printer operation.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| dev_id | No | Bambu device id for FULU BambuNetwork printing; defaults to BAMBU_DEV_ID or BAMBU_SERIAL. | |
| dev_ip | No | Printer IP address for FULU BambuNetwork LAN/local print methods; defaults to host when provided. | |
| use_ams | No | Whether to use the AMS (default: auto-detect from 3MF) | |
| bed_type | No | Bed plate type currently installed (default: textured_plate) | |
| ams_slots | No | Preferred AMS input: one absolute tray index per USED filament in plate order, e.g. [1] for a single-filament print pulling from AMS 0 slot 1. Expanded to project-level ams_mapping automatically from the 3MF's plate_N.json and gcode header. | |
| timelapse | No | Enable timelapse recording (default: false) | |
| user_info | No | Optional BambuNetwork user_info JSON string passed to net.change_user for the FULU bridge. | |
| ams_mapping | No | Project-level AMS mapping array. Position = project filament index, value = absolute AMS tray (0-3=AMS 0, 4-7=AMS 1, 8-11=AMS 2, 128+=AMS-HT, 254=external, -1=unused). Prefer ams_slots unless you know the project-level layout. | |
| bambu_model | Yes | REQUIRED: Bambu Lab printer model. Ask the user if not known. Using the wrong model can damage the printer. | |
| bambu_token | No | Access token (default: value from env) | |
| nozzle_type | No | Installed nozzle material, used when the 3MF must be auto-sliced (default: BAMBU_NOZZLE_TYPE, else the preset's stock nozzle). | |
| plate_index | No | Zero-based plate index to print from the sliced 3MF (default: 0) | |
| slicer_path | No | Path to the slicer executable for auto-slicing (default: value from env or a platform default). Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1. | |
| slicer_type | No | Slicer to use only if auto-slicing an unsliced 3MF. Bambu-compatible slicer aliases such as fulu-orca and orca-studio are accepted. | |
| bambu_serial | No | Serial number (default: value from env) | |
| bed_leveling | No | Enable auto bed leveling (default: true) | |
| country_code | No | BambuNetwork country code, such as US, used by the FULU bridge agent. | |
| template_dir | No | Optional template directory override when resolving template_name. | |
| template_name | No | Optional named template from the local registry. Resolves to template_3mf_path automatically. | |
| three_mf_path | Yes | Path to the 3MF file to print | |
| auto_match_ams | No | When true, match the sliced 3MF's tray_info_idx requirements against live AMS inventory and use the resulting ams_slots. Ignored when ams_mapping or ams_slots is provided. | |
| bridge_command | No | Override command for the FULU bridge host or macOS/WSL wrapper; defaults to BAMBU_NETWORK_BRIDGE_COMMAND. Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1. | |
| slicer_profile | No | Path to the slicer profile/config file for auto-slicing (optional). | |
| connection_mode | No | Print path: bambu_connect hands a printable file to the signed-in Bambu Connect app for cloud-mode review; X2D otherwise defaults to bambu_native (Bambu Studio's installed local networking plug-in and emmc tunnel); lan_mqtt_ftps is the legacy direct MQTT/FTPS path; bambu_network uses the FULU bridge. | |
| connection_type | No | BambuNetwork connection type when connection_mode is bambu_network; cloud uses restored internet printing, lan uses local bridge printing. | |
| nozzle_diameter | No | Nozzle diameter in mm for auto-slicing (default: 0.4) | |
| flow_calibration | No | Enable flow calibration (default: true) | |
| nozzle_diameters | No | Complete per-nozzle diameters for a pre-sliced job, e.g. [0.4, 0.6]. Omit to verify its declared diameters against live telemetry; cannot combine with nozzle_diameter. | |
| template_3mf_path | No | Optional template 3MF whose embedded Bambu slicer settings should be reused when auto-slicing this print job. | |
| bambu_network_method | No | FULU print method when connection_mode is bambu_network; defaults to start_print for cloud and start_local_print for lan. | |
| vibration_calibration | No | Enable vibration calibration (default: true) | |
| bambu_network_config_dir | No | Config/log directory used by the FULU BambuNetwork agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It helpfully discloses the auto-slice fallback when gcode is missing and warns that a wrong bambu_model can damage the printer, which is real behavioral context. But it omits whether the call blocks until print completion, failure/rollback behavior, and auth prerequisite details for an irreversible physical action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the auto-slice behavior, then the safety constraint in caps. Nothing is wasted, though the 'IMPORTANT' warning largely duplicates the schema's own 'REQUIRED' wording rather than adding new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 33-parameter, no-annotation, no-output-schema tool that physically drives hardware, the description is minimally adequate: it names the action and the one hard requirement. It says nothing about connection-mode selection, slicer prerequisites, or the irreversible nature of a print job, which an agent would need to make a confident call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the 33 parameters are already well documented in the schema, including enums for bed_type, slicer_type, connection_mode, and others. The description adds only the emphasis that bambu_model is required and dangerous to get wrong, which the schema itself already states, so it does not meaningfully exceed the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Print a 3MF file on a Bambu Lab printer') and discloses the auto-slice behavior, so the core action is unambiguous. However, it does not distinguish itself from near-identical siblings such as print_3mf_bambu_network or start_print, leaving the agent to infer which variant to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus the many overlapping print siblings (start_print, start_print_job, print_3mf_bambu_network, x2d_native_control). The only routing-adjacent guidance is the internal note that bambu_model must be supplied, which is a prerequisite rather than a use-when rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
print_3mf_bambu_networkA
Print a 3MF through FULU OrcaSlicer-bambulab's restored BambuNetwork path instead of the MCP LAN MQTT/FTPS path.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Printer host or IP address, used as dev_ip for LAN/local bridge methods. | |
| dev_id | No | Bambu device id used by BambuNetwork; defaults to BAMBU_DEV_ID or BAMBU_SERIAL. | |
| dev_ip | No | Printer IP address for LAN/local bridge methods; defaults to host when provided. | |
| use_ams | No | Whether to use the AMS; defaults to auto-detect from the 3MF mapping. | |
| bed_type | No | Bed plate type currently installed (default: textured_plate). | |
| password | No | Printer password/access code override for LAN/local bridge methods. | |
| username | No | Printer username for LAN/local bridge methods; defaults to bblp. | |
| ams_slots | No | Per-used-filament AMS slot list, matching the local LAN print path. | |
| task_name | No | Optional project label when project_name is omitted. The submitted task name uses a unique inspected-job identity for safe resume. | |
| timelapse | No | Enable timelapse recording in FULU PrintParams (default: false). | |
| user_info | No | Optional BambuNetwork user_info JSON string to pass to net.change_user after the agent starts. | |
| timeout_ms | No | Bridge request timeout in milliseconds. | |
| ams_mapping | No | AMS slot mapping array used by both local MCP printing and FULU PrintParams. | |
| bambu_model | Yes | REQUIRED: Bambu Lab printer model. Ask the user if not known. Using the wrong model can damage the printer. | |
| bambu_token | No | Printer access code/password for LAN/local bridge methods. | |
| nozzle_type | No | Installed nozzle material, used when the 3MF must be auto-sliced (default: BAMBU_NOZZLE_TYPE, else the preset's stock nozzle). | |
| plate_index | No | Zero-based plate index to print from the sliced 3MF; converted to FULU's one-based PrintParams plate_index. | |
| preset_name | No | Optional preset name sent in FULU PrintParams; defaults to project plus one-based plate index. | |
| slicer_path | No | Path to the slicer executable for auto-slicing; defaults to value from env or a platform default. Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1. | |
| slicer_type | No | Slicer to use only if auto-slicing an unsliced 3MF; use orcaslicer-bambulab for FULU's fork. | |
| ams_mapping2 | No | Raw JSON string for FULU PrintParams ams_mapping2, matching OrcaSlicer-bambulab's v1 AMS mapping field. | |
| bambu_serial | No | Fallback Bambu device id when dev_id is not supplied. | |
| bed_leveling | No | Enable auto bed leveling in FULU PrintParams (default: true). | |
| country_code | No | BambuNetwork country code, such as US, used by the agent during startup. | |
| nozzles_info | No | Raw JSON string for FULU PrintParams nozzles_info. | |
| project_name | No | Optional project name sent in FULU PrintParams; defaults to the 3MF filename without extension. | |
| client_job_id | No | Optional client job id sent to the bridge; defaults to the current timestamp. | |
| extra_options | No | Raw JSON string or text for FULU PrintParams extra_options. | |
| layer_inspect | No | Enable first-layer inspection where supported (default: false for BambuNetwork bridge). | |
| three_mf_path | Yes | Path to the 3MF file to print; unsliced 3MFs are auto-sliced before sending. | |
| bridge_command | No | Override command for the FULU bridge host or macOS/WSL wrapper; defaults to BAMBU_NETWORK_BRIDGE_COMMAND. Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1. | |
| nozzle_mapping | No | Raw JSON string for FULU PrintParams nozzle_mapping. | |
| slicer_profile | No | Path to an optional slicer profile/config file for auto-slicing. | |
| try_emmc_print | No | Enable FULU PrintParams try_emmc_print for printers that support internal storage printing. | |
| config_filename | No | Optional config 3MF path for cloud print; defaults to the same 3MF path. | |
| connection_type | No | BambuNetwork connection type to put in FULU PrintParams; cloud uses restored internet printing, lan uses local bridge printing. | |
| nozzle_diameter | No | Nozzle diameter in mm for auto-slicing (default: 0.4). | |
| use_ssl_for_ftp | No | Whether FULU local print should use SSL for FTP (default: true). | |
| ams_mapping_info | No | Raw JSON string for FULU PrintParams ams_mapping_info, matching OrcaSlicer-bambulab's detailed AMS mapping field. | |
| flow_calibration | No | Enable flow calibration in FULU PrintParams (default: true). | |
| nozzle_diameters | No | Complete per-nozzle diameters for pre-sliced jobs, e.g. [0.4, 0.6]. Omit to verify file metadata against every reported nozzle; cannot combine with nozzle_diameter. | |
| use_ssl_for_mqtt | No | Whether FULU local print should use SSL for MQTT (default: true). | |
| ams_mapping_bridge | No | Raw JSON string override for FULU PrintParams ams_mapping when the automatic array is not enough. | |
| bambu_network_method | No | FULU print method to invoke; defaults to start_print for cloud and start_local_print for lan. | |
| vibration_calibration | No | Enable vibration calibration in FULU PrintParams (default: true). | |
| external_change_assist | No | Enable FULU PrintParams task_ext_change_assist for external filament change assistance. | |
| bambu_network_config_dir | No | Config/log directory used by the BambuNetwork agent; defaults to BAMBU_NETWORK_CONFIG_DIR or a user config directory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description must carry the full behavioral burden. It discloses the network path but omits critical operational facts: that this triggers a physical print, is destructive/irreversible in part, may require credentials, and can damage the printer if the wrong model is used. The schema carries a damage warning, but the description itself does not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no redundant or filler text. It efficiently states the core behavior and routing distinction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 47-parameter tool that performs a physical print with no annotations and no output schema, one sentence is not enough. The detailed schema helps with parameters, but the description omits safety, authentication, physical side effects, and practical usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no parameter-level meaning beyond the schema, even though it could have clarified key interactions among the 47 parameters such as connection_type, required printer credentials, and model safety.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Print), resource (a 3MF), and execution route (FULU OrcaSlicer-bambulab's restored BambuNetwork path). It also explicitly distinguishes itself from the alternative MCP LAN MQTT/FTPS path, so an agent can separate it from sibling print tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to choose this tool: when using the restored BambuNetwork path instead of the MCP LAN MQTT/FTPS path. However, it does not name the alternative tool explicitly or state when not to use it, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
print_collar_charmA
Print a prepared two-part dog collar charm project using the fixed tray policy: inner/smaller object -> black on AMS 1 slot 1, outer/larger object -> white on AMS 2 slot 1.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| bed_type | No | Bed plate type currently installed (default: textured_plate) | |
| timelapse | No | Enable timelapse recording (default: false) | |
| bambu_model | Yes | REQUIRED: Bambu Lab printer model. H2D, H2S, and H2C are the primary intended paths. X2D direct printing is not supported. | |
| bambu_token | No | Access token (default: value from env) | |
| source_path | No | Path to a prepared collar charm .3mf project or sliced 3MF. Required unless template_name is provided. | |
| bambu_serial | No | Serial number (default: value from env) | |
| bed_leveling | No | Enable auto bed leveling (default: true) | |
| template_dir | No | Optional template directory override when resolving template_name. | |
| template_name | No | Named collar charm template from the local registry. Required unless source_path is provided; resolves source_path automatically. | |
| slicer_profile | No | Path to the slicer profile/config file for auto-slicing (optional). | |
| nozzle_diameter | No | Nozzle diameter in mm for auto-slicing (default: 0.4) | |
| flow_calibration | No | Enable flow calibration (default: true) | |
| vibration_calibration | No | Enable vibration calibration (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses the fixed AMS tray policy (inner->black AMS 1 slot 1, outer->white AMS 2 slot 1), which is genuine behavioral context absent from the schema, but it says nothing about prerequisites (pre-sliced vs raw), failure behavior, permissions, or whether it waits for completion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the action and the tray policy front-loaded, no filler, and every clause carrying information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter print tool with no annotations and no output schema, the definition covers the core action and tray policy but leaves the source_path/template_name requirement and printer-model constraints entirely to the schema. Adequate but with clear gaps given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across 14 parameters, so the schema already documents host, model, source_path, template_name, calibration flags, etc. The description adds no parameter-level meaning beyond hinting that the project must be 'prepared'. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (print) and resource (a prepared two-part dog collar charm project) plus the fixed tray policy, so an agent can tell it apart from the generic print_3mf siblings. However, it never names or contrasts the alternatives it overlaps with (print_3mf, start_print_job), so the differentiation is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'prepared two-part project' implies usage (use this for an already-prepared collar charm), but there is no explicit when-to-use, when-not-to-use, or routing to siblings like print_3mf or slice_with_template. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reread_ams_rfidA
Trigger a Bambu AMS RFID re-read for one AMS slot. X2D on macOS uses the native official plug-in route. This can move AMS filament; use only when the printer is idle and unloaded.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| ams_id | Yes | AMS unit index from 0 to 3, or 128 for an X2D AMS-HT. | |
| slot_id | Yes | Slot index within that AMS, from 0 to 3 | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses a key side effect ('can move AMS filament'), a prerequisite (idle and unloaded), and a platform-specific route ('X2D on macOS uses the native official plug-in route'). It omits details like failure behavior or token requirements, but covers the critical safety-relevant traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, followed by a platform note and a safety warning. Every sentence adds distinct value with no audience-irrelevant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation-like operation with no output schema and no annotations, the description supplies purpose, prerequisite conditions, side-effect risk, and platform nuance. It could go further on authentication or expected outcomes, but an agent has enough to invoke it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters including ranges and defaults. The description adds only the implicit scope of 'one AMS slot' and does not elaborate on parameter formats or constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Trigger') and resource ('Bambu AMS RFID re-read') with explicit scope ('for one AMS slot'). No sibling tool performs a similar re-read action, so it is easily distinguished from the surrounding printer operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear precondition: 'use only when the printer is idle and unloaded.' This doubles as a when-not rule. No alternative tool is named, but none exists in the sibling list for this exact operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_3mf_ams_slotsA
Inspect a sliced 3MF and match its tray_info_idx filament requirements against the live AMS inventory. Does not upload or start a print.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| bambu_model | No | Optional model hint used to resolve Bambu/Orca filament profile JSONs for each tray. | |
| bambu_token | No | Access token (default: value from env) | |
| plate_index | No | 0-based plate index to inspect (default: 0) | |
| bambu_serial | No | Serial number (default: value from env) | |
| three_mf_path | Yes | Path to a sliced 3MF/.gcode.3mf file | |
| nozzle_diameter | No | Nozzle diameter in mm (default: 0.4) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does state the operation is read-only ('Does not upload or start a print') and that it reads live/inventory state, which is meaningful. It omits failure modes (offline printer, missing AMS, unresolvable profile), whether credentials/network are required, and what happens on a slot mismatch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core action front-loaded and the exclusion clause last. Every clause earns its place; nothing is repeated or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description ideally should say what the matching produces (e.g., a per-tray filament mapping or match/unmatch result) and what the agent should do with it. It also leaves the printer/AMS prerequisite unstated. The action and its non-mutating nature are covered, but return semantics are not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all seven parameters (host, serial, token, model hint, plate index, path, nozzle diameter) are documented in the schema itself. The description adds no format or defaulting detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action (inspect a sliced 3MF and match its tray_info_idx filament requirements against live AMS inventory), which is a concrete verb+resource pairing that no sibling tool covers. The closing clause 'Does not upload or start a print' draws a boundary against print/upload siblings such as print_3mf and start_print, though it does not name them directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Use case is only implied: an agent can infer this is a pre-print verification step, and the negative scoping ('does not upload or start a print') rules out the obvious alternatives. There is no explicit when-to-use statement or named alternative, so this stays at the minimum-viable level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_printB
Resume a paused print job on the Bambu Lab printer
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, and the description does not disclose behavioral traits such as whether the print must be paused, what happens if it's already printing, or any side effects. The single sentence offers minimal transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no wasted words. It front-loads the action and resource, but could be slightly more informative without losing brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description is incomplete. It does not explain expected return values (e.g., success message, new status) nor provide context for differentiating among many sibling print tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are fully documented in the schema. The description adds no extra meaning beyond what the schema provides, resulting in a baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Resume'), clearly identifies the resource ('paused print job'), and specifies the brand/context ('Bambu Lab printer'). It distinguishes well from sibling tools like 'pause_print', 'cancel_print', and 'start_print_job'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use or not use this tool. It does not mention that the print must be paused beforehand, nor does it contrast with alternatives like 'cancel_print' or 'start_print_job'. The usage is only implied from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rotate_stlB
Rotate an STL file by specified angles (degrees)
| Name | Required | Description | Default |
|---|---|---|---|
| angle_x | No | Rotation angle for X axis in degrees (default: 0) | |
| angle_y | No | Rotation angle for Y axis in degrees (default: 0) | |
| angle_z | No | Rotation angle for Z axis in degrees (default: 0) | |
| stl_path | Yes | Path to the STL file to rotate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description lacks details about side effects (e.g., overwrites the file, creates a new file), required permissions, or output format. Only the unit (degrees) is mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that is concise and to the point, with no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a simple tool with 4 well-documented parameters, but fails to explain whether the rotation modifies the file in-place or outputs a new file, which is relevant context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All parameters are documented in the schema with descriptions. The tool description adds no additional meaning beyond the schema, so it meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (rotate) and the resource (STL file) with specific angles, distinguishing it from sibling tools like scale_stl or extend_stl_base.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like blender_mcp_edit_model or when not to use it. No context about prerequisites or preferred scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_templateB
Copy a 3MF, JSON, or config file into the local template registry and register it under a template name.
| Name | Required | Description | Default |
|---|---|---|---|
| source_path | Yes | Path to a local .3mf, .json, or .config file to save into the template registry. | |
| template_dir | No | Optional template directory override. Defaults to BAMBU_TEMPLATE_DIR or the server's configured local template registry. | |
| template_name | No | Optional template name. Defaults to the source filename without extension. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It omits important details such as whether existing templates are overwritten, required permissions, or potential side effects. The description is minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single concise sentence that immediately conveys the tool's purpose. No unnecessary words or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description is moderately complete but lacks information about the return value or success/failure behavior. It sufficiently explains the operation for a simple file copy and registration.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description adds little beyond what the schema already provides. It repeats file types but does not clarify default behavior or constraints not already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Copy and register'), the resource (3MF, JSON, or config file), and the target (local template registry under a template name). It effectively distinguishes from sibling tools like list_templates or slice_with_template.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives (e.g., upload_file). It does not mention prerequisites, exclusions, or context where other tools are preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scale_stlB
Scale an STL file by specified factors
| Name | Required | Description | Default |
|---|---|---|---|
| scale_x | No | Scale factor for X axis (default: 1.0) | |
| scale_y | No | Scale factor for Y axis (default: 1.0) | |
| scale_z | No | Scale factor for Z axis (default: 1.0) | |
| stl_path | Yes | Path to the STL file to scale |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It fails to mention whether the file is modified in-place, if a new file is created, or any side effects like overwriting. This is a significant gap for a transformation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no wasted words. However, it could include more useful details without becoming verbose, such as the effect of uniform scaling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description is incomplete. It lacks details on return values, error conditions, and the overall process (e.g., whether scaling is uniform or per-axis). This leaves the agent underinformed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and all parameters have descriptions defining their roles (scale factors with defaults, file path). The description adds no additional meaning beyond the schema, so baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Scale an STL file by specified factors' clearly states the verb (scale), resource (STL file), and scope (by factors). It effectively differentiates from sibling tools like rotate_stl and extend_stl_base.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when scaling is needed, but provides no explicit guidance on when to use this tool over alternatives or what conditions warrant scaling. No exclusions or alternative tool names mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_airduct_modeA
Set H2/P2 airduct mode to cooling or heating.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| mode | Yes | Airduct mode to apply | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must disclose behavioral traits. It does not mention any side effects, prerequisites, or limitations (e.g., whether the mode change is immediate or reversible). This is a basic level of transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no wasted words. It is front-loaded and to the point, though slightly ambiguous in phrasing ('Set H2/P2 airduct mode' could be read as a noun phrase but remains clear).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description covers the basic purpose but omits important context: the tool is specific to H2/P2 printers. A more complete description would clarify the target printer type and any prerequisites.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so the description adds no extra meaning beyond the schema. The schema already defines the mode enum and provides defaults for host, serial, and token.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Set') and the resource ('airduct mode') with specific values ('cooling or heating') and target hardware ('H2/P2'). It distinguishes itself from sibling tools like set_temperature or set_fan_speed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives or when not to use it. The description is minimal and does not differentiate usage from sibling tools like set_ams_drying.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_ams_dryingC
Start or stop the AMS filament drying cycle. X2D on macOS uses the native official plug-in route and supports AMS-HT id 128.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| action | Yes | Whether to start or stop the drying cycle | |
| ams_id | Yes | AMS unit index from 0 to 3, or 128 for an X2D AMS-HT. | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a state-changing operation (drying cycle) but discloses nothing about duration, whether it blocks, whether it requires the AMS to be loaded, or any auth/connection requirements. The macOS/X2D sentence gestures at context but does not clarify behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the core action front-loaded, so an agent gets the essence immediately. The trailing X2D/macOS sentence is cryptic and of uncertain value, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is too thin: it omits prerequisites, side effects, failure modes, and what the tool returns or changes. The one contextual sentence about the X2D/macOS route does not compensate for the missing operational detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters, including ams_id's 0-3/128 semantics. The description's mention of 'AMS-HT id 128' merely echoes the schema, adding no new meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb pair and resource: 'Start or stop the AMS filament drying cycle.' No sibling tool operates on AMS drying, so the scope is unambiguous in practice, though the description never explicitly differentiates itself from neighbors like set_airduct_mode or set_temperature the way a 5 would require.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites (e.g., printer must be idle/connected), and no mention of alternatives. The only contextual sentence is about an 'X2D on macOS native official plug-in route,' which is opaque rather than actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_fan_speedB
Set a Bambu printer fan speed percentage. X2D on macOS uses the installed Bambu networking plug-in without UI automation; other models use MQTT.
| Name | Required | Description | Default |
|---|---|---|---|
| fan | Yes | Fan to control: part, auxiliary, right_auxiliary, chamber, 1, 2, 3, or 10 | |
| host | No | Hostname or IP of the printer (default: value from env) | |
| speed | Yes | Fan speed percentage from 0 to 100 | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) | |
| confirm_during_print | No | Required for X2D fan changes while a print is running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description bears the full behavioral burden. It does disclose genuinely useful context — X2D on macOS uses the networking plug-in without UI automation while other models use MQTT — but says nothing about failure behavior, reversibility, or the in-print confirmation flow (only the schema hints at it).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core purpose front-loaded and no filler. The model-routing detail is relevant, though it slightly interrupts the primary statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple setter with no output schema, the description plus fully-covered schema give the agent enough to call it correctly. The model/macOS routing note covers the main behavioral quirk, though error and in-print confirmation behavior are only implied by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters including the enumerated fan choices and the confirm_during_print requirement. The description adds no parameter-level meaning beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb (Set) and resource (Bambu printer fan speed percentage), clearly separating it from siblings like set_print_speed, set_temperature, and set_light. It stops short of explicitly contrasting with those siblings, but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never states when to reach for this tool versus related setters (set_print_speed, set_airduct_mode) or about preconditions for changing fan speed. The model-specific routing note implies context but does not give the agent an explicit use/avoid condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_lightA
Set a Bambu printer light node mode using the printer's MQTT LED command
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| mode | Yes | Light mode to apply | |
| light | Yes | Light node to control, for example chamber_light | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. The description adds the MQTT mechanism and implies state mutation, but does not disclose side effects, required permissions, rate limits, or safety implications. More behavioral context would be beneficial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that is front-loaded with the verb and resource. No redundant or unnecessary words, making it highly concise and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple mutation tool with five parameters and no output schema, the description covers the basic functionality. Minor gaps include not specifying default behavior for optional parameters or failure results, but overall sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all five parameters. The description adds minimal extra meaning beyond the schema, such as the specific light node example and the enum values, but does not significantly enrich parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Set', the resource 'Bambu printer light node mode', and the mechanism 'using the printer's MQTT LED command'. It effectively distinguishes from siblings like set_airduct_mode or set_fan_speed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for controlling printer lights, but lacks explicit guidance on when to use versus alternatives, prerequisites, or exclusions. No when-not-to-use or alternative tool mentions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_print_speedB
Set the active print speed mode: silent, standard, sport, or ludicrous.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| mode | Yes | Speed mode to apply: silent/1, standard/2, sport/3, or ludicrous/4 | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden of disclosing behavior. It only states the function without revealing any side effects (e.g., whether the change is instantaneous, if it affects ongoing prints, if authentication is required). The description is too terse to convey important behavioral traits for an agent invoking the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that immediately conveys the tool's purpose and lists all options. It wastes no words and is easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple setter tool with no output schema and no annotations, the description is moderately complete. It correctly identifies the parameter and values but lacks context about prerequisites or consequences (e.g., does this require the printer to be online? Can it be called mid-print?). Given the complexity (4 params, but only one is core), it is adequate but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter described. The description adds marginal value by listing the symbolic mode names, but the schema already includes those as enum values. The 'host', 'bambu_serial', and 'bambu_token' parameters' meanings are not enhanced by the description. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Set') and the resource ('active print speed mode'), and enumerates the exact possible values ('silent, standard, sport, or ludicrous'). This is sufficiently specific to distinguish from other set_* sibling tools which target different parameters (airduct, fan, light, temperature).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites (e.g., printer must be connected or in certain state), nor does it indicate when not to use it. Sibling tools like 'pause_print', 'resume_print' suggest usage context, but the description itself lacks any usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_temperatureA
Set a checked bed or nozzle temperature. Positive heating requires matching fresh printer telemetry; nozzle heating also requires declared material. Zero turns the heater off.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| material | No | Loaded material, for example PLA or PETG. Required for positive nozzle heating, including non-RFID spools. | |
| component | Yes | Component to heat: bed, nozzle, or extruder | |
| bambu_model | No | Printer model, required for positive heating unless configured in the environment | |
| bambu_token | No | Access token (default: value from env) | |
| temperature | Yes | Finite target temperature in °C, checked against model/component and declared material limits | |
| bambu_serial | No | Serial number (default: value from env) | |
| nozzle_diameter | No | Installed nozzle diameter to compare with printer-reported configuration (default 0.4) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses preconditions (fresh telemetry, declared material for nozzles), that values are checked against model/component/material limits, and that temperature=0 disables the heater. It stops short of describing failure behavior, blocking semantics, or what happens when telemetry is stale beyond 'requires matching fresh'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences with zero filler, front-loading the primary action before the preconditions and the zero edge case. Every clause adds functional value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation tool with no annotations and no output schema, the description covers the critical gating behavior (telemetry freshness, material requirement, limit checks, zero=off). It does not clarify return/confirmation behavior or error handling, but the core operational contract an agent needs is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so params like material, bambu_model, and temperature limits are already fully documented in the schema. The description adds only the zero-disables semantics for temperature, which is a modest supplement. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Set) and resource (bed or nozzle temperature) with clear scope. It distinguishes itself from siblings like set_fan_speed, set_light, and set_ams_drying by naming exactly what it controls, and even notes the zero case, so an agent needs no schema inspection to know what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete conditions for use: positive heating requires matching fresh telemetry and, for nozzles, a declared material, while zero turns the heater off. This is clear context for when to invoke it as written, but it does not name or contrast any alternative sibling tools for temperature-adjacent tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skip_objectsA
Skip specific object IDs during a running multi-object print using the printer's MQTT skip_objects command
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| object_ids | Yes | Object IDs to skip. Use list_3mf_plate_objects on the sliced 3MF to find IDs. | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions using MQTT (network) but does not disclose reversibility, permission requirements, or error handling. Minimal behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no unnecessary words. It is front-loaded but could be slightly more structured with separate sentences for different aspects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description provides the core purpose and parameter guidance, but lacks information on return values, errors, or side effects, making it minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters, and the description adds value for object_ids by referencing list_3mf_plate_objects. The host, bambu_serial, and bambu_token defaults are already in the schema, so limited added meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (skip), the resource (object IDs during a running multi-object print), and the method (MQTT command). It distinguishes from sibling tools like pause_print or cancel_print.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies the context (during a running multi-object print) and guides the agent to use list_3mf_plate_objects to find object IDs. It does not explicitly state when not to use, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slice_stlA
Slice an STL or 3MF file using a slicer to generate printable G-code or sliced 3MF. IMPORTANT: bambu_model must be specified to ensure the slicer generates safe G-code for the correct printer.
| Name | Required | Description | Default |
|---|---|---|---|
| scale | No | Uniform scale factor applied to all axes. 1.0 = original size, 2.0 = double, 0.5 = half. Applied before slicing. | |
| orient | No | Auto-orient the model for optimal printability (minimize supports, maximize bed adhesion). Recommended for raw STL imports that lack a pre-set orientation. | |
| rotate | No | Rotate the model around the Z-axis (vertical) by this many degrees before slicing. Positive = counterclockwise when viewed from above. | |
| arrange | No | Auto-arrange all objects on the build plate with optimal spacing. Recommended when importing STLs or adding multiple objects. Set false to preserve existing plate layout. | |
| bed_type | No | Bed plate type for slicing (default: textured_plate). SuperTack is accepted only for pre-sliced print jobs until the BambuStudio CLI identifier is verified. | |
| min_save | No | Write a smaller output 3MF by omitting non-essential metadata. Reduces file size for faster FTP upload to the printer. | |
| rotate_x | No | Rotate the model around the X-axis by this many degrees before slicing. Useful for reorienting prints for better layer adhesion. | |
| rotate_y | No | Rotate the model around the Y-axis by this many degrees before slicing. Useful for reorienting prints for better layer adhesion. | |
| stl_path | Yes | Path to the STL or 3MF file to slice | |
| uptodate | No | Refresh 3MF preset configs to match the latest BambuStudio version. Use when slicing downloaded or older 3MF files to prevent stale-config failures. | |
| bambu_model | Yes | REQUIRED: Bambu Lab printer model. Ask the user if not known. Using the wrong model can damage the printer. | |
| nozzle_type | No | Bambu-compatible slicing: the hotend nozzle material installed on the printer (default: BAMBU_NOZZLE_TYPE, else the model preset's stock nozzle, usually stainless_steel). Printing compares it with the printer's reported nozzle. | |
| repetitions | No | Print N identical copies of the model. Each copy gets its own plate placement. Example: 3 prints three copies. | |
| slice_plate | No | Which plate index to slice. 0 = all plates (default). Use 1, 2, etc. to slice only a specific plate in multi-plate 3MF projects. | |
| slicer_path | No | Path to the slicer executable (default: value from env). Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1. | |
| slicer_type | No | Type of slicer to use. Bambu-compatible choices (bambustudio, orcaslicer, orcaslicer-bambulab) export sliced 3MF; aliases such as fulu-orca and orca-studio are accepted. | |
| skip_objects | No | Skip specific objects during slicing by index. Comma-separated, e.g. '3,5,10'. Useful for multi-object 3MFs where you only want to print some parts. | |
| template_dir | No | Optional template directory override when resolving template_name. | |
| clone_objects | No | Duplicate specific objects on the plate. Comma-separated clone counts per object index, e.g. '1,3,1,10' clones object 0 once, object 1 three times, etc. | |
| ensure_on_bed | No | Detect models floating above the bed and lower them onto the build surface. Safety net for imported models with incorrect Z origins. | |
| template_name | No | Optional named template from the local registry. Resolves to template_3mf_path automatically. | |
| allow_mix_temp | No | Allow filaments with different temperature requirements on the same plate. Required for multi-material prints mixing e.g. PLA and PETG. | |
| load_filaments | No | Override filament profiles. Semicolon-separated paths to filament JSON configs, e.g. 'pla_basic.json;petg_cf.json'. | |
| slicer_profile | No | Path to an optional process profile/config file. The exact bambu_model/nozzle machine preset is still required. | |
| nozzle_diameter | No | Nozzle diameter in mm (default: 0.4) | |
| enable_timelapse | No | Insert timelapse parking moves into gcode. The toolhead parks at a fixed position each layer for camera capture. Adds ~10% print time. | |
| filament_colours | No | Optional slot colours, one #RRGGBB per filament slot in order, separated by ';' (e.g. '#161616;#FFFFFF'). Defaults to the input 3MF's project colours, else the BambuStudio default. | |
| filament_profile | No | Compatibility alias for load_filaments. Semicolon-separated Orca/Bambu filament profile JSON paths. | |
| load_filament_ids | No | Map filaments to objects/parts. Comma-separated IDs matching load_filaments order, e.g. '1,2,3,1' assigns filament 1 to objects 0 and 3. | |
| template_3mf_path | No | Optional template 3MF whose embedded Bambu slicer settings should be reused when slicing a new STL or 3MF. | |
| skip_modified_gcodes | No | Strip custom start/end gcodes embedded in the 3MF. Recommended for downloaded 3MFs since custom gcodes from other users' profiles may be unsafe for your printer. | |
| use_printer_filaments | No | When true, and no explicit slicer profile or load_filaments override is provided, use the printer's current or first loaded AMS filament as the slicer filament profile. Template 3MF process settings can still be used at the same time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully flags the safety-critical requirement and the risk of damaging the printer with the wrong model, but it says nothing about the output artifact (where the G-code/3MF is written, what path is returned) or side effects, which matters for a tool whose whole job is producing a file.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, and the critical requirement is front-loaded with an IMPORTANT marker. It is tight and well-structured, though for a 32-parameter tool the extreme brevity leaves useful information unstated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a highly complex tool (32 params, 4 enums, no output schema, no annotations). The description never states what the call returns or where the sliced output lands, nor does it cover the interaction with sibling tools like upload_gcode. For this complexity level, the definition is too thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 32 parameters, so the schema already documents every parameter, including the bambu_model warning the description repeats. The description adds no parameter meaning beyond the schema, which sets the baseline at 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (slice an STL or 3MF) and the outcome (printable G-code or sliced 3MF). This clearly distinguishes it from siblings like scale_stl, rotate_stl, and slice_with_template, which share the domain but do different things.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a hard prerequisite (bambu_model must be specified) and explains why (safe G-code for the correct printer), which is real usage context. However, it never routes the agent against alternatives such as slice_with_template or get_slice_settings, so the when-to-use-this-vs-another guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slice_with_templateA
Slice an STL or 3MF using a named template from the local registry. This is a higher-level wrapper around slice_stl for template-based workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| scale | No | Uniform scale factor. | |
| orient | No | Auto-orient model for optimal printability. | |
| rotate | No | Z-axis rotation in degrees. | |
| arrange | No | Auto-arrange objects on the build plate. | |
| bed_type | No | Bed plate type for slicing (default: textured_plate). SuperTack is accepted only for pre-sliced print jobs until the BambuStudio CLI identifier is verified. | |
| min_save | No | Produce smaller output 3MF. | |
| rotate_x | No | X-axis rotation in degrees. | |
| rotate_y | No | Y-axis rotation in degrees. | |
| stl_path | Yes | Path to the STL or 3MF file to slice | |
| bambu_model | Yes | REQUIRED: Bambu Lab printer model. Ask the user if not known. Using the wrong model can damage the printer. | |
| bambu_token | No | Access token (default: value from env) | |
| nozzle_type | No | Bambu-compatible slicing: the hotend nozzle material installed on the printer (default: BAMBU_NOZZLE_TYPE, else the model preset's stock nozzle, usually stainless_steel). Printing compares it with the printer's reported nozzle. | |
| repetitions | No | Number of copies to print. | |
| slice_plate | No | Which plate index to slice. 0 = all plates. | |
| slicer_path | No | Path to the slicer executable (default: value from env). Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1. | |
| slicer_type | No | Type of slicer to use. Bambu-compatible choices (bambustudio, orcaslicer, orcaslicer-bambulab) export sliced 3MF; aliases such as fulu-orca and orca-studio are accepted. | |
| bambu_serial | No | Serial number (default: value from env) | |
| template_dir | No | Optional template directory override when resolving template_name. | |
| ensure_on_bed | No | Lift floating models onto the bed. | |
| template_name | Yes | Named template from the local registry. | |
| load_filaments | No | Override filament profiles. Semicolon-separated paths to filament JSON configs. | |
| slicer_profile | No | Explicit slicer profile/config file. Overrides the named template only when provided in the tool call. | |
| nozzle_diameter | No | Nozzle diameter in mm (default: 0.4) | |
| filament_colours | No | Optional slot colours, one #RRGGBB per filament slot in order, separated by ';' (e.g. '#161616;#FFFFFF'). Defaults to the input 3MF's project colours, else the BambuStudio default. | |
| load_filament_ids | No | Optional filament-to-object mapping string. | |
| skip_modified_gcodes | No | Ignore stale custom gcodes in the 3MF. | |
| use_printer_filaments | No | When true, and no explicit slicer profile or load_filaments override is provided, use the printer's current or first loaded AMS filament as the slicer filament profile. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It says nothing about side effects: with host, bambu_serial, bambu_token and print-related siblings present, it is unclear whether this only produces a sliced file or can also send a job to a printer, nor does it mention required permissions or reversibility. For a 28-parameter mutation-adjacent tool this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the core action front-loaded and the sibling relationship placed second. Appropriately terse given that the schema carries the parameter detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, but the input schema is unusually rich (100% coverage, enums, defaults, embedded safety warnings), which supplies most of what an agent needs. The remaining gap is behavioral context around printing versus slicing-only, which the description does not resolve.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 28 parameters thoroughly (enums, defaults, the printer-damage warning on bambu_model). The description only gestures at template_name via "a named template from the local registry" and adds no syntax, format, or interaction detail beyond the schema. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (slice) and resource (STL or 3MF), and explicitly positions itself relative to a sibling by naming slice_stl as the lower-level primitive. An agent can distinguish the two tools without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"For template-based workflows" implies the condition that selects this tool over slice_stl, and the sibling is named. However there is no explicit when-not guidance (e.g. when to use slice_stl or the printer-side print tools instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_printB
Start printing a G-code file already on the Bambu Lab printer. Alias of start_print_job for upstream MCP compatibility.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| filename | Yes | Name of the file to print | |
| bambu_model | Yes | REQUIRED: Bambu Lab printer model. Ask the user if not known. Starting G-code for the wrong model can damage the printer. | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a precondition (the file must already be on the printer) and that the operation is potentially destructive physically, but it never states the safety/power-on requirements, that this actually begins a physical print, or the failure modes – the only safety warning lives in the schema, not the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and followed by the alias rationale. Nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition is adequate for a compatibility alias whose schema is fully documented, but for a safety-critical action tool with no annotations and no output schema it omits meaningful context: which alias to prefer, expected response, and behavioral side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so host, filename, bambu_model, bambu_token, and bambu_serial are already documented, including the model-safety warning. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start printing a G-code file') and names the sibling it duplicates ('Alias of start_print_job'), so an agent can distinguish it from unrelated siblings. It stops short of explaining what differentiates it from start_print_job beyond being a compatibility alias, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The alias note implies either this or start_print_job can be used for the same action, which is helpful routing context. However, it never states when to prefer this tool over start_print_job, nor any exclusion or precondition for choosing it, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_print_jobB
Start printing a G-code file already on the Bambu Lab printer
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| filename | Yes | Name of the file to print | |
| bambu_model | Yes | REQUIRED: Bambu Lab printer model. Ask the user if not known. Starting G-code for the wrong model can damage the printer. | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it only restates the action. It says nothing about authentication needs (bambu_token/serial), that the action is irreversible once extrusion begins, or that cancel_print exists as the recovery path. For a tool that physically actuates hardware this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with zero filler, and the precondition is stated first. It is efficient, though arguably under-specified for the risk level of the operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description is the only source of behavioral context, and it omits permissions, irreversibility, and post-start behavior. For a hardware-mutating tool it should do substantially more.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both required and optional parameters are already documented, including the model-safety warning and enum. The description adds no parameter-level meaning beyond the schema, so it lands at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (start printing) and resource (a G-code file already on the printer), and the phrase 'already on the printer' implicitly distinguishes it from siblings like print_3mf or upload_gcode. However, it never explicitly names the near-identical sibling start_print, so an agent could confuse the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The precondition that the file must already exist on the printer is implied, which is useful routing context versus print_3mf/print_3mf_bambu_network. But there is no explicit when-to-use, when-not-to-use, or named alternative, so selection between this and start_print remains guesswork.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileC
Upload a local file to the Bambu Lab printer
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| No | Start printing after upload (default: false) | ||
| bed_type | No | Bed plate type for the native X2D uploader (default: textured_plate). | |
| filename | Yes | Name for the file on the printer | |
| file_path | Yes | Local path to the file to upload | |
| bambu_model | No | Required for every printable .gcode or .3mf upload, including upload-only operations. | |
| bambu_token | No | Access token (default: value from env) | |
| plate_index | No | Zero-based plate index passed to the native X2D uploader (default: 0). | |
| preset_name | No | Optional printer preset name passed to the native X2D uploader. | |
| bambu_serial | No | Serial number (default: value from env) | |
| project_name | No | Optional project name passed to the native X2D uploader; defaults to filename. | |
| connection_mode | No | Upload transport; bambu_native uses the installed Bambu networking plug-in for X2D and never starts printing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and discloses almost nothing: it does not mention that a printer token/serial/host are needed for auth, that bambu_model is mandatory for printable uploads, or that connection_mode=bambu_native never starts a print. Only the implied 'write to device' nature of the operation is conveyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the verb and resource front-loaded and zero filler. It is concise but arguably under-specified rather than optimally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, dual-transport network operation with auth requirements and no annotations or output schema, the one-line description is far too thin to be complete. It omits transport selection semantics, printing side effects, and prerequisites that an agent needs before invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (all 12 parameters, defaults, and enums documented inline), so the schema already does the heavy lifting. The description adds no parameter meaning beyond 'a local file', which is the baseline expectation here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (upload) and resource (a local file to the Bambu Lab printer), which is unambiguous on its own. However, it never distinguishes itself from close siblings like upload_gcode, print_3mf, or print_3mf_bambu_network, leaving the agent to guess which upload path is correct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusions, and no mention of the alternative siblings (upload_gcode, print_3mf, print_3mf_bambu_network) that also move files to the printer. The agent gets no help choosing between competing upload/print tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_gcodeB
Inspect a G-code file and upload a uniquely named copy without overwriting existing printer files.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Hostname or IP of the printer (default: value from env) | |
| gcode | No | G-code content to upload, or a readable local .gcode path. Required unless gcode_path is provided. For large files, prefer gcode_path. | |
| filename | Yes | Name for the file on the printer | |
| gcode_path | No | Local path to a .gcode file to upload. Required unless gcode is provided. This avoids sending large G-code bodies through the MCP request. | |
| bambu_model | No | Required printer model for inspecting the uploaded G-code, even when not starting it. | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose meaningful traits: an inspection step and non-destructive uniqueness (no overwriting existing printer files). However, it is silent on authentication requirements (the host/token/serial params imply credentialed access), what 'inspect' validates, and error/failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words, efficiently conveying the two core actions and the uniqueness guarantee. It is well-sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, no-annotation, no-output-schema tool, the description is thin: it omits credentials expectations, the relationship to the printing workflow, and how the 'inspection' outcome affects the upload. The rich schema compensates for parameter gaps, but the workflow context is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all seven parameters, including the gcode vs gcode_path tradeoff and the required bambu_model enum. The description adds no parameter-level meaning beyond the baseline, so a 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Inspect a G-code file and upload a uniquely named copy') and adds scope constraints (unique naming, no overwriting). It is clear what the tool does, but it never differentiates itself from the sibling 'upload_file', leaving the agent to infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this over 'upload_file', 'start_print', or the other upload/print siblings, and no stated prerequisites or exclusions. The only usable signal is the implied 'G-code-specific' scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
x2d_native_controlB
Read calibration results or update X2D AMS metadata/calibration selection through the installed plug-in. Raw motion, heating, task control, and safety-setting changes are rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| qos | No | MQTT QoS used by Bambu Studio (0 or 1; default 0). | |
| flag | No | Bambu networking plug-in command flag (0 or 1; default 0). | |
| host | No | Hostname or IP of the printer (default: value from env) | |
| bambu_token | No | Access token (default: value from env) | |
| bambu_serial | No | Serial number (default: value from env) | |
| message_json | Yes | JSON print envelope for ams_filament_setting, extrusion_cali_sel, extrusion_cali_get, extrusion_cali_get_result, or flowrate_get_result. A sequence_id is required; extra fields are rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It usefully discloses that operations run 'through the installed plug-in' and that entire command classes are rejected, but it says nothing about permissions/authentication, reversibility of the AMS metadata updates, or return behavior. Real added value, but incomplete for a read+write tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loading purpose then constraints, with zero padding. Only minor deduction because 'X2D' is an unglossed term an outside agent may not recognize.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations mean the description must cover more ground. It establishes domain and rejected command classes but leaves the mutation semantics, expected responses, and the relationship to sibling network tools unaddressed, so it is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and message_json already enumerates the supported commands (ams_filament_setting, extrusion_cali_sel, etc.). The description adds no syntax, format, or sequencing detail beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs (read/update) and resources (calibration results, X2D AMS metadata/calibration selection) and names the mechanism (installed plug-in), so the agent knows this is a native-control passthrough. It does not explicitly differentiate from lookalike siblings such as bambu_network_call, keeping it at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a negative scope ('raw motion, heating, task control, and safety-setting changes are rejected'), which tells the agent what this tool will not do. However, it names no positive when-to-use conditions and no alternative tool for the rejected operations, leaving usage largely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v1.1.22- Changed
print_3mf1 field changed- added
Input schema / properties / nozzle_typeAdded value: +{ + "description": "Installed nozzle material, used when the 3MF must be auto-sliced (default: BAMBU_NOZZLE_TYPE, else the preset's stock nozzle).", + "enum": [ + "stainless_steel", + "hardened_steel", + "tungsten_carbide", + "brass" + ], + "type": "string" +}
- Changed
print_3mf_bambu_network1 field changed- added
Input schema / properties / nozzle_typeAdded value: +{ + "description": "Installed nozzle material, used when the 3MF must be auto-sliced (default: BAMBU_NOZZLE_TYPE, else the preset's stock nozzle).", + "enum": [ + "stainless_steel", + "hardened_steel", + "tungsten_carbide", + "brass" + ], + "type": "string" +}
- Changed
slice_stl1 field changed- added
Input schema / properties / nozzle_typeAdded value: +{ + "description": "Bambu-compatible slicing: the hotend nozzle material installed on the printer (default: BAMBU_NOZZLE_TYPE, else the model preset's stock nozzle, usually stainless_steel). Printing compares it with the printer's reported nozzle.", + "enum": [ + "stainless_steel", + "hardened_steel", + "tungsten_carbide", + "brass" + ], + "type": "string" +}
- Changed
slice_with_template1 field changed- added
Input schema / properties / nozzle_typeAdded value: +{ + "description": "Bambu-compatible slicing: the hotend nozzle material installed on the printer (default: BAMBU_NOZZLE_TYPE, else the model preset's stock nozzle, usually stainless_steel). Printing compares it with the printer's reported nozzle.", + "enum": [ + "stainless_steel", + "hardened_steel", + "tungsten_carbide", + "brass" + ], + "type": "string" +}
24 tool updates
v1.1.14- Added
bambu_connect_import_file - Changed
bambu_network_bridge_status1 field changed- changed
Input schema / properties / bridge_command / descriptionPrevious value: -"Override command for the FULU bridge host or macOS/WSL wrapper; defaults to BAMBU_NETWORK_BRIDGE_COMMAND."New value: +"Override command for the FULU bridge host or macOS/WSL wrapper; defaults to BAMBU_NETWORK_BRIDGE_COMMAND. Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1."
- Changed
bambu_network_call1 field changed- changed
Input schema / properties / bridge_command / descriptionPrevious value: -"Override command for the FULU bridge host or macOS/WSL wrapper; defaults to BAMBU_NETWORK_BRIDGE_COMMAND."New value: +"Override command for the FULU bridge host or macOS/WSL wrapper; defaults to BAMBU_NETWORK_BRIDGE_COMMAND. Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1."
- Added
blender_mcp_call - Changed
blender_mcp_edit_model9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / bridge_command / descriptionPrevious value: -"Override command for invoking Blender MCP bridge"New value: +"Legacy custom bridge executable override, not a standard MCP command. Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1." - changed
Input schema / properties / execute / descriptionPrevious value: -"Execute bridge command (true) or return payload only (false)"New value: +"Apply edits and export (true) or validate and return the prepared request without connecting (false, default)." - changed
Input schema / properties / operations / descriptionPrevious value: -"Ordered edit operations for Blender (e.g. remesh, boolean, decimate)"New value: +"Ordered operations: decimate:<ratio greater than 0 and at most 1>, remesh:<positive voxel size in STL units>, boolean_union:<STL path>. Legacy custom bridges define their own operations." - added
Input schema / properties / operations / maxItemsAdded value: +64 - added
Input schema / properties / operations / minItemsAdded value: +1 - added
Input schema / properties / output_pathAdded value: +{ + "description": "Required for standard MCP previews and execution: new local STL output path whose parent exists. Existing files are never overwritten. Optional for legacy-only bridge configuration.", + "type": "string" +} - added
Input schema / properties / timeout_msAdded value: +{ + "description": "Total Blender request deadline in milliseconds; defaults to BLENDER_MCP_TIMEOUT_MS or 120000.", + "maximum": 300000, + "minimum": 100, + "type": "integer" +} - added
Input schema / properties / user_promptAdded value: +{ + "description": "The user's own words describing the edit, passed unchanged to Blender MCP.", + "type": "string" +}
- Added
blender_mcp_status - Changed
camera_snapshot1 field changed- changed
Input schema / properties / ffmpeg_path / descriptionPrevious value: -"Override path to the ffmpeg binary used by the RTSP path. Defaults to ffmpeg via $PATH. Required only for the RTSP transport (X1, P2S, H2 series)."New value: +"Override path to the ffmpeg binary used by the RTSP path. Defaults to FFMPEG_PATH or ffmpeg via $PATH. Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1. Required only for the RTSP transport (X1, P2S, H2 series, X2D)."
- Changed
get_printer_filaments1 field changed- changed
Input schema / properties / bambu_model / enumPrevious value: -[ - "p1s", - "p1p", - "p2s", - "x1c", - "x1e", - "a1", - "a1mini", - "h2d", - "h2s" -]New value: +[ + "p1s", + "p1p", + "p2s", + "x1c", + "x1e", + "a1", + "a1mini", + "h2d", + "h2s", + "h2c", + "x2d" +]
- Changed
get_slice_settings1 field changed- removed
Input schema / anyOfRemoved value: -[ - { - "required": [ - "source_path" - ] - }, - { - "required": [ - "template_name" - ] - } -]
- Changed
print_3mf6 fields changed- changed
Input schema / properties / bambu_model / enumPrevious value: -[ - "p1s", - "p1p", - "p2s", - "x1c", - "x1e", - "a1", - "a1mini", - "h2d", - "h2s" -]New value: +[ + "p1s", + "p1p", + "p2s", + "x1c", + "x1e", + "a1", + "a1mini", + "h2d", + "h2s", + "h2c", + "x2d" +] - changed
Input schema / properties / bridge_command / descriptionPrevious value: -"Override command for the FULU bridge host or macOS/WSL wrapper; defaults to BAMBU_NETWORK_BRIDGE_COMMAND."New value: +"Override command for the FULU bridge host or macOS/WSL wrapper; defaults to BAMBU_NETWORK_BRIDGE_COMMAND. Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1." - changed
Input schema / properties / connection_mode / descriptionPrevious value: -"Print path to use: lan_mqtt_ftps uses this MCP's direct local MQTT/FTPS path; bambu_network uses the restored FULU BambuNetwork bridge."New value: +"Print path: bambu_connect hands a printable file to the signed-in Bambu Connect app for cloud-mode review; X2D otherwise defaults to bambu_native (Bambu Studio's installed local networking plug-in and emmc tunnel); lan_mqtt_ftps is the legacy direct MQTT/FTPS path; bambu_network uses the FULU bridge." - changed
Input schema / properties / connection_mode / enumPrevious value: -[ - "lan_mqtt_ftps", - "bambu_network" -]New value: +[ + "lan_mqtt_ftps", + "bambu_network", + "bambu_native", + "bambu_connect" +] - added
Input schema / properties / nozzle_diametersAdded value: +{ + "description": "Complete per-nozzle diameters for a pre-sliced job, e.g. [0.4, 0.6]. Omit to verify its declared diameters against live telemetry; cannot combine with nozzle_diameter.", + "items": { + "enum": [ + 0.2, + 0.4, + 0.6, + 0.8 + ], + "type": "number" + }, + "maxItems": 2, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / slicer_path / descriptionPrevious value: -"Path to the slicer executable for auto-slicing (default: value from env or a platform default)"New value: +"Path to the slicer executable for auto-slicing (default: value from env or a platform default). Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1."
- Changed
print_3mf_bambu_network5 fields changed- changed
Input schema / properties / bambu_model / enumPrevious value: -[ - "p1s", - "p1p", - "p2s", - "x1c", - "x1e", - "a1", - "a1mini", - "h2d", - "h2s" -]New value: +[ + "p1s", + "p1p", + "p2s", + "x1c", + "x1e", + "a1", + "a1mini", + "h2d", + "h2s", + "h2c", + "x2d" +] - changed
Input schema / properties / bridge_command / descriptionPrevious value: -"Override command for the FULU bridge host or macOS/WSL wrapper; defaults to BAMBU_NETWORK_BRIDGE_COMMAND."New value: +"Override command for the FULU bridge host or macOS/WSL wrapper; defaults to BAMBU_NETWORK_BRIDGE_COMMAND. Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1." - added
Input schema / properties / nozzle_diametersAdded value: +{ + "description": "Complete per-nozzle diameters for pre-sliced jobs, e.g. [0.4, 0.6]. Omit to verify file metadata against every reported nozzle; cannot combine with nozzle_diameter.", + "items": { + "enum": [ + 0.2, + 0.4, + 0.6, + 0.8 + ], + "type": "number" + }, + "maxItems": 2, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / slicer_path / descriptionPrevious value: -"Path to the slicer executable for auto-slicing; defaults to value from env or a platform default."New value: +"Path to the slicer executable for auto-slicing; defaults to value from env or a platform default. Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1." - changed
Input schema / properties / task_name / descriptionPrevious value: -"Optional BambuNetwork task name; defaults to the project name."New value: +"Optional project label when project_name is omitted. The submitted task name uses a unique inspected-job identity for safe resume."
- Changed
print_collar_charm6 fields changed- removed
Input schema / anyOfRemoved value: -[ - { - "required": [ - "source_path", - "bambu_model" - ] - }, - { - "required": [ - "template_name", - "bambu_model" - ] - } -] - changed
Input schema / properties / bambu_model / descriptionPrevious value: -"REQUIRED: Bambu Lab printer model. H2D and H2S are the primary intended paths."New value: +"REQUIRED: Bambu Lab printer model. H2D, H2S, and H2C are the primary intended paths. X2D direct printing is not supported." - changed
Input schema / properties / bambu_model / enumPrevious value: -[ - "p1s", - "p1p", - "p2s", - "x1c", - "x1e", - "a1", - "a1mini", - "h2d", - "h2s" -]New value: +[ + "p1s", + "p1p", + "p2s", + "x1c", + "x1e", + "a1", + "a1mini", + "h2d", + "h2s", + "h2c", + "x2d" +] - changed
Input schema / properties / source_path / descriptionPrevious value: -"Path to a prepared collar charm .3mf project or sliced 3MF."New value: +"Path to a prepared collar charm .3mf project or sliced 3MF. Required unless template_name is provided." - changed
Input schema / properties / template_name / descriptionPrevious value: -"Named collar charm template from the local registry. Resolves source_path automatically."New value: +"Named collar charm template from the local registry. Required unless source_path is provided; resolves source_path automatically." - added
Input schema / requiredAdded value: +[ + "bambu_model" +]
- Changed
reread_ams_rfid1 field changed- changed
Input schema / properties / ams_id / descriptionPrevious value: -"AMS unit index from 0 to 3"New value: +"AMS unit index from 0 to 3, or 128 for an X2D AMS-HT."
- Changed
resolve_3mf_ams_slots1 field changed- changed
Input schema / properties / bambu_model / enumPrevious value: -[ - "p1s", - "p1p", - "p2s", - "x1c", - "x1e", - "a1", - "a1mini", - "h2d", - "h2s" -]New value: +[ + "p1s", + "p1p", + "p2s", + "x1c", + "x1e", + "a1", + "a1mini", + "h2d", + "h2s", + "h2c", + "x2d" +]
- Changed
set_ams_drying1 field changed- changed
Input schema / properties / ams_id / descriptionPrevious value: -"AMS unit index from 0 to 3"New value: +"AMS unit index from 0 to 3, or 128 for an X2D AMS-HT."
- Changed
set_fan_speed2 fields changed- added
Input schema / properties / confirm_during_printAdded value: +{ + "description": "Required for X2D fan changes while a print is running.", + "type": "boolean" +} - changed
Input schema / properties / fan / descriptionPrevious value: -"Fan to control: part, auxiliary, chamber, 1, 2, or 3"New value: +"Fan to control: part, auxiliary, right_auxiliary, chamber, 1, 2, 3, or 10"
- Changed
set_temperature5 fields changed- added
Input schema / properties / bambu_modelAdded value: +{ + "description": "Printer model, required for positive heating unless configured in the environment", + "enum": [ + "p1s", + "p1p", + "p2s", + "x1c", + "x1e", + "a1", + "a1mini", + "h2d", + "h2s", + "h2c", + "x2d" + ], + "type": "string" +} - added
Input schema / properties / materialAdded value: +{ + "description": "Loaded material, for example PLA or PETG. Required for positive nozzle heating, including non-RFID spools.", + "type": "string" +} - added
Input schema / properties / nozzle_diameterAdded value: +{ + "description": "Installed nozzle diameter to compare with printer-reported configuration (default 0.4)", + "enum": [ + 0.2, + 0.4, + 0.6, + 0.8 + ], + "type": "number" +} - changed
Input schema / properties / temperature / descriptionPrevious value: -"Target temperature in °C"New value: +"Finite target temperature in °C, checked against model/component and declared material limits" - added
Input schema / properties / temperature / minimumAdded value: +0
- Changed
slice_stl4 fields changed- changed
Input schema / properties / bambu_model / enumPrevious value: -[ - "p1s", - "p1p", - "p2s", - "x1c", - "x1e", - "a1", - "a1mini", - "h2d", - "h2s" -]New value: +[ + "p1s", + "p1p", + "p2s", + "x1c", + "x1e", + "a1", + "a1mini", + "h2d", + "h2s", + "h2c", + "x2d" +] - added
Input schema / properties / filament_coloursAdded value: +{ + "description": "Optional slot colours, one #RRGGBB per filament slot in order, separated by ';' (e.g. '#161616;#FFFFFF'). Defaults to the input 3MF's project colours, else the BambuStudio default.", + "type": "string" +} - changed
Input schema / properties / slicer_path / descriptionPrevious value: -"Path to the slicer executable (default: value from env)"New value: +"Path to the slicer executable (default: value from env). Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1." - changed
Input schema / properties / slicer_profile / descriptionPrevious value: -"Path to the slicer profile/config file (optional, overrides bambu_model preset)"New value: +"Path to an optional process profile/config file. The exact bambu_model/nozzle machine preset is still required."
- Changed
slice_with_template3 fields changed- changed
Input schema / properties / bambu_model / enumPrevious value: -[ - "p1s", - "p1p", - "p2s", - "x1c", - "x1e", - "a1", - "a1mini", - "h2d", - "h2s" -]New value: +[ + "p1s", + "p1p", + "p2s", + "x1c", + "x1e", + "a1", + "a1mini", + "h2d", + "h2s", + "h2c", + "x2d" +] - added
Input schema / properties / filament_coloursAdded value: +{ + "description": "Optional slot colours, one #RRGGBB per filament slot in order, separated by ';' (e.g. '#161616;#FFFFFF'). Defaults to the input 3MF's project colours, else the BambuStudio default.", + "type": "string" +} - changed
Input schema / properties / slicer_path / descriptionPrevious value: -"Path to the slicer executable (default: value from env)"New value: +"Path to the slicer executable (default: value from env). Per-call overrides require MCP_ALLOW_EXECUTABLE_ARG=1."
- Changed
start_print1 field changed- changed
Input schema / properties / bambu_model / enumPrevious value: -[ - "p1s", - "p1p", - "p2s", - "x1c", - "x1e", - "a1", - "a1mini", - "h2d", - "h2s" -]New value: +[ + "p1s", + "p1p", + "p2s", + "x1c", + "x1e", + "a1", + "a1mini", + "h2d", + "h2s", + "h2c", + "x2d" +]
- Changed
start_print_job1 field changed- changed
Input schema / properties / bambu_model / enumPrevious value: -[ - "p1s", - "p1p", - "p2s", - "x1c", - "x1e", - "a1", - "a1mini", - "h2d", - "h2s" -]New value: +[ + "p1s", + "p1p", + "p2s", + "x1c", + "x1e", + "a1", + "a1mini", + "h2d", + "h2s", + "h2c", + "x2d" +]
- Changed
upload_file7 fields changed- changed
Input schema / properties / bambu_model / descriptionPrevious value: -"Required when print is true. Bambu Lab printer model used as a safety confirmation before starting the uploaded file."New value: +"Required for every printable .gcode or .3mf upload, including upload-only operations." - changed
Input schema / properties / bambu_model / enumPrevious value: -[ - "p1s", - "p1p", - "p2s", - "x1c", - "x1e", - "a1", - "a1mini", - "h2d", - "h2s" -]New value: +[ + "p1s", + "p1p", + "p2s", + "x1c", + "x1e", + "a1", + "a1mini", + "h2d", + "h2s", + "h2c", + "x2d" +] - added
Input schema / properties / bed_typeAdded value: +{ + "description": "Bed plate type for the native X2D uploader (default: textured_plate).", + "enum": [ + "textured_plate", + "cool_plate", + "engineering_plate", + "hot_plate", + "supertack_plate" + ], + "type": "string" +} - added
Input schema / properties / connection_modeAdded value: +{ + "description": "Upload transport; bambu_native uses the installed Bambu networking plug-in for X2D and never starts printing.", + "enum": [ + "lan_mqtt_ftps", + "bambu_native" + ], + "type": "string" +} - added
Input schema / properties / plate_indexAdded value: +{ + "description": "Zero-based plate index passed to the native X2D uploader (default: 0).", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / preset_nameAdded value: +{ + "description": "Optional printer preset name passed to the native X2D uploader.", + "type": "string" +} - added
Input schema / properties / project_nameAdded value: +{ + "description": "Optional project name passed to the native X2D uploader; defaults to filename.", + "type": "string" +}
- Changed
upload_gcode4 fields changed- removed
Input schema / anyOfRemoved value: -[ - { - "required": [ - "gcode" - ] - }, - { - "required": [ - "gcode_path" - ] - } -] - added
Input schema / properties / bambu_modelAdded value: +{ + "description": "Required printer model for inspecting the uploaded G-code, even when not starting it.", + "enum": [ + "p1s", + "p1p", + "p2s", + "x1c", + "x1e", + "a1", + "a1mini", + "h2d", + "h2s", + "h2c", + "x2d" + ], + "type": "string" +} - changed
Input schema / properties / gcode / descriptionPrevious value: -"G-code content to upload, or a readable local .gcode path. For large files, prefer gcode_path."New value: +"G-code content to upload, or a readable local .gcode path. Required unless gcode_path is provided. For large files, prefer gcode_path." - changed
Input schema / properties / gcode_path / descriptionPrevious value: -"Local path to a .gcode file to upload. This avoids sending large G-code bodies through the MCP request."New value: +"Local path to a .gcode file to upload. Required unless gcode is provided. This avoids sending large G-code bodies through the MCP request."
- Added
x2d_native_control
41 tool updates
v1.1.1- First observed
bambu_network_bridge_status - First observed
bambu_network_call - First observed
blender_mcp_edit_model - First observed
camera_snapshot - First observed
cancel_print - First observed
center_model - First observed
clear_hms_errors - First observed
delete_printer_file - First observed
extend_stl_base - First observed
get_printer_filaments - First observed
get_printer_status - First observed
get_slice_settings - First observed
get_stl_info - First observed
lay_flat - First observed
list_3mf_plate_objects - First observed
list_printer_files - First observed
list_templates - First observed
merge_vertices - First observed
pause_print - First observed
print_3mf - First observed
print_3mf_bambu_network - First observed
print_collar_charm - First observed
reread_ams_rfid - First observed
resolve_3mf_ams_slots - First observed
resume_print - First observed
rotate_stl - First observed
save_template - First observed
scale_stl - First observed
set_airduct_mode - First observed
set_ams_drying - First observed
set_fan_speed - First observed
set_light - First observed
set_print_speed - First observed
set_temperature - First observed
skip_objects - First observed
slice_stl - First observed
slice_with_template - First observed
start_print - First observed
start_print_job - First observed
upload_file - First observed
upload_gcode
TDQS
Scored across 45 tools
Several tools have overlapping purposes: start_print and start_print_job are aliases, slice_stl and slice_with_template are related, and print_3mf vs print_3mf_bambu_network target different paths. Descriptions clarify most distinctions, but an agent still faces non-trivial misselection risk.
The set is predominantly snake_case and action-oriented, with predictable names like get_printer_status, upload_file, and set_temperature. Minor deviations such as camera_snapshot (noun phrase) and skip_objects (verb-only) exist but do not break readability.
At 45 tools, the server is heavily over-provisioned for a printer-control MCP. Many specialized and overlapping operations could be consolidated, making the surface harder to navigate than necessary.
Core lifecycle coverage exists for file management, printing, slicing, and AMS inspection, but notable gaps remain. There is no explicit filament load/unload tool despite get_printer_filaments recommending load_filaments, and calibration start is absent from x2d_native_control.
Maintenance
Related MCP Connectors
MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.
Hosted Amazon Seller and Vendor MCP server for Claude, ChatGPT, Cursor, Codex, Gemini, Copilot.
MCP server for Google Veo AI video generation
MCP server for Qwen Image 3 AI image generation
Related MCP Servers
- AlicenseNot gradedqualityFmaintenance3D Printing MCP By OctoEverywhere38Apache 2.0
- FlicenseNot gradedqualityBmaintenanceAn MCP server that enables AI assistants to control and monitor Klipper 3D printers via the Moonraker API. It supports comprehensive printer management, including G-code execution, toolchanger operations, and real-time status monitoring.25-
- AlicenseAqualityDmaintenanceEnables comprehensive control and monitoring of Bambu Lab 3D printers through Claude using local MQTT, FTPS, and X.509 authentication. Users can manage print jobs, monitor real-time status, handle filament through AMS, and adjust hardware settings like temperature and lighting.2421 npm22MIT
- AlicenseBqualityCmaintenanceA Bambu Lab-focused MCP server for controlling Bambu printers, manipulating STL files, and managing end-to-end 3MF print workflows from any MCP-compatible client.37117 npm1GPL 2.0