Skip to main content
Glama

bambu-printer-mcp

npm version License: GPL-2.0 TypeScript Node.js Version GitHub stars Downloads

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.

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.

Local handoff note: see REMOTE-DEPLOYMENT.md for the custom H2D/H2S/H2C patches, per-printer MCP split, and remote deployment plan used in this clone.


What's new in bambu-printer-mcp

This fork adds a substantial set of printer control tools beyond the upstream mcp-3D-printer-server. Everything listed below is unique to this package.

v1.1.0 — AMS auto-match, camera snapshot, pause/resume, skip objects

  • AMS auto-match by RFID (auto_match_ams on print_3mf) — resolves sliced 3MF filament requirements against live AMS inventory. Handles same-SKU different-color filaments. Dry-run with resolve_3mf_ams_slots.

  • Structured AMS inventory (get_printer_filaments) — per-tray display names, profile resolution tier (exact-model-nozzle/model/generic/unresolved), match confidence, and a summary with recommended auto-slice filament.

  • AMS settle-time retry — transparently retries when AMS data hasn't arrived on the first MQTT push from an idle printer.

  • Camera snapshot (camera_snapshot) — JPEG from the chamber camera. TCP-on-6000 for A1/P1S/P1P, RTSP via ffmpeg for X1/P2S/H2 series.

  • Pause / resume (pause_print, resume_print) — alongside the existing cancel_print.

  • Skip objects (skip_objects) — skip specific object IDs during a running multi-object print. IDs from list_3mf_plate_objects.

  • HMS diagnostics (printer://{host}/hms MCP resource) — read-only error summary with automatic settle retry.

  • Utility controlsset_print_speed (silent/standard/sport/ludicrous), clear_hms_errors, reread_ams_rfid, set_airduct_mode (cooling/heating for H2/P2).

  • H2-family-safe print path — correct project_file format with ams_mapping2 parallel array, H2 firmware quirks handled.

  • BambuStudio CLI auto-flatten (BAMBU_CLI_FLATTEN=true) — works around upstream profile inheritance bugs.

  • Print collar charm (print_collar_charm) — specialized two-color wrapper with fixed tray policy.

v1.1.1 — AMS dryer control (current)

  • AMS dryer start/stop (set_ams_drying) — sends print.ams_control MQTT command. Works on heated AMS units (AMS Pro / AMS-HT). Action: start or stop, target by AMS index 0–3.

  • Same-SKU different-color fix for auto_match_ams.

  • AMS and HMS settle-time retry for idle printers.

  • Validation script (scripts/validate-printer.mjs) for live printer testing.

Full changelog at CHANGELOG.md.

Related MCP server: Klipper MCP Server

Table of Contents


Description

bambu-printer-mcp is a Model Context Protocol server that gives Claude (or any MCP client) direct control over Bambu Lab 3D printers. The verified end-to-end path is: slice in Bambu Studio, export a .gcode.3mf, hand the path to print_3mf — the server reads the slicer's metadata out of the 3MF, builds the correct AMS mapping, uploads over FTPS, and starts the print via an MQTT project_file command. See docs/SLICING.md for the full recipe and why in-process slicing is not the recommended path.

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. Both packages share the same protocol fixes and safety features.

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.


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 (RTSP via ffmpeg). Requires ffmpeg in PATH for the RTSP path.

  • Upload and print pre-sliced .gcode.3mf files with full plate selection and calibration flag control (recommended path — see docs/SLICING.md)

  • Optional single-color auto-slice path via BambuStudio CLI. Set BAMBU_CLI_FLATTEN=true to enable a workaround that flattens BBL profile inheritance before invoking the CLI — works around upstream bugs in BambuStudio CLI mode (#9636, #9968). Single-color smoke is verified on H2S/H2D/X1C/P1S; H2C requires Bambu Studio 2.4.0 or newer and should use BAMBU_MODEL=h2c, not an H2D fallback. H2D two-color CLI slicing is blocked upstream (#10408); use a GUI-sliced .gcode.3mf for that workflow. Default off; Path A (GUI-slice) remains the recommended workflow for non-BBL profiles, multi-color H2 jobs, or first-time prints. See docs/SLICING.md.

  • 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/H2C ams_mapping2 parallel array format

  • Auto-match AMS slots by RFID (auto_match_ams flag on print_3mf). Resolves required tray_info_idx from 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 with resolve_3mf_ams_slots before printing.

  • Cancel, pause, and resume in-progress print jobs via MQTT

  • Skip specific objects during a running multi-object print via skip_objects (use list_3mf_plate_objects to 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 MQTT

  • Start/stop AMS filament drying (set_ams_drying) on heated AMS units (AMS Pro / AMS-HT). Sends print.ams_control MQTT command.

  • Set nozzle and bed temperature via G-code dispatch over MQTT

  • 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 retry

  • Start 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 parts

  • STL manipulation: scale, rotate, extend base, merge vertices, center at origin, lay flat, and inspect model info

  • Slice STL or 3MF files using BambuStudio, OrcaSlicer, PrusaSlicer, Cura, or Slic3r

  • Inspect slicer settings from a saved 3MF template or extracted profile via get_slice_settings

  • Enumerate saved slicing templates from the local registry via list_templates

  • Save templates into the local registry via save_template

  • Slice directly from a named template via slice_with_template

  • For simple single-material slices, auto-select the printer's current or first loaded AMS filament when no explicit slicer profile or load_filaments override is provided

  • Template-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


Installation

Prerequisites

  • Node.js 18 or higher

  • npm

  • BambuStudio (optional -- only needed for slicing) -- download from bambulab.com. Required by slice_stl and print_3mf auto-slice (when a 3MF has no embedded gcode). Not needed if you only print pre-sliced 3MF files. Default path: /Applications/BambuStudio.app/Contents/MacOS/BambuStudio (macOS); set SLICER_PATH if installed elsewhere.

Run without installing (npx)

The fastest way to get started. No global install required:

npx @rowbotik/bambu-printer-mcp

Set environment variables inline or via a .env file in your working directory (see Configuration).

Install globally from npm

npm install -g @rowbotik/bambu-printer-mcp

After installation, the bambu-printer-mcp command is available in your PATH.

Install from source

git clone https://github.com/rowbotik/bambu-printer-mcp.git
cd bambu-printer-mcp
npm install
npm run build
npm link

npm link makes the bambu-printer-mcp binary available globally without publishing to npm.


Configuration

Create a .env file in the directory where you run the server, or pass environment variables directly in your MCP client config. All printer connection variables can also be passed as tool arguments on a per-call basis, which is useful when working with multiple printers.

# --- Bambu printer connection (required for all printer tools) ---
PRINTER_HOST=192.168.1.100        # IP address of your Bambu printer on the local network
BAMBU_SERIAL=01P00A123456789      # Printer serial number (see Finding Your Serial Number below)
BAMBU_TOKEN=your_access_token     # LAN access token from printer touchscreen
# Compatible aliases also accepted:
# BAMBU_PRINTER_HOST / BAMBU_PRINTER_SERIAL / BAMBU_PRINTER_ACCESS_TOKEN

# --- Printer model (CRITICAL for safe operation) ---
BAMBU_MODEL=p1s                   # Your printer model: p1s, p1p, p2s, x1c, x1e, a1, a1mini, h2d, h2s, h2c
# Alias also accepted: BAMBU_PRINTER_MODEL
BED_TYPE=textured_plate           # Bed plate type: textured_plate, cool_plate, engineering_plate, hot_plate, supertack_plate
NOZZLE_DIAMETER=0.4               # Nozzle diameter in mm (default: 0.4)

# --- Slicer configuration (required for slice_stl and print_3mf auto-slice) ---
SLICER_TYPE=bambustudio           # Options: bambustudio, prusaslicer, orcaslicer, cura, slic3r
SLICER_PATH=/Applications/BambuStudio.app/Contents/MacOS/BambuStudio
                                  # Default on macOS. Adjust for your OS and install path.
# Alias also accepted: BAMBU_STUDIO_PATH
SLICER_PROFILE=                   # Optional: path to a slicer profile/config file

# --- Temporary file directory ---
TEMP_DIR=/tmp/bambu-mcp-temp      # Directory for intermediate files. Created automatically if absent.

# --- MCP transport ---
MCP_TRANSPORT=stdio               # Options: stdio (default), streamable-http

# --- Streamable HTTP transport (only used when MCP_TRANSPORT=streamable-http) ---
MCP_HTTP_HOST=127.0.0.1
MCP_HTTP_PORT=3000
MCP_HTTP_PATH=/mcp
MCP_HTTP_STATEFUL=true
MCP_HTTP_JSON_RESPONSE=true
MCP_HTTP_ALLOWED_ORIGINS=http://localhost

# --- Optional Blender MCP bridge ---
BLENDER_MCP_BRIDGE_COMMAND=       # Shell command to invoke your Blender MCP bridge executable

Environment variables reference

Variable

Default

Required

Description

PRINTER_HOST

localhost

Yes

IP address of the Bambu printer. Alias: BAMBU_PRINTER_HOST

BAMBU_SERIAL

Yes

Printer serial number. Alias: BAMBU_PRINTER_SERIAL

BAMBU_TOKEN

Yes

LAN access token. Alias: BAMBU_PRINTER_ACCESS_TOKEN

BAMBU_MODEL

Yes

Printer model: p1s, p1p, p2s, x1c, x1e, a1, a1mini, h2d, h2s, h2c. Required for safe operation -- determines the correct G-code generation. Alias: BAMBU_PRINTER_MODEL. If omitted and the MCP client supports elicitation, the server will ask you interactively. Use h2c for H2C; do not use h2d as a fallback.

BED_TYPE

textured_plate

No

Bed plate type: textured_plate, cool_plate, engineering_plate, hot_plate, supertack_plate

NOZZLE_DIAMETER

0.4

No

Nozzle diameter in mm. Used to select the correct BambuStudio machine preset.

SLICER_TYPE

bambustudio

No

Slicer to use for slicing operations

SLICER_PATH

BambuStudio macOS path

No

Full path to the slicer executable. Alias: BAMBU_STUDIO_PATH

SLICER_PROFILE

No

Path to a slicer profile or config file

TEMP_DIR

./temp

No

Directory for intermediate files

MCP_TRANSPORT

stdio

No

Transport mode: stdio or streamable-http

MCP_HTTP_HOST

127.0.0.1

No

HTTP bind address (HTTP transport only)

MCP_HTTP_PORT

3000

No

HTTP port (HTTP transport only)

MCP_HTTP_PATH

/mcp

No

HTTP endpoint path (HTTP transport only)

MCP_HTTP_STATEFUL

true

No

Enable stateful HTTP sessions

MCP_HTTP_JSON_RESPONSE

true

No

Return structured JSON alongside text responses

MCP_HTTP_ALLOWED_ORIGINS

No

Comma-separated list of allowed CORS origins

BLENDER_MCP_BRIDGE_COMMAND

No

Command to invoke Blender MCP bridge

BAMBU_CLI_FLATTEN

false

No

When true, the MCP flattens BBL profile inheritance before invoking the BambuStudio CLI. Workaround for upstream issues #9636 / #9968. BBL printers only. Single-color smoke verified on H2S/H2D/X1C/P1S; H2C requires Bambu Studio 2.4.0 or newer. H2D two-color CLI slicing remains blocked by #10408. See docs/SLICING.md.

BAMBU_PROFILES_ROOT

derived from SLICER_PATH

No

Override path to the BambuStudio Resources/profiles directory used by the CLI flattener. Useful for non-standard installs or dev environments.

SuperTack can be passed for pre-sliced print jobs, but BambuStudio CLI slicing currently fails fast for supertack_plate because the accepted CLI bed identifier is not verified. Use a pre-sliced 3MF for SuperTack until this is confirmed.


Usage

Add this server to your MCP client's config (Claude Desktop, Claude Code, Cursor, Codex CLI, or any MCP-compatible client). The config format is the same everywhere -- an mcpServers entry with the command and env vars:

{
  "mcpServers": {
    "bambu-printer": {
      "command": "npx",
      "args": ["-y", "@rowbotik/bambu-printer-mcp"],
      "env": {
        "PRINTER_HOST": "192.168.1.100",
        "BAMBU_SERIAL": "01P00A123456789",
        "BAMBU_TOKEN": "your_access_token",
        "BAMBU_MODEL": "p1s",
        "SLICER_TYPE": "bambustudio",
        "SLICER_PATH": "/Applications/BambuStudio.app/Contents/MacOS/BambuStudio"
      }
    }
  }
}

Where this config lives depends on your client:

Client

Config location

Claude Desktop (macOS)

~/Library/Application Support/Claude/claude_desktop_config.json

Claude Desktop (Windows)

%APPDATA%\Claude\claude_desktop_config.json

Claude Code (project)

.mcp.json in project root

Claude Code (global)

~/.claude/settings.json

Cursor

MCP settings in Cursor preferences

Codex CLI

MCP config per Codex docs

Restart your client after editing the config.

For any MCP server with a large tool surface, wrapping it behind codemode-mcp dramatically reduces token usage. Instead of exposing every tool definition to the model (which can consume tens of thousands of tokens per turn), codemode lets the agent write code against a two-tool interface (search() and execute()), loading only the tools it needs on demand.

Anthropic and Cloudflare independently demonstrated this pattern reduces MCP token costs by up to 98%:

This applies to all MCP servers, not just this one.


Enabling Developer Mode (Required)

This MCP server communicates directly with your printer over your local network using MQTT and FTPS. For this to work, Developer Mode must be enabled on the printer. Without it, the printer will reject third-party LAN connections even if you have the correct access code.

On H2D/H2-series firmware, the printer may stream push_status data without ever answering the legacy get_version handshake used by older libraries. This fork treats the live status stream as authoritative and does not require that extra ACK before considering the connection usable.

Developer Mode is available on the following firmware versions and later:

Series

Minimum Firmware

P1 Series (P1P, P1S)

01.08.02.00

X1 Series (X1C, X1E)

01.08.03.00

A1 Series (A1, A1 Mini)

01.05.00.00

H2D

01.01.00.01

If your firmware is older than these versions, update through Bambu Studio or the Bambu Handy app before proceeding.

Step 1: Navigate to Network Settings

On the printer's touchscreen, go to Settings, then select the Network (WLAN) page. You should see your WiFi network name, IP address, and the LAN Only Mode toggle.

Step 2: Enable LAN Only Mode

Toggle LAN Only Mode to ON. This enables direct local network communication protocols (MQTT on port 8883 and FTPS on port 990) that this server requires.

Important: Enabling LAN Only Mode disconnects the printer from Bambu Lab's cloud services. The Bambu Handy mobile app will stop working while this mode is active. Bambu Studio and OrcaSlicer can still connect over LAN.

Step 3: Enable Developer Mode

Once LAN Only Mode is on, a Developer Mode option appears in the same settings menu. Toggle it ON. This allows third-party clients (like this MCP server) to authenticate and send commands over MQTT.

Step 4: Note the Access Code

The Access Code displayed on the network settings screen is your LAN access token. You will need this value for the BAMBU_TOKEN environment variable.

The access code can be refreshed by tapping the circular arrow icon next to it. If you refresh it, any existing connections using the old code will be disconnected and you will need to update your configuration with the new code.


Finding Your Bambu Printer's Serial Number and Access Token

Two values are required to connect directly to a Bambu Lab printer over your local network: the printer's serial number and its LAN access token (the Access Code from Developer Mode setup above).

Serial number

The serial number is printed on a sticker on the back or underside of the printer. It typically follows one of these formats:

  • P1 Series: begins with 01P

  • X1 Series: begins with 01X

  • A1 Series: begins with 01A

You can also find it on the printer's touchscreen. Navigate to Settings and select the Device Info page:

The Printer line shows your serial number. In Bambu Studio, you can also find it under Device > Device Management in the printer information panel.

LAN access token

The access token is the Access Code shown on the printer's network settings screen. It is separate from your Bambu Cloud account password. If you followed the Developer Mode setup above, you already have this value.

P1 Series (P1P, P1S):

  1. On the printer touchscreen, go to Settings.

  2. Select the Network / WLAN page.

  3. The Access Code is displayed at the bottom of the screen.

X1 Series (X1C, X1E):

  1. On the printer touchscreen, go to Settings.

  2. Select Network.

  3. Enable LAN Only Mode and Developer Mode if not already on.

  4. The Access Code appears on this screen.

A1 and A1 Mini:

  1. Open the Bambu Handy app on your phone.

  2. Connect to your printer.

  3. Navigate to Settings > Network.

  4. The Access Code is shown here.

Your printer must also be logged into a Bambu Cloud account for LAN mode to function. You can verify this on the cloud/account settings screen:

Troubleshooting: If the LAN Only Mode or Developer Mode options are not visible, your printer firmware is likely outdated. Update to the latest firmware version through Bambu Studio or the Bambu Handy app and try again.


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.

The server pads this array to the 5 elements required by the printer's MQTT protocol. An ams_mapping of [0, 2] becomes [0, 2, -1, -1, -1] on the wire, where -1 indicates unused positions.

Single-material prints

For a single-material print (the most common case), the default mapping is [-1, -1, -1, -1, 0], which tells the printer to pull filament from AMS slot 0. If your filament is in a different slot, specify it:

{
  "three_mf_path": "/path/to/model.3mf",
  "ams_mapping": [2]
}

This tells the printer to use AMS slot 2 for the single filament in the print.

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
}

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:

  1. Reads the required tray_info_idx values from the 3MF's Metadata/slice_info.config and Metadata/plate_<n>.json

  2. Reads your live AMS trays from the printer's MQTT status push

  3. 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 slots

  4. Tracks already-claimed slots so two requirements can't collapse onto the same physical position

  5. 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 loaded

  • color_mismatch — the SKU matches but the loaded color differs

  • exhausted — all matching trays are already claimed by other requirements

  • no_sku — the 3MF doesn't declare a tray_info_idx for 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. The broker requires your serial number as the client ID and your access token as the password. 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

Both this package and the parent project (mcp-3D-printer-server) include fixes for 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.

According to the OpenBambuAPI spec, P1/A1/X1-series printers use a 5-element 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:

// P1/A1/X1-series: 5-element project lookup table
ams_mapping = [0, -1, -1, -1, -1];

// H2S/H2D/H2C: 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 running current (post-Jan 2025) firmware in LAN-only mode. 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> and bambu-cli files upload both fail with 522 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-upload still opens an FTPS session (to stat the remote file) and hits the same 522.

What works — two-step upload + MQTT dispatch:

  1. Upload the .gcode.3mf via 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.

  2. Send the project_file command over MQTT to device/<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:

  • url must be ftp:///<filename> (three slashes) — the empty host component is required; the printer rejects ftp://<filename> as "unsupported print file path or name".

  • param uses the internal plate path inside the 3MF (Metadata/plate_1.gcode for plate 1), not a filesystem path.

  • md5: "" is accepted; populating it is optional.

  • On AMS-equipped H2 printers, use_ams: false does not suppress mapping lookup if the sliced file declares filaments. The working H2 path is to send use_ams: true plus a valid mapping. For H2, the mapping length must match the project-level filament declaration length, and the populated positions must match plate_<n>.json.filament_ids. Prefer ams_slots at 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 explicit ams_slots, raw ams_mapping, or auto_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 ftpUpload helper (basic-ftp with secure: "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_slots

  • trays[].display_name, trays[].tray_color, trays[].remain_percent

  • trays[].resolved_profile_path

  • trays[].profile_resolution: exact-model-nozzle, model, generic, or unresolved

  • trays[].match_confidence: high, medium, low, or none

  • recommended.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.

{
  "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 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's video.md but 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 the target temperature for the bed or nozzle. Dispatches an M140 (bed) or M104 (nozzle) G-code command via MQTT. Valid range is 0 to 300 degrees Celsius. Accepted values for component are bed, nozzle, extruder, tool, and tool0.

{
  "component": "nozzle",
  "temperature": 220,
  "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 Bambu Studio — see docs/SLICING.md. This tool handles the complete workflow:

  1. Checks whether the 3MF contains embedded G-code (Metadata/plate_<n>.gcode entries).

  2. If no G-code is found, attempts to auto-slice via the configured slicer. This fallback is unreliable in practice (stale profiles, leftover multi-filament declarations) — prefer pre-slicing in Bambu Studio.

  3. Parses the sliced 3MF to extract the correct plate file and compute its MD5 hash.

  4. Also parses Metadata/project_settings.config to read AMS mapping embedded by Bambu Studio.

  5. Uploads the 3MF to the printer's cache/ directory via FTPS using basic-ftp directly (avoiding the bambu-js double-path bug).

  6. Sends the correct MQTT print command for the target printer family. For H2S/H2D/H2C that means project_file with project-length ams_mapping, parallel ams_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 -- it ensures the slicer generates G-code for the correct printer. Using the wrong model can cause the bed to crash into the nozzle. 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. 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.

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:

  1. Resolve a local .3mf or template_name.

  2. Auto-slice if the 3MF is still an unsliced project.

  3. Inspect Metadata/plate_1.json to identify the smaller inner part and larger outer part.

  4. Preflight the required AMS trays on the printer.

  5. Dispatch the print through the existing H2-safe print3mf path using ams_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 generation

  • the 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.3mf to print_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 docs/SLICING.md.

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 and OrcaSlicer) or a G-code file (for PrusaSlicer, Cura, Slic3r).

{
  "stl_path": "/path/to/model.stl",
  "slicer_type": "bambustudio",
  "slicer_path": "/Applications/BambuStudio.app/Contents/MacOS/BambuStudio",
  "slicer_profile": "/path/to/profile.ini"
}

slicer_type options: bambustudio, orcaslicer, prusaslicer, cura, slic3r. When omitted, the value from the SLICER_TYPE environment variable is used (default: bambustudio).

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: slice with bambustudio to get a sliced 3MF, 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

uptodate

boolean

Update 3MF configs to latest BambuStudio presets

repetitions

number

Number of copies to print

orient

boolean

Auto-orient model for optimal printability

arrange

boolean

Auto-arrange objects on the build plate

ensure_on_bed

boolean

Lift floating models onto the bed

clone_objects

string

Clone counts per object, comma-separated (e.g. "1,3,1,10")

skip_objects

string

Object indices to skip, comma-separated (e.g. "3,5,10")

load_filaments

string

Filament profile paths, semicolon-separated

load_filament_ids

string

Filament-to-object mapping, comma-separated

enable_timelapse

boolean

Enable timelapse-aware slicing

allow_mix_temp

boolean

Allow mixed-temperature filaments on one plate

scale

number

Uniform scale factor

rotate

number

Z-axis rotation in degrees

rotate_x

number

X-axis rotation in degrees

rotate_y

number

Y-axis rotation in degrees

min_save

boolean

Produce smaller output 3MF (faster uploads)

skip_modified_gcodes

boolean

Ignore stale custom gcodes in the 3MF

slice_plate

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 3MFs

  • ensure_on_bed: true -- safety net, lifts floating models onto the bed

  • min_save: true -- smaller output for faster FTP uploads to the printer

  • skip_modified_gcodes: true -- strips custom gcodes from other users' profiles

These defaults keep you safe when printing downloaded models. When calling slice_stl directly, you have full control over every flag.

Advanced Tools

blender_mcp_edit_model

Send a set of named edit operations (remesh, boolean, decimate, etc.) to a Blender MCP bridge command for advanced mesh work that goes beyond what the built-in STL tools support.

When execute is false (the default), the tool returns the payload that would be sent without running anything -- useful for previewing what would be dispatched.

When execute is true, the server invokes the configured bridge command with the payload as a JSON-encoded environment variable (MCP_BLENDER_PAYLOAD). Configure it with BLENDER_MCP_BRIDGE_COMMAND; per-call bridge_command overrides require MCP_ALLOW_EXECUTABLE_ARG=1.

{
  "stl_path": "/path/to/model.stl",
  "operations": ["remesh", "decimate:0.5", "boolean_union:/path/to/other.stl"],
  "execute": false
}
{
  "stl_path": "/path/to/model.stl",
  "operations": ["remesh"],
  "bridge_command": "/usr/local/bin/blender-mcp-bridge",
  "execute": true
}

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 calling get_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 calling list_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.


Example Commands for Claude

After connecting the MCP server in Claude Desktop or Claude Code, you can ask Claude to perform these operations directly in conversation.

Printer status and control

  • "What is the current status of my Bambu printer?"

  • "What temperature is the bed at right now?"

  • "Show me the files on my printer's SD card."

  • "Cancel the current print job."

  • "Set the nozzle temperature to 220 degrees."

  • "Set the bed to 65 degrees."

  • "Turn the chamber light on."

  • "Set the chamber fan to 40 percent."

  • "List the object IDs in this sliced 3MF."

  • "Skip object 6495 on the current print."

  • "Start the AMS drying cycle on AMS 0."

  • "Stop drying on AMS 1."

  • "Match the AMS slots for this 3MF against my loaded filaments without printing."

  • "Auto-match AMS slots and print this 3MF."

  • "Take a camera snapshot of the print bed."

  • "Show me the HMS error codes on the printer."

  • "What speed mode is the printer in?"

  • "Set the airduct to cooling mode."

Printing 3MF files

  • "Print the file at ~/Downloads/bracket.3mf on my Bambu printer."

  • "Upload bracket.3mf to the printer and start printing with AMS slots 0 and 1."

  • "Print my_model.3mf with bed leveling enabled and vibration calibration off."

  • "Upload this 3MF without printing it yet."

  • "Slice model.stl with BambuStudio and then print the result."

STL manipulation

  • "What are the dimensions of this STL file?"

  • "Scale model.stl to twice its current size."

  • "Scale this model so it is 150% as wide but stays the same height."

  • "Rotate this STL 90 degrees around the Z axis."

  • "Extend the base of this model by 3mm so it sticks to the bed better."

  • "Center this model at the origin."

  • "Orient this model so its largest flat face is on the bottom."

  • "Merge any near-duplicate vertices in this STL to clean it up."

Combined workflows

  • "Rotate model.stl 45 degrees around Z, extend the base by 2mm, then print it on my Bambu P1S."

  • "Take this unsliced 3MF, slice it with BambuStudio, and print the result."

  • "Scale this part to 80% of its size, lay it flat, and start a print."


Bambu Lab Printer Limitations

Understanding these constraints will help you avoid frustrating errors and set appropriate expectations.

  1. Printable 3MF required for print_3mf. The print_3mf tool expects a sliced 3MF containing at least one Metadata/plate_<n>.gcode entry. If you pass an unsliced 3MF (one exported from a CAD tool without slicing), the server will attempt to auto-slice it using the configured slicer — but this fallback is brittle and the recommended workflow is to pre-slice in Bambu Studio and pass the resulting .gcode.3mf. See docs/SLICING.md for the full procedure.

  2. Layer height, temperature, and slicer settings are baked in. The project_file MQTT 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.

  3. G-code and 3MF jobs use different command paths. start_print_job sends a GCodeFileCommand over MQTT and is intended only for plain G-code files stored in the cache/ directory. .3mf files must go through print_3mf, which sends the project_file command with plate selection, MD5 verification, and AMS mapping. Mixing these up will result in the printer either ignoring the command or displaying an error.

  4. Temperature commands depend on printer state. set_temperature dispatches 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.

  5. Real-time status has latency. get_printer_status sends a push_all MQTT request and waits up to 1.5 seconds for a response before reading cached state. If the printer is not responding quickly (busy, sleeping, or transitioning states), you may see slightly stale data. There is no persistent event subscription in this server -- each status call is a fresh request.

  6. LAN mode required. All operations require the printer to be on the same local network as the machine running this server. Cloud-only or remote access setups are not supported. If your printer is connected only via Bambu Cloud and LAN mode is disabled, connection will fail.

  7. Self-signed TLS certificate. The printer's FTPS server uses a self-signed certificate. The basic-ftp client is configured with rejectUnauthorized: false to 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_DIR to a fast local path and avoid processing multiple large files concurrently.

STL manipulation limitations

  • lay_flat identifies 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_base adds 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_vertices uses 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_stl call 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 + serial key. 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

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

41 tools
bambu_network_bridge_statusC

Inspect or probe the FULU OrcaSlicer-bambulab BambuNetwork bridge runtime used for cloud and restored BambuNetwork printing.

ParametersJSON Schema
NameRequiredDescriptionDefault
connectNoWhen true, start the bridge command and run a handshake plus agent initialization probe.
bridge_commandNoOverride command for the FULU bridge host or macOS/WSL wrapper; defaults to BAMBU_NETWORK_BRIDGE_COMMAND.
bambu_network_config_dirNoConfig/log directory used by the BambuNetwork agent; defaults to BAMBU_NETWORK_CONFIG_DIR or a user config directory.
country_codeNoBambuNetwork country code, such as US, used by the agent during startup.
user_infoNoOptional BambuNetwork user_info JSON string to pass to net.change_user after the agent starts.
timeout_msNoBridge request timeout in milliseconds for the connect probe.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description must disclose behavioral traits. It only says 'inspect or probe' without indicating side effects, authentication needs, rate limits, or what happens during probing (e.g., network calls, state changes). The connect parameter description hints at starting a bridge command, but the tool description itself lacks these details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence, front-loading the purpose. It is appropriately short for a straightforward inspection tool, though additional context could fit without losing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 optional parameters and no output schema, the description should explain what agents can expect (e.g., return value, behavior when connect is false). It does not mention that the tool may start a bridge or what probing entails, leaving significant gaps for such a complex runtime inspection tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 does not add parameter information beyond the schema, but the schema itself provides adequate descriptions for all 6 parameters. No added value from the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'inspect or probe' and the resource 'BambuNetwork bridge runtime', and provides context about the FULU OrcaSlicer-bambulab platform. It distinguishes from the sibling 'bambu_network_call' by focusing on bridge status rather than making network calls.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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. The description does not mention prerequisites, scenarios that warrant probing, or how it relates to other tools like 'bambu_network_call' or printing tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bambu_network_callB

Call a raw FULU OrcaSlicer-bambulab BambuNetwork bridge method, optionally with an initialized network agent injected into the payload.

ParametersJSON Schema
NameRequiredDescriptionDefault
methodYesFULU bridge method name, for example bridge.handshake, net.is_user_login, or net.get_user_selected_machine.
payloadNoJSON payload passed to the bridge method.
with_agentNoWhen true, initialize a BambuNetwork agent and add its agent id to the payload before calling the method.
bridge_commandNoOverride command for the FULU bridge host or macOS/WSL wrapper; defaults to BAMBU_NETWORK_BRIDGE_COMMAND.
bambu_network_config_dirNoConfig/log directory used by the BambuNetwork agent; defaults to BAMBU_NETWORK_CONFIG_DIR or a user config directory.
country_codeNoBambuNetwork country code, such as US, used by the agent during startup.
user_infoNoOptional BambuNetwork user_info JSON string to pass to net.change_user after the agent starts.
timeout_msNoBridge request timeout in milliseconds.

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden but only hints at behavior (call method, agent injection). It does not disclose error handling, side effects, or expected outcomes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single sentence is front-loaded with the action and contains no fluff. However, it could be slightly more structured for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (8 params, no output schema, no annotations), the description is too brief. It omits return value details, error conditions, and usage context, leaving significant gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters with descriptions. The description adds context about 'raw bridge method' but does not substantially enhance understanding of individual parameters beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it calls a raw FULU bridge method, with an option to inject a network agent. It uses a specific verb and resource, and distinguishes from siblings like bambu_network_bridge_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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. While it mentions optional agent injection, it does not specify prerequisites or common use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

blender_mcp_edit_modelC

Send STL-edit instructions to a Blender MCP bridge command for advanced model edits

ParametersJSON Schema
NameRequiredDescriptionDefault
stl_pathYesPath to the local STL file
operationsYesOrdered edit operations for Blender (e.g. remesh, boolean, decimate)
bridge_commandNoOverride command for invoking Blender MCP bridge
executeNoExecute bridge command (true) or return payload only (false)

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. The description only says 'send instructions' without disclosing side effects, environment requirements, or execution behavior. Lacks transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence is concise and contains essential information. No wasted words, but could be slightly more informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Missing output schema and annotations. Description does not explain return values, error conditions, or format of operations array. Insufficient for a 4-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% coverage with clear descriptions for all 4 parameters. The description does not add extra meaning beyond the schema, but baseline 3 is acceptable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool sends STL-edit instructions to a Blender MCP bridge for advanced edits. While it distinguishes from basic edit tools like rotate_stl, it doesn't fully differentiate from other bridge tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives like center_model or lay_flat. No prerequisites or exclusions mentioned.

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 use RTSP via ffmpeg. Returns JPEG as base64; pass save_path to also write the bytes to disk.

ParametersJSON Schema
NameRequiredDescriptionDefault
save_pathNoOptional absolute path to write the JPEG to disk. If omitted, only the base64 payload is returned.
timeout_msNoMax ms to wait for a full frame (default 8000). Camera may take a few seconds on cold start.
bambu_modelNoPrinter model. Used to route to the correct protocol or fail fast on unsupported models. Defaults to BAMBU_MODEL.
experimentalNoDeprecated 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.
ffmpeg_pathNoOverride 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).
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations to rely on, the description thoroughly discloses behavioral traits: the protocol differences (TCP vs RTSP), the default timeout of 8000ms, the cold start delay, and the deprecated/ignored experimental flag. This gives agents a complete understanding of what to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences that front-load the purpose and key behaviors. Every word adds value, with no filler or redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple protocols, optional parameters) and rich schema descriptions, the description covers all essential aspects: what it does, protocol selection, output format, and key parameter behaviors like timeout. No output schema exists, but the return format is specified, so agents have sufficient context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 each parameter. The description adds some context (e.g., protocol routing, timeout default) but does not significantly enhance meaning beyond the schema definitions. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool captures a single JPEG frame from the printer's chamber camera, specifies the return format (base64), and differentiates between protocols for different printer models. This provides a specific verb and resource, making the tool's purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool (to capture camera frames) and distinguishes protocol usage by model. It does not explicitly state when not to use it or provide alternatives, but among sibling tools there is no direct competitor, so the guidance is sufficient.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of disclosing behavioral traits. It only states the action but does not mention irreversibility, side effects, required permissions, or resulting printer state. This is a significant gap for a destructive operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, clear sentence with no extraneous information. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple cancellation action, the minimal description covers the basic purpose. However, it lacks information about return values or confirmation, and with no output schema, the agent has no idea what to expect after invocation. Adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with full descriptions for all three parameters (host, bambu_serial, bambu_token). The description adds no additional meaning beyond the schema, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies a clear action 'Cancel' on a specific resource 'current print job on the Bambu Lab printer'. It effectively distinguishes from sibling tools like pause_print, resume_print, and start_print.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives (e.g., pause_print for temporary stop). The description implies usage but lacks explicit 'when to use' or 'when not to use' context.

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
stl_pathYesPath to the STL file

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description does not specify whether the STL file is modified in place or a new file is created, nor any side effects. With no annotations, the agent lacks critical behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, no wasted words, front-loaded with action and result.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 1-parameter tool with no output schema, the description omits whether the file is overwritten or returned, leaving the agent uncertain about the tool's side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% coverage of the single parameter 'stl_path'. The description adds no additional meaning beyond what the schema offers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (translate model) and outcome (geometric center at origin), distinguishing it 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.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives (e.g., before printing, after scaling). No prerequisites or exclusions mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_hms_errorsA

Clear HMS or print error state on the Bambu Lab printer using the clean_print_error MQTT command.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, and the description only mentions the MQTT command used, lacking disclosure of behavioral traits such as destructiveness, permissions needed, or effects when no errors exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with action and resource, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Description is minimal but adequate for a simple tool with fully documented parameters; however, it lacks behavioral details and usage context given no annotations or output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and already describes the three parameters (host, bambu_serial, bambu_token); the description adds no extra meaning, meeting the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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' using a specific MQTT command, distinguishing it from sibling tools like cancel_print or pause_print.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states what the tool does but provides no explicit guidance on when to use it versus alternatives, nor any context about prerequisites 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
filenameYesFile to delete. Bare names default to cache/<name>; pass a relative path like timelapse/foo.mp4 to target other allowed directories.
confirmNoMust be true to actually delete. When false or omitted the call returns without sending an FTP request.
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears full responsibility. It discloses destructive behavior, the confirm safety mechanism, and directory/path traversal restrictions. It does not detail irreversibility or post-deletion state, which would be ideal, but it is sufficiently transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long, front-loaded with the core action, and contains no superfluous information. Every sentence adds essential guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a delete tool with no output schema, the description covers the key behavioral aspects (destructive, require confirm, directory restrictions) well. It lacks some details like error handling or success confirmation, but is sufficiently complete for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the description adds value beyond the schema: it explains the default directory resolution for bare filenames and the allowed directories, and clarifies the confirm parameter's role. This enriches the schema's basic parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool deletes a file from the printer's SD card via FTPS, specifying allowed directories and path traversal rejection. This distinguishes it from sibling tools like list_printer_files 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly notes that the operation is destructive and requires confirm:true, guiding the agent to set that parameter. However, it does not compare with alternatives or explicitly state when not to use this tool, though context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extend_stl_baseB

Extend the base of an STL file by a specified amount

ParametersJSON Schema
NameRequiredDescriptionDefault
stl_pathYesPath to the STL file to modify
extension_heightYesHeight in mm to extend the base by

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must disclose side effects. It does not specify whether the file is modified in-place, if a new file is created, or error conditions like invalid geometry or non-positive extension_height.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with no extraneous words. Efficient but could benefit from additional context without being verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a simple tool with two straightforward parameters. However, missing behavioral details (e.g., output, side effects) and error handling reduces completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers both parameters with descriptions. Description adds no further semantic value beyond what is already in the schema (units, constraints). Minor: does not clarify that extension_height must be positive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verb 'extend' with clear resource 'base of an STL file' and states the parameter 'by a specified amount'. It clearly 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.

Usage Guidelines2/5

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. Lacks mention of prerequisites (e.g., file must exist, valid STL) 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.

get_printer_filamentsB

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNoHostname or IP address of the printer (default: value from env)
bambu_serialNoSerial number for the Bambu Lab printer (default: value from env)
bambu_tokenNoAccess token for the Bambu Lab printer (default: value from env)
bambu_modelNoOptional model hint used to resolve Bambu/Orca filament profile JSONs for each tray.
nozzle_diameterNoOptional nozzle diameter used when resolving model-specific filament profile JSONs (default: 0.4).

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It mentions 'live... over MQTT' and lists outputs but does not explicitly state read-only nature, authentication needs, or error behaviors. It is adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence efficiently covers purpose, method, and key outputs with no wasted words. Front-loaded with the main verb and resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description lists the main return elements. It is fairly complete for a simple getter tool, though it could mention response format or limitations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 context linking bambu_model to 'recommended load_filaments', providing extra value beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (Get live inventory), the resource (AMS/external filament inventory from printer), and method (over MQTT). It lists specific included data but does not explicitly differentiate from sibling tools like 'reread_ams_rfid'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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. The only hint is 'when the printer model is known' for recommended load_filaments, but no context for when not to use or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_printer_statusB

Get the current status of the Bambu Lab printer

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNoHostname or IP address of the printer (default: value from env)
bambu_serialNoSerial number for the Bambu Lab printer (default: value from env)
bambu_tokenNoAccess token for the Bambu Lab printer (default: value from env)

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully disclose behavioral traits. It only says 'Get the current status' without mentioning what fields are returned, authentication needs, or polling behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that efficiently conveys the tool's purpose with no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description should explain what 'current status' includes, but it does not. The tool is simple, but the description lacks sufficient detail for complete understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so each parameter is already described in the input schema. The description adds no additional meaning beyond what the schema provides, meeting the baseline but not exceeding it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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'), distinguishing it from sibling tools like `cancel_print` or `pause_print`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit guidance on when to use this tool versus alternatives. While the purpose is clear, there is no mention of prerequisites or exclusions, which is adequate for a simple status check but not exemplary.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
source_pathNoPath to a 3MF template, extracted project_settings.config, or slicer profile JSON.
template_nameNoOptional named template from the local registry. If provided, resolves source_path automatically.
template_dirNoOptional template directory override when resolving template_name.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden of behavioral disclosure. It correctly states that no slicing occurs, implying a read-only operation. However, it does not discuss file access requirements, potential errors, or the format of returned settings.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-formed sentence that delivers the core purpose without extraneous detail. Every part contributes to understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the moderate complexity (3 parameters, no output schema), the description is largely adequate but lacks information about what the returned settings look like. Users may need to know the structure or format of the output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All parameters have descriptions in the input schema (100% coverage), so the description adds no new meaning. The description merely restates the schema's explanation of template_name resolving source_path.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('inspect'), the resource ('slicer settings from a saved 3MF template or JSON/config profile'), and explicitly distinguishes it from slicing operations by noting 'without slicing anything'. This differentiates it from sibling tools like slice_stl 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool should be used when the goal is to inspect settings without slicing, but it does not explicitly mention when not to use it or provide alternatives. For instance, it could note that slice_with_template is appropriate when slicing is also desired.

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
stl_pathYesPath to the STL file to analyze

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must bear the burden. It mentions the output types (bounding box, face count, dimensions) but does not confirm the tool is read-only or discuss side effects, file existence requirements, or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence that efficiently communicates the tool's purpose and primary outputs. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The input is simple, but there is no output schema, so the description should elaborate on the return format or data structure. It lists three elements but does not detail their structure or types. Somewhat complete for a simple info tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'stl_path' is fully described in the input schema ('Path to the STL file to analyze'), so schema coverage is 100%. The description's mention of 'detailed information' adds context but does not augment parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves 'detailed information' about an STL file and lists specific properties (bounding box, face count, dimensions). It distinguishes well from sibling tools focused on editing, printing, or slicing STL files.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when you need to inspect an STL file before editing or printing, but does not explicitly state when not to use it or mention alternatives. Given the context of siblings, usage is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lay_flatB

Rotate the model so its largest flat face lies on the XY plane (Z=0)

ParametersJSON Schema
NameRequiredDescriptionDefault
stl_pathYesPath to the STL file

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description only states the action. It does not disclose whether the file is modified in place, what happens to the original orientation, or any side effects. The behavioral impact is under-specified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, clear sentence with no wasted words. Perfectly concise for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no output schema, the description covers the core purpose. However, it lacks details on whether the file is overwritten or a new file is created, and any required file format validity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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', and the description adds no additional meaning beyond the schema itself. Baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 specific outcome ('largest flat face lies on XY plane'), making it distinct from siblings like 'rotate_stl' which suggests arbitrary rotation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 'rotate_stl' or 'center_model'. The description does not mention prerequisites or context.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
three_mf_pathYesPath to a sliced 3MF/.gcode.3mf file
plate_indexNo0-based plate index to inspect (default: 0)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must cover behavioral traits. It indicates a read-only operation (list) but does not elaborate on side effects, permissions, or limitations. The simplicity of the tool partially mitigates this gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences with no fluff. The purpose is front-loaded, and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no output schema, no nested objects), the description provides enough context: what the tool does, how to use the results, and the parameters. It could briefly mention the output format, but not essential.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes both parameters with full coverage. The description adds context about the file being 'sliced' and the use with skip_objects, but does not significantly enhance the parameter meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists object IDs from a sliced 3MF plate and explicitly ties it to use with skip_objects, making the purpose and context very clear. It distinguishes itself from siblings like skip_objects by specifying its output.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides direct guidance on when to use this tool: to get object IDs for skip_objects during a running print. While it doesn't discuss alternatives or when not to use it, 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.

list_printer_filesC

List files stored on the Bambu Lab printer

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description does not disclose behavioral traits beyond listing files. It omits details like whether it requires authentication (though params hint at it), if it's a read-only operation, or any side effects. With no annotations, this lack of transparency 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, very concise and front-loaded. It contains no fluff, but it could be slightly more informative without becoming verbose, e.g., by specifying file types.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

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 annotations, the description should provide more context about the return format, file types, or prerequisites. It only states the basic purpose, leaving agents uninformed about what to expect or how to interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% parameter description coverage, so the schema already explains host, serial, and token. The description adds no additional meaning beyond what the schema provides, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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 'files stored on the Bambu Lab printer', distinguishing it from siblings like delete_printer_file and upload_file. However, it does not specify file types or scope, which would make it a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 alternatives such as get_printer_status or delete_printer_file. The description offers no context for usage, making it difficult for an agent to decide when to invoke this tool.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
template_dirNoOptional template directory override. Defaults to BAMBU_TEMPLATE_DIR or the server's configured local template registry.

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Only states 'list... templates', with no disclosure of side effects, permissions, or limitations. Read-only nature is implied but not explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, no redundant information. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one optional parameter and no output schema, the description is adequate but lacks details like return format or behavior if directory is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema provides full description of the single optional parameter (template_dir). Description adds no extra 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.

Purpose5/5

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 directory. Verb 'list' and resource 'saved slicing templates' are explicit, and it distinguishes itself from sibling tools like save_template 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.

Usage Guidelines2/5

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 list_printer_files or when not to use it. No mention of context or prerequisites.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
stl_pathYesPath to the STL file
toleranceNoMax distance to merge (mm, default: 0.01)

TDQS

B3.2/5.0
Behavior2/5

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, saved to a new location, or what permissions are needed. For a mutation 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, front-loaded with the action, and contains no unnecessary words. It is highly concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool modifies a file, but the description does not explain the outcome (e.g., whether the original file is overwritten, a new file is created, or what is returned). Without an output schema, this omission leaves ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds no extra meaning beyond the parameter descriptions in the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('merge vertices'), the resource ('in an STL file'), and the condition ('closer than the specified tolerance'). It effectively distinguishes from sibling tools which focus on printing, slicing, or other operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 like rotate_stl or scale_stl. The description only states what it does, not the context or prerequisites.

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses the key behavioral trait 'resumable via resume_print', but lacks detail on side effects (e.g., print head movement, bed temperature).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence that is front-loaded with the action and includes essential context (resumability). No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple pause action, the description covers the core purpose and resumability, but does not mention prerequisites (e.g., an active print job) or error states. Adequate but not thorough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter has a description. The tool description does not add meaning beyond the schema, so baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action 'Pause the current print job' with a specific resource ('Bambu Lab printer') and distinguishes from siblings like cancel_print and resume_print by noting resumability.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (pause a running print) and mentions the alternative resume_print for resuming, but does not explicitly state when not to use it (e.g., use cancel_print for permanent stop).

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. This can move AMS filament; use only when the printer is idle and unloaded.

ParametersJSON Schema
NameRequiredDescriptionDefault
ams_idYesAMS unit index from 0 to 3
slot_idYesSlot index within that AMS, from 0 to 3
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses side effect: 'can move AMS filament.' With no annotations, the description carries full burden; it reveals the action is mutating but omits details like authentication needs or expected response.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. Purpose stated first, then critical usage condition. Every word serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers core action and safety condition, but lacks detail on what happens after triggering (e.g., response time, error states). For a 5-param tool with no output schema, more context on outcomes would be helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% description coverage for all 5 parameters. The description adds no extra parameter-level meaning beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Trigger a Bambu AMS RFID re-read') and resource ('one AMS slot'). It distinguishes from sibling tools like set_ams_drying by specifying the exact operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'only when the printer is idle and unloaded.' No mention of when not to use or alternatives, but context is clear.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
three_mf_pathYesPath to a sliced 3MF/.gcode.3mf file
plate_indexNo0-based plate index to inspect (default: 0)
bambu_modelNoOptional model hint used to resolve Bambu/Orca filament profile JSONs for each tray.
nozzle_diameterNoNozzle diameter in mm (default: 0.4)
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It states it inspects and matches, with no upload or print start, but does not disclose if it modifies anything, requires read-only access, or details behavior on mismatch.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, concise, front-loaded with verb 'Inspect'. Every sentence adds value with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

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 does not mention return values, error conditions, or response format. For a tool with 7 parameters, it is adequate but could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 context by linking purpose to filament matching, but does not elaborate on parameter relationships or usage specifics beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it inspects a 3MF file and matches filament requirements against AMS inventory. Explicitly distinguishes from print tools by stating 'Does not upload or start a print.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage for inspection only by stating it does not upload or start a print, but lacks explicit guidance on when to use vs alternatives (e.g., print_3mf, reread_ams_rfid).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resume_printA

Resume a paused print job on the Bambu Lab printer

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It does not disclose behavioral traits such as error conditions if the print is not paused, or any side effects. This is insufficient for a tool that likely has specific state requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no extraneous words, efficiently conveying the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple resume action with no output schema, the description is minimally adequate. However, it could be more complete by noting that the print must be in a paused state, which is essential context not provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage for its 3 parameters, so the schema already provides meaning. The description adds no additional parameter information beyond the schema, meeting the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (resume) and the resource (paused print job on Bambu Lab printer), and it distinguishes from siblings like 'pause_print' and 'cancel_print'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (when a print is paused) but does not provide explicit guidance on when not to use, prerequisites, or alternatives, which are present as sibling tools.

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
stl_pathYesPath to the STL file to rotate
angle_xNoRotation angle for X axis in degrees (default: 0)
angle_yNoRotation angle for Y axis in degrees (default: 0)
angle_zNoRotation angle for Z axis in degrees (default: 0)

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided and description does not disclose whether file is modified in-place, if rotation is cumulative, or any side effects. Minimal behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single concise sentence with no fluff, but could benefit from more detail without being verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema or return value described. Lacks context about scope of rotation, coordinate system, or relationship to other STL manipulation tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already describes all parameters clearly (100% coverage). Description adds no extra meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states verb 'Rotate', resource 'STL file', and how 'specified angles (degrees)'. Distinguishes from siblings like scale_stl and center_model.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 lay_flat or manual rotation. No prerequisites or exclusions.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
source_pathYesPath to a local .3mf, .json, or .config file to save into the template registry.
template_nameNoOptional template name. Defaults to the source filename without extension.
template_dirNoOptional template directory override. Defaults to BAMBU_TEMPLATE_DIR or the server's configured local template registry.

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It describes the copy and register action but does not disclose overwrite behavior, validation, error handling, or permissions required. The description is minimal on behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one sentence, front-loaded with the action, and contains no fluff. It is efficiently written.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description lacks details on return values, error cases, side effects (e.g., overwriting existing templates), and the registration process. For a write operation with 3 parameters, it is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The tool description restates the schema's intent (copying files) without adding new meaning to parameters. No additional semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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') and the resource ('file into local template registry'), with specific file types (3MF, JSON, config). It distinguishes from sibling tools like list_templates or slice_with_template by specifying a write operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit guidance on when to use this tool versus alternatives such as upload_file or slice_with_template. It does not mention prerequisites or context for invoking the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scale_stlC

Scale an STL file by specified factors

ParametersJSON Schema
NameRequiredDescriptionDefault
stl_pathYesPath to the STL file to scale
scale_xNoScale factor for X axis (default: 1.0)
scale_yNoScale factor for Y axis (default: 1.0)
scale_zNoScale factor for Z axis (default: 1.0)

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description bears full responsibility for disclosing behavioral traits. It fails to indicate whether scaling modifies the file in place or creates a new copy, whether scaling is reversible, or what the return value is. The sparse description lacks essential transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, which is concise, but it is too brief for the complexity of the tool (4 parameters). It conveys the core action but could include more details without much length increase. Adequate but not superb.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema and annotations, the description should provide additional context about tool behavior, prerequisites, and effects. It does not cover scaling semantics, file handling, or expected output, leaving significant gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage for its 4 parameters (stl_path, scale_x, scale_y, scale_z), so the schema already explains the parameters. The description adds no extra meaning beyond what is in the schema, earning a baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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 action (scale) and the resource (STL file), making the purpose straightforward. However, it does not distinguish this tool from similar siblings like rotate_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.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no context on when to use scale_stl versus alternatives (e.g., rotate_stl, lay_flat), nor does it mention prerequisites or edge cases. There is no guidance on appropriate usage or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_airduct_modeB

Set H2/P2 airduct mode to cooling or heating.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesAirduct mode to apply
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It only states the action without mentioning side effects, permissions, or state requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with no wasted words. Front-loaded with the core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with high schema coverage, the description is adequate but lacks context about what H2/P2 refers to or any state prerequisites. No output schema, but not necessary for a setter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% description coverage, so the baseline is 3. The description adds no additional meaning beyond what the schema already provides for the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool sets the H2/P2 airduct mode to cooling or heating, using specific verb and resource. However, it does not distinguish from siblings, though no sibling directly relates to airduct mode.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance provided on when to use this tool versus alternatives. The description lacks any context about prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_ams_dryingA

Start or stop the AMS filament drying cycle. Available on AMS units with heating capability (AMS Pro / AMS-HT). Sends an ams_control MQTT command to the printer.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhether to start or stop the drying cycle
ams_idYesAMS unit index from 0 to 3
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It reveals the underlying mechanism (sends MQTT command) but does not disclose side effects, safety, or whether the call is idempotent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise with two front-loaded sentences, every word earning its place. No extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple toggle tool with 5 parameters, the description adequately covers the core function, hardware compatibility, and mechanism. It could mention response behavior or prerequisites, but given the context of printer control tools, it is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with good parameter descriptions. The description does not add meaning beyond what the schema already provides, but since coverage is high, a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb (start/stop) and resource (AMS filament drying cycle), with explicit hardware prerequisites (AMS Pro/AMS-HT), making the tool's purpose immediately distinct from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description specifies that the tool is only available on AMS units with heating capability, which guides when to use it. However, it does not mention when not to use or provide alternative tools for non-heating AMS.

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 using the printer's MQTT fan command

ParametersJSON Schema
NameRequiredDescriptionDefault
fanYesFan to control: part, auxiliary, chamber, 1, 2, or 3
speedYesFan speed percentage from 0 to 100
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, placing full burden on description. It states the action but does not disclose side effects (e.g., immediate change, delay), error handling for out-of-range speeds, or network dependencies. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, 14 words, front-loaded with the verb and direct object. No wordiness or extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having 5 parameters and no output schema or annotations, the description does not cover return values, validation behavior, or operational context. It leaves gaps for an agent to understand full usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 additional meaning beyond the schema's parameter descriptions; it only restates the overall purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Set' and clearly identifies the resource 'Bambu printer fan speed percentage' and method 'MQTT fan command'. This distinguishes it from sibling tools like set_temperature, set_light, 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.

Usage Guidelines2/5

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 set_temperature or any prerequisites. The description lacks context for appropriate invocation, such as confirming the printer is online or MQTT is configured.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_lightB

Set a Bambu printer light node mode using the printer's MQTT LED command

ParametersJSON Schema
NameRequiredDescriptionDefault
lightYesLight node to control, for example chamber_light
modeYesLight mode to apply
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for disclosing behavioral traits. It only mentions 'using the printer's MQTT LED command' which hints at the mechanism but does not state if it is a destructive or safe operation, effects on printer state, or required permissions. The tool is a write operation but no side effects are described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that efficiently states the action and mechanism. It is appropriately sized for a simple tool, though could be slightly expanded to cover important caveats.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of output schema and no annotations, the description should explain return behavior or confirmation of action. It does not clarify what happens after setting the light (e.g., success response, visual confirmation). However, the tool's simplicity partially compensates.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% description coverage, so baseline is 3. The description adds no additional parameter context beyond what the schema already provides (e.g., examples for 'light' node). It does not explain relationships between parameters or typical values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it sets a Bambu printer light node mode using MQTT LED command. This is specific and distinct from other set_* sibling tools like set_temperature or set_airduct_mode.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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 provides no explicit when-to-use or when-not-to-use guidance. It does not differentiate from alternative methods like using the printer's native controls or other tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_print_speedA

Set the active print speed mode: silent, standard, sport, or ludicrous.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesSpeed mode to apply: silent/1, standard/2, sport/3, or ludicrous/4
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description must disclose behavioral traits. It indicates mutation ('set') and lists the possible values, but does not mention side effects (e.g., impact on ongoing print), reversibility, or required permissions. This is adequate but minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that is front-loaded with the action and resource. No extraneous words or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is minimal given the tool has four parameters (three optional) and no output schema. It lacks information about return values, prerequisites (e.g., printer connection), or behavior during a print job. It is adequate for a simple setter but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 little beyond the schema. It reiterates the mode values but does not provide additional semantic context for parameters like host or serial beyond what's in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 'active print speed mode', and enumerates the four possible values (silent, standard, sport, ludicrous). It distinguishes itself from sibling tools that set other printer parameters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide explicit guidance on when to use this tool versus alternatives, nor does it mention prerequisites or context (e.g., whether the printer must be connected or printing). The usage is implied but not elaborated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_temperatureC

Set the temperature of a printer component (bed, nozzle)

ParametersJSON Schema
NameRequiredDescriptionDefault
componentYesComponent to heat: bed, nozzle, or extruder
temperatureYesTarget temperature in °C
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, and description is silent on behavioral details like range limits, blocking vs. async, or potential errors. For a mutation tool, more transparency is needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single direct sentence that is front-loaded and efficient. Could include structured hints for parameters, but overall concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without output schema or annotations, description should cover return values and error handling, but it does not. Missing context for a 5-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema describes all parameters fully (100% coverage). The description adds no extra meaning and omits 'extruder' mentioned in schema, making it less complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the action (set temperature) and resource (printer component), with examples (bed, nozzle). It differentiates from sibling tools like set_fan_speed or set_light.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool or alternatives. No mention of prerequisites or conditions, such as printer state or safety considerations, making it hard to decide.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
object_idsYesObject IDs to skip. Use list_3mf_plate_objects on the sliced 3MF to find IDs.
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals the use of the MQTT skip_objects command, which adds technical context. However, it does not describe side effects, prerequisites (e.g., must be a multi-object print currently running), or the reversibility of the skip action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence conveys the core purpose and method without unnecessary words. Every clause serves a purpose: verb, resource, context, and implementation detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description provides essential context: the action, the target, the mechanism (MQTT command), and how to source object IDs. It is sufficient for an agent to understand and invoke the tool correctly, though a brief mention of return/outcome would be helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100%. The description adds significant value for the 'object_ids' parameter by instructing the agent to use 'list_3mf_plate_objects' on the sliced 3MF to find valid IDs, which is not apparent from the schema alone. Other parameters (host, serial, token) are standard defaults and need no further explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 (specific object IDs), and the context (during a running multi-object print). It distinguishes itself from sibling tools like cancel_print or pause_print by targeting individual objects during an active print.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for skipping objects during a running multi-object print, but it does not explicitly state when not to use it or mention alternative approaches. The context is clear but lacks explicit guidance on exclusion criteria or comparison with siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

slice_stlB

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
stl_pathYesPath to the STL or 3MF file to slice
bambu_modelYesREQUIRED: Bambu Lab printer model. Ask the user if not known. Using the wrong model can damage the printer.
slicer_typeNoType of slicer to use. Bambu-compatible choices (bambustudio, orcaslicer, orcaslicer-bambulab) export sliced 3MF; aliases such as fulu-orca and orca-studio are accepted.
slicer_pathNoPath to the slicer executable (default: value from env)
slicer_profileNoPath to the slicer profile/config file (optional, overrides bambu_model preset)
template_3mf_pathNoOptional template 3MF whose embedded Bambu slicer settings should be reused when slicing a new STL or 3MF.
template_nameNoOptional named template from the local registry. Resolves to template_3mf_path automatically.
template_dirNoOptional template directory override when resolving template_name.
nozzle_diameterNoNozzle diameter in mm (default: 0.4)
bed_typeNoBed plate type for slicing (default: textured_plate). SuperTack is accepted only for pre-sliced print jobs until the BambuStudio CLI identifier is verified.
use_printer_filamentsNoWhen 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.
uptodateNoRefresh 3MF preset configs to match the latest BambuStudio version. Use when slicing downloaded or older 3MF files to prevent stale-config failures.
repetitionsNoPrint N identical copies of the model. Each copy gets its own plate placement. Example: 3 prints three copies.
orientNoAuto-orient the model for optimal printability (minimize supports, maximize bed adhesion). Recommended for raw STL imports that lack a pre-set orientation.
arrangeNoAuto-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.
ensure_on_bedNoDetect models floating above the bed and lower them onto the build surface. Safety net for imported models with incorrect Z origins.
clone_objectsNoDuplicate 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.
skip_objectsNoSkip 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.
load_filamentsNoOverride filament profiles. Semicolon-separated paths to filament JSON configs, e.g. 'pla_basic.json;petg_cf.json'.
filament_profileNoCompatibility alias for load_filaments. Semicolon-separated Orca/Bambu filament profile JSON paths.
load_filament_idsNoMap 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.
enable_timelapseNoInsert timelapse parking moves into gcode. The toolhead parks at a fixed position each layer for camera capture. Adds ~10% print time.
allow_mix_tempNoAllow filaments with different temperature requirements on the same plate. Required for multi-material prints mixing e.g. PLA and PETG.
scaleNoUniform scale factor applied to all axes. 1.0 = original size, 2.0 = double, 0.5 = half. Applied before slicing.
rotateNoRotate the model around the Z-axis (vertical) by this many degrees before slicing. Positive = counterclockwise when viewed from above.
rotate_xNoRotate the model around the X-axis by this many degrees before slicing. Useful for reorienting prints for better layer adhesion.
rotate_yNoRotate the model around the Y-axis by this many degrees before slicing. Useful for reorienting prints for better layer adhesion.
min_saveNoWrite a smaller output 3MF by omitting non-essential metadata. Reduces file size for faster FTP upload to the printer.
skip_modified_gcodesNoStrip 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.
slice_plateNoWhich plate index to slice. 0 = all plates (default). Use 1, 2, etc. to slice only a specific plate in multi-plate 3MF projects.

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It does not disclose side effects (e.g., file creation), performance, error conditions, or whether it modifies input files. For a tool with 30 parameters, this is insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, efficient in length, but the bolded 'IMPORTANT' is slightly noisy. It could be slightly more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the high complexity (30 parameters), no output schema, and multiple sibling tools, the description is very incomplete. It does not explain return values, error handling, or how the output is used. A more complete description would include behavior beyond basic action.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 parameters. The description adds no extra meaning beyond highlighting bambu_model, which is already required. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('slice'), resource ('STL or 3MF file'), and output ('printable G-code or sliced 3MF'). It also highlights a critical prerequisite (bambu_model). However, it does not differentiate from sibling tools like 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description emphasizes that bambu_model must be specified for safety, which is a usage guideline. However, it does not provide explicit guidance on when to use this tool versus alternatives (e.g., slice_with_template) 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.

slice_with_templateB

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
stl_pathYesPath to the STL or 3MF file to slice
template_nameYesNamed template from the local registry.
template_dirNoOptional template directory override when resolving template_name.
bambu_modelYesREQUIRED: Bambu Lab printer model. Ask the user if not known. Using the wrong model can damage the printer.
slicer_typeNoType of slicer to use. Bambu-compatible choices (bambustudio, orcaslicer, orcaslicer-bambulab) export sliced 3MF; aliases such as fulu-orca and orca-studio are accepted.
slicer_pathNoPath to the slicer executable (default: value from env)
slicer_profileNoExplicit slicer profile/config file. Overrides the named template only when provided in the tool call.
nozzle_diameterNoNozzle diameter in mm (default: 0.4)
bed_typeNoBed plate type for slicing (default: textured_plate). SuperTack is accepted only for pre-sliced print jobs until the BambuStudio CLI identifier is verified.
use_printer_filamentsNoWhen 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.
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)
load_filamentsNoOverride filament profiles. Semicolon-separated paths to filament JSON configs.
load_filament_idsNoOptional filament-to-object mapping string.
ensure_on_bedNoLift floating models onto the bed.
arrangeNoAuto-arrange objects on the build plate.
orientNoAuto-orient model for optimal printability.
repetitionsNoNumber of copies to print.
scaleNoUniform scale factor.
rotateNoZ-axis rotation in degrees.
rotate_xNoX-axis rotation in degrees.
rotate_yNoY-axis rotation in degrees.
min_saveNoProduce smaller output 3MF.
skip_modified_gcodesNoIgnore stale custom gcodes in the 3MF.
slice_plateNoWhich plate index to slice. 0 = all plates.

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It only states it is a wrapper, but does not disclose behavioral traits like side effects, error cases, or what happens with templates.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words; front-loads the core action and relationship to sibling tool. Minor improvement possible by adding quick usage hint.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 26 parameters, no output schema, and no annotations, the description is too minimal. It does not explain return value, error behavior, or setup prerequisites, which a complex tool requires.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description lists parameters but adds no additional meaning beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verb+resource ('Slice an STL or 3MF') and clearly distinguishes itself from slice_stl as a higher-level wrapper for template-based workflows.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage for template-based workflows and mentions being a wrapper around slice_stl, but lacks explicit when-to-use or when-not-to-use guidance, especially compared to sibling slice_stl.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_printA

Start printing a G-code file already on the Bambu Lab printer. Alias of start_print_job for upstream MCP compatibility.

ParametersJSON Schema
NameRequiredDescriptionDefault
filenameYesName of the file to print
bambu_modelYesREQUIRED: Bambu Lab printer model. Ask the user if not known. Starting G-code for the wrong model can damage the printer.
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

A3.7/5.0
Behavior2/5

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 a write operation ('Start printing') but does not specify other behavioral traits such as whether the printer must be idle, what happens if the file is not found, or if the printing starts immediately. The model warning in the schema is not in 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no unnecessary words. It efficiently conveys the tool's action and its alias relationship. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 5 parameters (2 required), no output schema, and no annotations, the description provides the core action but omits details about return values, error states, or progress feedback. The high schema coverage partially compensates, but the description could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 parameters. The description adds meaningful context beyond the schema by clarifying that the file must already be on the printer ('already on the Bambu Lab printer'), which is not obvious from the 'filename' parameter alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Start printing'), the resource ('G-code file already on the Bambu Lab printer'), and distinguishes itself from siblings by noting it is an alias of start_print_job. This provides a specific verb+resource and differentiates from similar tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions it is an alias but does not explicitly state when to use this tool vs start_print_job or other printing tools. There is no guidance on prerequisites or when not to use it. The schema description for bambu_model warns about damaging the printer, which is implicit guidance, but no explicit usage instructions.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
filenameYesName of the file to print
bambu_modelYesREQUIRED: Bambu Lab printer model. Ask the user if not known. Starting G-code for the wrong model can damage the printer.
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Only states 'start printing' without disclosing what happens on failure (file not found, printer busy), whether it blocks, or any side effects. Critical warning about bambu_model is in schema, not description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single front-loaded sentence with no wasted words. Could be slightly more descriptive without harming conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Minimal for a tool with 5 parameters and no output schema. Lacks information on preconditions (file must be on printer), error behavior, and expected result. Siblings like start_print or print_3mf may overlap, but no distinction is provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline 3 is appropriate. Description adds no additional meaning beyond the schema's parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verb 'Start printing' and resource 'a G-code file already on the Bambu Lab printer', clearly stating the action and prerequisite. It differentiates from other operations like uploading or slicing by emphasizing the file must already be on the printer.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 such as start_print or print_3mf. The description implies the file must be uploaded but does not state prerequisites or exclusion cases.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
file_pathYesLocal path to the file to upload
filenameYesName for the file on the printer
printNoStart printing after upload (default: false)
bambu_modelNoRequired when print is true. Bambu Lab printer model used as a safety confirmation before starting the uploaded file.
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description does not disclose side effects (e.g., printing behavior controlled by 'print' parameter), file behavior when not printing, or any risks. With no annotations, the description fails to adequately inform the agent of the tool's operational traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence, but it lacks structure and important details. It is concise but not sufficiently informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 7 parameters, no output schema, and numerous sibling tools, the description is incomplete. It omits information about output, preconditions, and the behavior of optional parameters like 'print'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 to any parameter beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (upload) and the target (local file to Bambu Lab printer), making the tool's purpose understandable. However, it does not differentiate from sibling upload tools like upload_gcode, and the lack of file type specificity reduces clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 such as upload_gcode or print_3mf. There is no mention of prerequisites, typical use cases, or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_gcodeB

Upload a G-code file to the Bambu Lab printer

ParametersJSON Schema
NameRequiredDescriptionDefault
filenameYesName for the file on the printer
gcodeNoG-code content to upload, or a readable local .gcode path. For large files, prefer gcode_path.
gcode_pathNoLocal path to a .gcode file to upload. This avoids sending large G-code bodies through the MCP request.
hostNoHostname or IP of the printer (default: value from env)
bambu_serialNoSerial number (default: value from env)
bambu_tokenNoAccess token (default: value from env)

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden but only states 'Upload,' implying a write operation without disclosing side effects (e.g., overwriting, printer state requirements). Lacks details on potential conflicts or idempotency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no redundant words, efficiently conveying the core action and target.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite a rich input schema (6 parameters, no output schema), the description is too sparse. It fails to mention that either 'gcode' or 'gcode_path' is required, or how to choose between them, leaving the agent underinformed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds no additional meaning beyond the schema; it merely restates the action without highlighting parameter relationships or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Upload' and the resource 'G-code file to the Bambu Lab printer', making the tool's purpose specific and unambiguous. It distinguishes from siblings like 'upload_file' by specifying G-code content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 (e.g., 'upload_file' or 'print_3mf'), nor does it specify prerequisites or conditions like printer readiness.

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. Dates show when Glama detected each change.

  1. 41 tool updatesv1.1.1
    • First observedbambu_network_bridge_status
    • First observedbambu_network_call
    • First observedblender_mcp_edit_model
    • First observedcamera_snapshot
    • First observedcancel_print
    • First observedcenter_model
    • First observedclear_hms_errors
    • First observeddelete_printer_file
    • First observedextend_stl_base
    • First observedget_printer_filaments
    • First observedget_printer_status
    • First observedget_slice_settings
    • First observedget_stl_info
    • First observedlay_flat
    • First observedlist_3mf_plate_objects
    • First observedlist_printer_files
    • First observedlist_templates
    • First observedmerge_vertices
    • First observedpause_print
    • First observedprint_3mf
    • First observedprint_3mf_bambu_network
    • First observedprint_collar_charm
    • First observedreread_ams_rfid
    • First observedresolve_3mf_ams_slots
    • First observedresume_print
    • First observedrotate_stl
    • First observedsave_template
    • First observedscale_stl
    • First observedset_airduct_mode
    • First observedset_ams_drying
    • First observedset_fan_speed
    • First observedset_light
    • First observedset_print_speed
    • First observedset_temperature
    • First observedskip_objects
    • First observedslice_stl
    • First observedslice_with_template
    • First observedstart_print
    • First observedstart_print_job
    • First observedupload_file
    • First observedupload_gcode

TDQS

B3.4/5.0
Disambiguation4/5

Most tools have distinct purposes, but there is slight overlap between 'print_3mf' and 'print_3mf_bambu_network', and 'start_print' is an alias for 'start_print_job', which could cause confusion. Descriptions help clarify, but the presence of aliases reduces disambiguation slightly.

Naming Consistency4/5

The majority of tools use a consistent verb_noun pattern (e.g., cancel_print, pause_print, set_temperature). However, a few deviations exist: 'bambu_network_bridge_status' and 'bambu_network_call' use a noun prefix, and 'blender_mcp_edit_model' also deviates. Overall, the pattern is mostly consistent.

Tool Count2/5

With 41 tools, the server is quite large. While it covers many aspects of printer management, the count significantly exceeds the typical well-scoped range (3-15), making it feel heavy and potentially overwhelming. A more modular split would improve coherence.

Completeness5/5

The tool set covers the full lifecycle of printer management: control, file management, slicing, AMS handling, model editing, and camera operations. It includes both common and advanced features, with no obvious gaps for the intended domain.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/DMontgomery40/bambu-printer-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server