Blockbench MCP
Drives the Blockbench 3D editor to model, UV-map, texture, rig and animate low-poly and cube models
Controls Bambu Lab 3D printers over the local network, with slicing, AMS and STL tools
By David Montgomery (individual) TypeScript Local · stdio Design
72 popularity score ★ 288 ↓ 12k/wk
Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs PRINTER_HOST, BAMBU_SERIAL, BAMBU_TOKEN. Replace each <NAME> with your value.
claude mcp add bambu-printer -e PRINTER_HOST=<PRINTER_HOST> -e BAMBU_SERIAL=<BAMBU_SERIAL> -e BAMBU_TOKEN=<BAMBU_TOKEN> -- npx -y bambu-printer-mcp{
"mcpServers": {
"bambu-printer": {
"command": "npx",
"args": [
"-y",
"bambu-printer-mcp"
],
"env": {
"PRINTER_HOST": "<PRINTER_HOST>",
"BAMBU_SERIAL": "<BAMBU_SERIAL>",
"BAMBU_TOKEN": "<BAMBU_TOKEN>"
}
}
}
}{
"mcpServers": {
"bambu-printer": {
"command": "npx",
"args": [
"-y",
"bambu-printer-mcp"
],
"env": {
"PRINTER_HOST": "<PRINTER_HOST>",
"BAMBU_SERIAL": "<BAMBU_SERIAL>",
"BAMBU_TOKEN": "<BAMBU_TOKEN>"
}
}
}
}{
"servers": {
"bambu-printer": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"bambu-printer-mcp"
],
"env": {
"PRINTER_HOST": "<PRINTER_HOST>",
"BAMBU_SERIAL": "<BAMBU_SERIAL>",
"BAMBU_TOKEN": "<BAMBU_TOKEN>"
}
}
}
}[mcp_servers.bambu-printer]
command = "npx"
args = ["-y", "bambu-printer-mcp"]
[mcp_servers.bambu-printer.env]
PRINTER_HOST = "<PRINTER_HOST>"
BAMBU_SERIAL = "<BAMBU_SERIAL>"
BAMBU_TOKEN = "<BAMBU_TOKEN>"gemini mcp add --scope user -e PRINTER_HOST=<PRINTER_HOST> -e BAMBU_SERIAL=<BAMBU_SERIAL> -e BAMBU_TOKEN=<BAMBU_TOKEN> bambu-printer npx -- -y bambu-printer-mcpOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs PRINTER_HOST, BAMBU_SERIAL, BAMBU_TOKEN. Replace each <NAME> with your value.
git clone https://github.com/DMontgomery40/bambu-printer-mcp.git
cd bambu-printer-mcp
npm install
npm run buildclaude mcp add bambu-printer -e PRINTER_HOST=<PRINTER_HOST> -e BAMBU_SERIAL=<BAMBU_SERIAL> -e BAMBU_TOKEN=<BAMBU_TOKEN> -- node '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js'{
"mcpServers": {
"bambu-printer": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
],
"env": {
"PRINTER_HOST": "<PRINTER_HOST>",
"BAMBU_SERIAL": "<BAMBU_SERIAL>",
"BAMBU_TOKEN": "<BAMBU_TOKEN>"
}
}
}
}{
"mcpServers": {
"bambu-printer": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
],
"env": {
"PRINTER_HOST": "<PRINTER_HOST>",
"BAMBU_SERIAL": "<BAMBU_SERIAL>",
"BAMBU_TOKEN": "<BAMBU_TOKEN>"
}
}
}
}{
"servers": {
"bambu-printer": {
"type": "stdio",
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
],
"env": {
"PRINTER_HOST": "<PRINTER_HOST>",
"BAMBU_SERIAL": "<BAMBU_SERIAL>",
"BAMBU_TOKEN": "<BAMBU_TOKEN>"
}
}
}
}[mcp_servers.bambu-printer]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"]
[mcp_servers.bambu-printer.env]
PRINTER_HOST = "<PRINTER_HOST>"
BAMBU_SERIAL = "<BAMBU_SERIAL>"
BAMBU_TOKEN = "<BAMBU_TOKEN>"gemini mcp add --scope user -e PRINTER_HOST=<PRINTER_HOST> -e BAMBU_SERIAL=<BAMBU_SERIAL> -e BAMBU_TOKEN=<BAMBU_TOKEN> bambu-printer node -- '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js'PRINTER_HOST |
Required: Printer's LAN IP address; alias BAMBU_PRINTER_HOST. |
|---|---|
BAMBU_SERIAL |
Required: Printer serial number; alias BAMBU_PRINTER_SERIAL. |
BAMBU_TOKEN secret |
Required: LAN access code from the printer screen; alias BAMBU_PRINTER_ACCESS_TOKEN. |
BAMBU_MODEL |
Optional: Printer model (p1s, x1c, a1, h2d, x2d and others); needed to slice and print, asked for if unset and the client supports it. |
FFMPEG_PATH |
Optional: ffmpeg executable for RTSP camera snapshots. |
MCP_TRANSPORT |
Optional: stdio or streamable-http, which binds to 127.0.0.1:3000 unless MCP_HTTP_HOST or MCP_HTTP_PORT is set. |
BLENDER_MCP_COMMAND |
Optional: Executable of a stdio Blender MCP server, such as the full path to uvx. |
FUSION_MCP_COMMAND |
Optional: Program that starts the Fusion MCP server, normally uvx. |
| Set together: slicing | |
SLICER_TYPE |
Optional: bambustudio, orcaslicer, orcaslicer-bambulab or orca-slicer-api for remote slicing. |
SLICER_PATH |
Optional: Full path to the slicer executable, unused with orca-slicer-api. |
| Set together: remote slicing | |
SLICER_API_URL |
Optional: Address of the orca-slicer-api service when SLICER_TYPE=orca-slicer-api. |
BAMBU_PROFILES_ROOT |
Optional: Folder holding the slicer's resources/profiles tree; needed for remote slicing. |
This server links an MCP client to a Bambu Lab 3D printer on your local network. It talks to the printer directly over MQTT (port 8883) and FTPS (port 990) using the LAN access code, so the default path needs no Bambu Cloud login. You can check status and progress, upload files, start a sliced 3MF with AMS tray mapping, pause or cancel a job, skip one object, and change speed, fans, lights or temperatures.
Slicing uses an installed BambuStudio, OrcaSlicer or FULU OrcaSlicer-bambulab command line with your model's exact machine preset. Set SLICER_TYPE=orca-slicer-api and jobs go to a separately hosted orca-slicer-api service. Optional bridges reach a Blender MCP server, Autodesk Fusion and FULU's BambuNetwork runtime.
The X2D is the odd one out. Status and slicing work anywhere, but printing needs a locally built helper that loads Bambu's networking plug-in, on macOS or x86-64 Linux. On Linux the package's second program, bambu-printer-mcp-native-setup, builds it.
src/index.ts registers 57 tools, well past the README's reference. The extras include start_print (an alias), a live camera stream, four counterpart tools and a Fusion bridge. Four FDM design prompts sit beside the status, file and HMS resources.
Ordinary print, heat and resume commands now go ahead without asking anyone. The code treats the client's own tool approval as the yes. A prompt (MCP elicitation) comes only when hardware errors are cleared and on the first print after that, or when a resumed file cannot be read back to check its hash. It waits 10 minutes by default (BAMBU_CONFIRMATION_TIMEOUT_MS, 1 second to an hour). BAMBU_REQUIRE_CONFIRMATION is no longer read.
camera_stream_start holds one camera connection open, at 1 frame a second by default, and closes it after 30 idle seconds. camera_frame returns a JPEG only when the picture has visibly changed. The Fusion tools run FUSION_MCP_COMMAND, usually uvx, to reach the Fusion360MCP add-in on port 9877.
| Runtime | Node.js 24+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Bambu Lab printer (LAN mode) | Your own instancePrinter IP, serial number and LAN access code; LAN Only Mode and Developer Mode on firmware that has it |
| Also |
|
Supported printers are P1S, P1P, P2S, X1C, X1E, A1, A1 mini, H2D, H2S, H2C and X2D. From firmware 01.08.05 third-party control needs Developer Mode. Remote slicing needs SLICER_API_URL plus a read-only copy of the matching Orca resources/profiles tree in BAMBU_PROFILES_ROOT. X2D printing on Linux: run npx -y -p bambu-printer-mcp bambu-printer-mcp-native-setup (needs g++ or clang++). On macOS: install Bambu Studio with its networking plug-in and Apple's command line tools, then run npm run build:native in the installed package folder. Blender edits need uvx blender-mcp with its addon running in Blender. Fusion tools need uv (FUSION_MCP_COMMAND=uvx) and Fusion running the Fusion360MCP add-in.
A tool's success reply does not confirm a physical print. STL tools load whole meshes into memory with no cap, and slice_stl blocks until the slicer finishes. Turning on LAN Only Mode cuts the printer off from Bambu's cloud and the Handy app.
Suits Bambu Lab owners who want to check on, start and steer prints from an assistant, and who can run the server on the printer's own network with LAN and Developer Mode enabled. It writes to real hardware (heaters, motion, files on the printer), and ordinary print starts no longer wait for a person, so it fits people who trust their client's own tool approval. Owners of OctoPrint, Klipper, Prusa or Creality machines should use the author's mcp-3D-printer-server, which its README names for multi-brand setups. Anyone who must keep Bambu Cloud and the Handy app working on the printer will lose them in LAN Only Mode.
19 only read, 36 change things, 2 can delete or overwrite. A ? marks an optional parameter.
get_printer_statushost?: stringbambu_serial?: stringbambu_token?: stringget_printer_filamentshost?: stringbambu_serial?: stringbambu_token?: stringbambu_model?: enumnozzle_diameter?: stringresolve_3mf_ams_slotsthree_mf_path: stringplate_index?: numberbambu_model?: enumnozzle_diameter?: stringhost?: stringbambu_serial?: stringbambu_token?: stringlist_3mf_plate_objectsthree_mf_path: stringplate_index?: numberextend_stl_base changesstl_path: stringextension_height: numberscale_stl changesstl_path: stringscale_x?: numberscale_y?: numberscale_z?: numberrotate_stl changesstl_path: stringangle_x?: numberangle_y?: numberangle_z?: numberget_stl_infostl_path: stringlist_templatestemplate_dir?: stringsave_template changessource_path: stringtemplate_name?: stringtemplate_dir?: stringget_slice_settingssource_path?: stringtemplate_name?: stringtemplate_dir?: stringslice_with_template changesstl_path: stringtemplate_name: stringtemplate_dir?: stringbambu_model: enumslicer_type?: enumslicer_path?: stringslicer_profile?: stringnozzle_diameter?: stringbed_type?: enumnozzle_type?: enumnozzle_volume_type?: enumuse_printer_filaments?: booleanhost?: stringbambu_serial?: stringbambu_token?: stringload_filaments?: stringload_filament_ids?: stringfilament_colours?: stringensure_on_bed?: booleanarrange?: booleanslice_stl changesstl_path: stringbambu_model: enumslicer_type?: enumslicer_path?: stringslicer_profile?: stringtemplate_3mf_path?: stringtemplate_name?: stringtemplate_dir?: stringnozzle_diameter?: stringbed_type?: enumnozzle_type?: enumnozzle_volume_type?: enumuse_printer_filaments?: booleanuptodate?: booleanrepetitions?: numberorient?: booleanarrange?: booleanensure_on_bed?: booleanclone_objects?: stringskip_objects?: stringlist_printer_fileshost?: stringbambu_serial?: stringbambu_token?: stringbambu_connect_import_file changesfile_path: stringname?: stringversion?: stringbambu_network_bridge_statusconnect?: booleanbridge_command?: stringbambu_network_config_dir?: stringcountry_code?: stringuser_info?: stringtimeout_ms?: numberbambu_network_callmethod: stringpayload?: objectwith_agent?: booleanbridge_command?: stringbambu_network_config_dir?: stringcountry_code?: stringuser_info?: stringtimeout_ms?: numberprint_3mf_bambu_network changesthree_mf_path: stringbambu_model: enumconnection_type?: enumbambu_network_method?: enumdev_id?: stringdev_ip?: stringhost?: stringbambu_serial?: stringbambu_token?: stringusername?: stringpassword?: stringbed_type?: enumnozzle_type?: enumnozzle_volume_type?: enumplate_index?: numberproject_name?: stringpreset_name?: stringtask_name?: stringconfig_filename?: stringbridge_command?: stringcamera_stream_starthost?: stringbambu_serial?: stringbambu_token?: stringbambu_model?: stringfps?: numberidle_timeout_ms?: integercamera_framehost?: stringbambu_serial?: stringbambu_token?: stringsince_seq?: integerwait_ms?: integermax_width?: integercamera_stream_stophost?: stringbambu_serial?: stringbambu_token?: stringcamera_snapshotsave_path?: stringtimeout_ms?: numberbambu_model?: stringexperimental?: booleanffmpeg_path?: stringhost?: stringbambu_serial?: stringbambu_token?: stringdelete_printer_file deletesfilename: stringconfirm?: booleanhost?: stringbambu_serial?: stringbambu_token?: stringupload_gcode changesfilename: stringgcode?: stringgcode_path?: stringbambu_model?: enumhost?: stringbambu_serial?: stringbambu_token?: stringupload_file changesfile_path: stringfilename: stringprint?: booleanconnection_mode?: enumbambu_model?: enumproject_name?: stringpreset_name?: stringbed_type?: enumplate_index?: integerhost?: stringbambu_serial?: stringbambu_token?: stringstart_print changesfilename: stringbambu_model: enumhost?: stringbambu_serial?: stringbambu_token?: stringstart_print_job changesfilename: stringbambu_model: enumhost?: stringbambu_serial?: stringbambu_token?: stringcancel_print deleteshost?: stringbambu_serial?: stringbambu_token?: stringconnection_mode?: enumconnection_type?: enumpause_print changeshost?: stringbambu_serial?: stringbambu_token?: stringconnection_mode?: enumconnection_type?: enumresume_print changeshost?: stringbambu_serial?: stringbambu_token?: stringconnection_mode?: enumconnection_type?: enumx2d_native_control changesmessage_json: stringqos?: numberflag?: numberhost?: stringbambu_serial?: stringbambu_token?: stringclear_hms_errors changeshost?: stringbambu_serial?: stringbambu_token?: stringset_print_speed changesmode: enumhost?: stringbambu_serial?: stringbambu_token?: stringset_airduct_mode changesmode: enumhost?: stringbambu_serial?: stringbambu_token?: stringreread_ams_rfid changesams_id: numberslot_id: numberhost?: stringbambu_serial?: stringbambu_token?: stringset_temperature changescomponent: stringtemperature: numberbambu_model?: enummaterial?: stringnozzle_diameter?: enumhost?: stringbambu_serial?: stringbambu_token?: stringset_fan_speed changesfan: stringspeed: numberconfirm_during_print?: booleanhost?: stringbambu_serial?: stringbambu_token?: stringset_light changeslight: stringmode: enumhost?: stringbambu_serial?: stringbambu_token?: stringskip_objects changesobject_ids: arrayhost?: stringbambu_serial?: stringbambu_token?: stringset_ams_drying changesaction: enumams_id: numberhost?: stringbambu_serial?: stringbambu_token?: stringinspect_print_filefile_path: stringbambu_model: enumplate_index?: integernozzle_diameters?: enumbed_type?: enumprint_3mf changesthree_mf_path: stringbambu_model: enumconnection_mode?: enumtry_emmc_print?: booleanconnection_type?: enumbambu_network_method?: enumdev_id?: stringdev_ip?: stringbridge_command?: stringbambu_network_config_dir?: stringcountry_code?: stringuser_info?: stringbed_type?: enumnozzle_type?: enumnozzle_volume_type?: enumhost?: stringbambu_serial?: stringbambu_token?: stringplate_index?: numberslicer_type?: enumprint_collar_charm changessource_path?: stringtemplate_name?: stringtemplate_dir?: stringbambu_model: enumhost?: stringbambu_serial?: stringbambu_token?: stringbed_type?: enumbed_leveling?: booleanflow_calibration?: booleanvibration_calibration?: booleantimelapse?: booleanslicer_profile?: stringnozzle_diameter?: stringmerge_vertices changesstl_path: stringtolerance?: numbercenter_model changesstl_path: stringlay_flat changesstl_path: stringblender_mcp_statusconnect?: booleantimeout_ms?: integerblender_mcp_call changestool_name: stringarguments?: objecttimeout_ms?: integerblender_mcp_edit_model changesstl_path?: stringoperations?: arrayoutput_path?: stringuser_prompt?: stringtimeout_ms?: integerbridge_command?: stringexecute?: booleancounterpart_printer_infobambu_model?: stringhost?: stringbambu_serial?: stringbambu_token?: stringcounterpart_print_route changesroute?: enumcounterpart_print_progressbambu_model?: stringhost?: stringbambu_serial?: stringbambu_token?: stringcounterpart_make_3mf changesparts: arrayout_path: stringfusion_mcp_statuslaunch?: booleantimeout_ms?: integerfusion_mcp_call changesdocument_id?: stringtool_name: stringarguments?: objecttimeout_ms?: integerfusion_mcp_new_design changesbind_document?: booleansource_f3d?: stringtimeout_ms?: integerfusion_mcp_export changesdocument_id?: stringoutput_dir: stringname: stringbody_name?: stringtimeout_ms?: integerprinter://{host}/statusprinter://{host}/filesprinter://{host}/hmsguidance://fdm/capability-guidancefdm_designfdm_multicolorfdm_assemblyfdm_after_slice