bambu-sentinel-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BAMBU_HOST | No | The IP address of the Bambu Lab printer (e.g. 192.168.x.x). Can be skipped by calling add_printer instead. | |
| BAMBU_MODEL | No | The printer model, e.g. A1. Can be skipped by calling add_printer instead. | |
| BAMBU_SERIAL | No | The serial number of the printer. Can be skipped by calling add_printer instead. | |
| BAMBU_ACCESS_CODE | No | The LAN access code shown on the printer's screen. Can be skipped by calling add_printer instead. | |
| BAMBU_SENTINEL_HOME | No | Override the data directory (default ~/.bambu-sentinel). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": true
} |
| resources | {
"subscribe": true,
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| fleet_overviewA | One-line status for every configured printer (state, progress, temps, plate-cleared flag). |
| printer_statusB | Full live state of one printer: temps, fans, layer, HMS errors, AMS trays. |
| add_printerA | Register a printer (LAN mode). Needs the printer IP, serial number and LAN access code (printer screen > Network). Saved to ~/.bambu-sentinel/config.json. |
| remove_printerA | Forget a printer (history is kept). Refused while it is printing unless force=true. |
| pause_printC | Pause the running print. |
| resume_printC | Resume a paused print. |
| stop_printA | Cancel the current print. Irreversible: the part is lost. Requires confirm=true. |
| set_speedB | Print speed profile: 1 silent, 2 standard, 3 sport, 4 ludicrous. |
| set_lightC | Turn the work light on or off. |
| set_temperatureA | Set nozzle or bed target temperature (model limits enforced; 0 turns the heater off). |
| send_gcodeA | Send up to 20 lines of G-code. Only a safe allowlist is accepted (moves, homing, temps within model limits, fans, speed/flow). Not allowed during a print unless it is a temp/fan/speed command. |
| inspect_3mfB | Read a sliced .3mf: plates, estimated print time, filament weight and required filament types/colours. |
| list_printer_filesC | List files on the printer's storage over FTPS. |
| upload_fileB | Upload a local file to the printer (default /cache/). |
| delete_printer_fileB | Delete a file from the printer storage. Requires confirm=true. |
| start_printA | Upload a local .3mf/.gcode.3mf and start it now. Filament slots are matched automatically against the loaded AMS trays. You must confirm the build plate is empty (plate_cleared=true). |
| queue_addA | Add a sliced file to the print queue. The scheduler later picks a free printer that has the right filament loaded. Higher priority runs first. |
| queue_listC | List queue jobs (default: queued and printing). |
| queue_etaA | Forecast the queue: which printer each queued job would go to, when it starts and ends, and when everything is done. Uses the slicer's time estimate (3MF), else past runs of the same name, else 60 min. Running prints count with their remaining time. |
| queue_cancelA | Remove a queued job. For a job already printing use stop_print. |
| queue_set_priorityC | Change a queued job's priority. |
| queue_dispatchA | Start queued jobs on free printers (plate must be confirmed clear). dry_run=true only reports which printer would take each job and why others are rejected. |
| confirm_plate_clearedA | Tell the scheduler the build plate has been emptied after the last print. Without this the printer is never given a new queued job. If auto_dispatch is on, the queue is dispatched immediately. |
| get_snapshotB | Capture a live camera frame from the printer. |
| inspect_printA | Supervision check: live camera frame (plus an older frame for comparison when available), key telemetry, telemetry anomalies and recent events, with guidance for judging whether the print is failing. |
| get_eventsC | Recent printer events: print started/finished/failed, pauses, HMS errors, anomaly alerts, auto-pauses. |
| get_historyC | Print history with outcomes and a success summary. |
| configure_watchB | Configure background supervision. auto_pause: pause on critical anomalies (overtemp, confident vision failure). vision_sampling: ask the client's model to judge each periodic snapshot (needs a client that supports MCP sampling). auto_dispatch: start queued jobs automatically on free, plate-cleared printers. |
| eject_plateA | Sweep finished parts off the plate with the toolhead (bed slides in Y while the toolhead sits low), then check the plate with the camera. Safe workflow: dry_run=true to inspect the G-code, rehearsal=true to run the path 25 mm higher with nothing touched, then confirm=true for the real sweep. Waits for the bed to cool first. Only runs when the printer is idle/finished, and aborts if a print starts. If the plate is not verified empty automatically, look at the returned image and call confirm_plate_cleared yourself. |
| save_empty_plate_referenceA | Store the current camera frame as the known-empty plate. Make sure the plate is really empty first; used to verify sweeps. |
| configure_ejectB | Tune the sweep profile (bed coordinates, mm). Calibrate yStart/yEnd so parts clear the bed edge into your bin, and sweeperWidth to what actually touches the part (bare nozzle is narrow: many passes). Always rehearse after changing. |
| hms_activeB | Currently active HMS errors on a printer, decoded (text, severity, whether a reprint is advisable). |
| hms_lookupA | Decode an HMS code (0700_8000_0002_0001 or 16 hex digits) or a print_error (8 hex digits). The built-in table is tiny; load a full one with hms_import. |
| hms_importA | Import an HMS dictionary from a JSON file: either {"": {"text","severity","retry"}} or a Bambu Studio style hms json (data.device_hms.en[{ecode,intro}]). Saved to ~/.bambu-sentinel/hms.json. retry: retry | human | never controls automatic reprints. |
| discover_printersA | Find Bambu printers on the local network. First listens for their SSDP announcements (IP, serial, model); if that finds nothing, or when scan='always', it probes every address of the local subnet on the MQTT/TLS port (8883) and reads the printer's certificate. The LAN access code is never broadcast: read it on the printer (Settings > Network) and pass it to add_printer. Only private ranges (192.168.x.x, 10.x.x.x, 172.16-31.x.x) are scanned. |
| spool_addA | Register a filament spool with its weight so the scheduler can check a job fits and subtract usage after each print. Optionally load it into a printer slot right away. |
| spool_listB | List spools with remaining grams and where each is loaded; flags the ones that are low. |
| spool_updateB | Correct a spool (e.g. after weighing it), change its price, or archive it when empty. |
| spool_assignA | Say which spool is loaded in which printer slot (or unload it with clear=true). Do this whenever you change spools. |
| check_filamentB | Before queueing: will this sliced file fit on each printer? Checks that matching filament is loaded AND that the spools in those slots hold enough grams. |
| estimate_costA | What will this sliced file cost to print? Filament (spool price when a spool is loaded in the matching slot, else the per-type price), electricity from the print time and the configured power draw, machine wear, and the expected cost per GOOD part given the historical failure rate. |
| cost_reportB | Spending over a period from the print history: total cost, money wasted on failed/cancelled prints, grams, energy, average cost per finished print (with and without waste), per printer. |
| configure_costA | Set the cost model. Electricity price, printer power draw, machine wear per print hour (price / life hours + upkeep), per-print handling cost, and filament prices per kg by type. Costs are computed when a print ends, with the values in force then. |
| workshop_listA | List workshops (groups of machines) and which machines are in each. |
| workshop_createC | Create a workshop to group machines. |
| workshop_updateC | Rename a workshop or change its description. |
| workshop_deleteA | Delete a workshop. Its machines move to the first remaining workshop. The last workshop cannot be deleted. |
| machine_assign_workshopC | Move a machine to another workshop. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| supervise_print | Watch a running print and react to failures |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| events | The 50 most recent printer events (subscribe to be notified of new ones) |
| fleet | Live status of all printers |
TDQS
Scored across 48 tools
Tools are mostly distinct and organized into clear domain families such as queue_, spool_, hms_, workshop_, and cost_, so an agent can usually select correctly. Minor overlap remains around plate-clearing/ejection (confirm_plate_cleared, save_empty_plate_reference, eject_plate) and monitoring (get_snapshot, inspect_print, get_events), but the descriptions differentiate them well.
Names consistently use snake_case with domain prefixes, which makes the set readable and predictable. However, ordering alternates between noun_verb forms like queue_list, printer_status, and hms_active and verb_noun forms like add_printer, set_light, and estimate_cost, so it is not a single uniform pattern.
At 48 tools, this server is far beyond the typical well-scoped range of 3-15 and falls into the 25+ heavy category. Each tool may be useful, but the large surface increases selection burden and would benefit from consolidation or splitting into sub-servers.
Coverage is unusually complete across printers, queue management, spool tracking, cost analysis, history, HMS errors, camera supervision, plate ejection, and workshops. Core lifecycle operations and configuration are present, with no obvious missing CRUD or workflow gaps.