mcp-3d-printer-server 1.2.9 → 1.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/CHANGELOG.md +207 -0
  2. package/CONTRIBUTORS.md +49 -0
  3. package/README.md +528 -811
  4. package/dist/3mf_parser.js +8 -8
  5. package/dist/blender-mcp-bridge.d.ts +1 -0
  6. package/dist/blender-mcp-bridge.js +209 -21
  7. package/dist/fulu-orca.js +29 -5
  8. package/dist/index.js +614 -110
  9. package/dist/printers/bambu-node-guard.d.ts +2 -0
  10. package/dist/printers/bambu-node-guard.js +38 -0
  11. package/dist/printers/bambu.d.ts +53 -7
  12. package/dist/printers/bambu.js +420 -126
  13. package/dist/printers/creality.d.ts +15 -6
  14. package/dist/printers/creality.js +42 -9
  15. package/dist/printers/duet.d.ts +11 -6
  16. package/dist/printers/duet.js +57 -34
  17. package/dist/printers/generic-base.d.ts +69 -0
  18. package/dist/printers/generic-base.js +209 -0
  19. package/dist/printers/klipper.d.ts +17 -6
  20. package/dist/printers/klipper.js +63 -16
  21. package/dist/printers/octoprint.d.ts +18 -6
  22. package/dist/printers/octoprint.js +64 -9
  23. package/dist/printers/printer-factory.d.ts +11 -2
  24. package/dist/printers/printer-factory.js +9 -8
  25. package/dist/printers/prusa.d.ts +14 -6
  26. package/dist/printers/prusa.js +56 -9
  27. package/dist/printers/repetier.d.ts +18 -6
  28. package/dist/printers/repetier.js +48 -6
  29. package/dist/safety/archive.d.ts +11 -0
  30. package/dist/safety/archive.js +214 -0
  31. package/dist/safety/artifact.d.ts +6 -0
  32. package/dist/safety/artifact.js +66 -0
  33. package/dist/safety/confirmation.d.ts +22 -0
  34. package/dist/safety/confirmation.js +43 -0
  35. package/dist/safety/expected-peaks.d.ts +24 -0
  36. package/dist/safety/expected-peaks.js +24 -0
  37. package/dist/safety/gcode-thermal.d.ts +64 -0
  38. package/dist/safety/gcode-thermal.js +382 -0
  39. package/dist/safety/limits.d.ts +31 -0
  40. package/dist/safety/limits.js +105 -0
  41. package/dist/safety/print-file.d.ts +25 -0
  42. package/dist/safety/print-file.js +517 -0
  43. package/dist/safety/printer-state.d.ts +51 -0
  44. package/dist/safety/printer-state.js +365 -0
  45. package/dist/slicer/bambu-cli.d.ts +110 -0
  46. package/dist/slicer/bambu-cli.js +547 -0
  47. package/dist/slicer/profile-flatten.d.ts +104 -0
  48. package/dist/slicer/profile-flatten.js +676 -0
  49. package/dist/slicer/run-slicer.d.ts +18 -0
  50. package/dist/slicer/run-slicer.js +102 -0
  51. package/dist/slicer/slicer-error.d.ts +27 -0
  52. package/dist/slicer/slicer-error.js +53 -0
  53. package/dist/slicer/templates.d.ts +126 -0
  54. package/dist/slicer/templates.js +255 -0
  55. package/dist/stl/stl-manipulator.d.ts +25 -3
  56. package/dist/stl/stl-manipulator.js +214 -232
  57. package/package.json +16 -9
  58. package/server.json +29 -0
  59. package/src/3mf_parser.ts +8 -8
  60. package/src/blender-mcp-bridge.ts +200 -19
  61. package/src/fulu-orca.ts +36 -6
  62. package/src/index.ts +686 -137
  63. package/src/printers/bambu-node-guard.ts +44 -0
  64. package/src/printers/bambu.ts +458 -164
  65. package/src/printers/creality.ts +40 -9
  66. package/src/printers/duet.ts +64 -53
  67. package/src/printers/generic-base.ts +286 -0
  68. package/src/printers/klipper.ts +83 -28
  69. package/src/printers/octoprint.ts +74 -21
  70. package/src/printers/printer-factory.ts +21 -11
  71. package/src/printers/prusa.ts +53 -10
  72. package/src/printers/repetier.ts +55 -17
  73. package/src/safety/archive.ts +181 -0
  74. package/src/safety/artifact.ts +58 -0
  75. package/src/safety/confirmation.ts +56 -0
  76. package/src/safety/expected-peaks.ts +47 -0
  77. package/src/safety/gcode-thermal.ts +404 -0
  78. package/src/safety/limits.ts +98 -0
  79. package/src/safety/print-file.ts +354 -0
  80. package/src/safety/printer-state.ts +339 -0
  81. package/src/slicer/bambu-cli.ts +633 -0
  82. package/src/slicer/profile-flatten.ts +830 -0
  83. package/src/slicer/run-slicer.ts +126 -0
  84. package/src/slicer/slicer-error.ts +72 -0
  85. package/src/slicer/templates.ts +288 -0
  86. package/src/stl/stl-manipulator.ts +247 -275
package/README.md CHANGED
@@ -1,667 +1,262 @@
1
-
2
- ## Thank You To FULU And Louis Rossmann
3
-
4
- Thank you to the [FULU Foundation](https://github.com/FULU-Foundation/OrcaSlicer-bambulab) and [Louis Rossmann](https://www.youtube.com/@rossmanngroup) for standing up for consumer ownership, open source developers, repair rights, and users who should not have working hardware made worse by locked-down software. This MCP server treats the FULU OrcaSlicer-bambulab fork as a first-class Bambu project slicer target.
5
-
6
1
  # MCP 3D Printer Server
7
2
 
3
+ > **Thank you, [FULU Foundation](https://www.fulu.org/), [Louis Rossmann](https://www.youtube.com/@rossmanngroup), and the [OrcaSlicer-bambulab contributors](https://github.com/FULU-Foundation/OrcaSlicer-bambulab).** Thank you for standing up for consumer ownership, open-source developers, repair rights, and owners whose working hardware should not be made worse by locked-down software.
4
+ >
5
+ > This server treats the FULU OrcaSlicer-bambulab fork as a first-class slicer for Bambu Lab projects. See the [FULU guide](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/FULU.md) for setup and current status.
6
+
8
7
  [![npm version](https://img.shields.io/npm/v/mcp-3d-printer-server.svg)](https://www.npmjs.com/package/mcp-3d-printer-server)
9
- [![License: GPL-2.0](https://img.shields.io/badge/License-GPL%20v2-blue.svg)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
10
- [![TypeScript](https://img.shields.io/badge/TypeScript-4.9%2B-blue)](https://www.typescriptlang.org/)
11
- [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/DMontgomery40/mcp-3D-printer-server/graphs/commit-activity)
12
- [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://makeapullrequest.com)
13
- [![Node.js Version](https://img.shields.io/badge/node-%3E%3D%2018.0.0-green.svg)](https://nodejs.org/en/download/)
14
8
  [![Downloads](https://img.shields.io/npm/dm/mcp-3d-printer-server.svg)](https://www.npmjs.com/package/mcp-3d-printer-server)
15
- [![GitHub stars](https://img.shields.io/github/stars/dmontgomery40/mcp-3d-printer-server.svg?style=social&label=Star)](https://github.com/DMontgomery40/mcp-3D-printer-server)
9
+ [![License: GPL-2.0](https://img.shields.io/badge/License-GPL%20v2-blue.svg)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
10
+ [![Tested with Node.js 24](https://img.shields.io/badge/tested%20with-Node.js%2024-green.svg)](https://nodejs.org/en/download/)
11
+ [![GitHub stars](https://img.shields.io/github/stars/DMontgomery40/mcp-3D-printer-server.svg?style=social&label=Star)](https://github.com/DMontgomery40/mcp-3D-printer-server)
12
+
13
+ An MCP server that connects Claude, Codex, and other MCP clients to 3D printers running OctoPrint, Klipper (Moonraker), Duet, Repetier-Server, Bambu Lab, PrusaLink or Prusa Connect, and Creality. Your agent can check status, upload and start jobs, cancel prints, edit STL meshes, run your slicer, and hand models to Blender through an optional Blender MCP bridge.
14
+
15
+ **[Browse the documentation site](https://dmontgomery40.github.io/mcp-3D-printer-server/)** for searchable setup guides, per-printer credentials, slicing, and the full tool reference. It is generated from this README and the docs folder.
16
+
17
+ **Only print on Bambu Lab printers?** [bambu-printer-mcp](https://github.com/DMontgomery40/bambu-printer-mcp) is a Bambu-focused fork of this project with more Bambu features, including AMS inventory and matching, camera snapshots, X2D support, and a Claude Desktop extension.
18
+
19
+ Built with help from our [contributors](./CONTRIBUTORS.md). Thank you to everyone sharing fixes, careful bug reports, and real printer testing!
20
+
21
+ ---
16
22
 
23
+ ## Set up with your agent
17
24
 
18
- <a href="https://glama.ai/mcp/servers/7f6v2enbgk">
19
- <img width="380" height="200" src="https://glama.ai/mcp/servers/7f6v2enbgk/badge" alt="3D Printer Server MCP server" />
20
- </a>
25
+ Tell your agent which **printer system** you use (OctoPrint, Klipper, Bambu Lab, Prusa, and so on) and its **address**, if you know them, then copy and paste this:
26
+
27
+ ```text
28
+ Install mcp-3d-printer-server in the agent/harness I'm using now.
29
+
30
+ Read https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SETUP.md
31
+ for the current setup instructions and supported printer backends.
32
+
33
+ Detect my OS and harness, then use its native MCP configuration or installer.
34
+ Preserve my existing servers and settings. Prefer the published npm package
35
+ (npx -y mcp-3d-printer-server, stdio); use Node.js 24 if a runtime is needed.
36
+
37
+ Ask which printer system I use and set PRINTER_TYPE to match. Never guess it.
38
+ Then ask only for the values that backend needs:
39
+ - octoprint: PRINTER_HOST, PRINTER_PORT if not 80, API_KEY
40
+ - klipper (Moonraker): PRINTER_HOST, PRINTER_PORT (usually 7125),
41
+ API_KEY if Moonraker requires authentication
42
+ - duet: PRINTER_HOST, PRINTER_PORT if not 80
43
+ - repetier: PRINTER_HOST, PRINTER_PORT (usually 3344), API_KEY
44
+ - bambu: PRINTER_HOST, BAMBU_SERIAL, BAMBU_TOKEN (the LAN access code),
45
+ and BAMBU_MODEL
46
+ - prusa: PRINTER_HOST (PrusaLink address or connect.prusa3d.com), API_KEY
47
+ - creality: PRINTER_HOST, PRINTER_PORT if not 80, API_KEY (bearer token)
48
+ For Bambu Lab, confirm the exact printer model with me; never guess it, and
49
+ explain any LAN Only Mode or Developer Mode setting I need to enable.
50
+ Keep keys, tokens, and access codes in local/private configuration; do not
51
+ repeat them in chat.
52
+
53
+ Bambu Lab has the most hardware testing. The other backends use each
54
+ system's HTTP API and rely on community reports, so tell me plainly if a
55
+ backend does not respond as the guide describes.
56
+
57
+ Offer these optional extras, and set them up only if I choose them:
58
+ - Blender MCP for model edits: uvx mcp-for-blender (formerly blender-mcp,
59
+ which now installs it as a compatibility wrapper). Its Blender addon must be
60
+ installed, enabled, and connected inside Blender.
61
+ - A slicer for slice_stl: look for an installed PrusaSlicer, OrcaSlicer,
62
+ FULU OrcaSlicer-bambulab, Bambu Studio, or CuraEngine before suggesting
63
+ an install.
64
+ Configure executables in the server environment. Do not enable
65
+ MCP_ALLOW_EXECUTABLE_ARG. Leave print confirmation on: do not set
66
+ PRINT_REQUIRE_CONFIRMATION=0 or BAMBU_REQUIRE_CONFIRMATION=0 unless I ask
67
+ for a headless setup.
68
+
69
+ Verify that the MCP initializes, lists its tools, and reads printer status.
70
+ Do not start a print or change printer settings, including temperatures, as
71
+ a setup test. Tell me what worked and whether I need to restart or reload
72
+ the harness.
73
+ ```
74
+
75
+ [Setup reference](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SETUP.md) · [Printer backends](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SETUP.md#choose-your-printer-backend) · [Slicing guide](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SLICING.md) · [Blender MCP](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SETUP.md#blender-mcp-optional)
76
+
77
+ ## What to ask your agent
78
+
79
+ Ask for the result you want, not the steps. Current models plan across tools: they search the web, read photos, look up exact dimensions, edit models, slice, and print. Expect a question or two when a choice matters, such as which printer or filament to use, or whether to start the print.
80
+
81
+ This server provides the printer, slicing, and mesh tools. Web search, photos, and Blender edits come from your agent and its other connections, such as a [Blender MCP server](#blender-mcp). What your agent can read back depends on the printer system; see [printer backends](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SETUP.md#choose-your-printer-backend).
82
+
83
+ ### Start from anything
84
+
85
+ - **"Here's a phone case on MakerWorld. Make it fit my iPhone 17 Pro Max and print it."**\
86
+ Your agent reads Apple's dimensional drawings, refits the case in Blender around the new camera and buttons, checks the fit, exports a verified STL, slices it for your printer, and asks before it starts the print. [See it worked through](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/BLENDER.md#worked-example-refit-a-phone-case-for-a-new-phone).
87
+ - **"Can you print a replacement?"** *(with a photo of a snapped cabinet clip)*\
88
+ It asks for a measurement or two where the fit matters, models the part, and prints it on the printer you choose.
89
+ - **"Make this bracket 20% bigger and give it a thicker base."**\
90
+ It scales the STL, extends the base, and reports the new dimensions before it slices anything.
91
+
92
+ ### Check on any printer
93
+
94
+ - **"How far along is the Bambu print?"**\
95
+ It requests a fresh status report and gives you progress, the current layer, and time remaining.
96
+ - **"Is the Prusa done yet?"**\
97
+ It reads the printer's status through PrusaLink and reports its state and job progress.
98
+ - **"What are the bed and nozzle temperatures on the OctoPrint printer?"**\
99
+ It reads OctoPrint's printer state, including current and target temperatures.
100
+ - **"The first layer isn't sticking. Cancel it."**\
101
+ It sends the cancel command through that printer's backend, then checks the printer's status.
102
+
103
+ ### Slice and print
104
+
105
+ - **"Print this in PETG."** *(with an STL)*\
106
+ It slices with the PETG filament profile you've set up and checks the job's peak temperatures. The server then asks you to confirm before the print starts.
107
+ - **"Print the bracket I sliced last night on the Bambu."**\
108
+ It checks the plate's model, nozzle, bed type, materials, and temperatures against the live printer, then asks you to confirm before it uploads and starts the job.
109
+ - **"Send benchy.gcode to the Klipper printer, but don't start it yet."**\
110
+ It uploads the file through Moonraker so you can start it later.
21
111
 
22
112
  <details>
23
- <summary><strong>✨ What's New / Significant Updates (as of last session)</strong></summary>
113
+ <summary><strong>Start here</strong></summary>
114
+
115
+ ## Start here
24
116
 
25
- - **Dual Local Transports:** Added explicit `stdio` and `streamable-http` runtime modes with environment-based transport selection.
26
- - **FULU OrcaSlicer-bambulab Support:** Added `orcaslicer-bambulab` / `fulu_orca` slicer support for Bambu project 3MF export, and made it the default Bambu slicer target when no slicer is configured.
27
- - **Bambu Reliability Pass:** Fixed Bambu argument wiring bugs, added FTP-backed file operations, improved status refresh behavior, and implemented practical command paths for `startJob`, `setTemperature`, and `print_3mf`.
28
- - **Blender MCP:** Discover and call a standard Blender MCP server with `blender_mcp_status` and `blender_mcp_call`, or prepare and execute STL edits with verified output through `blender_mcp_edit_model`.
29
- - **Transport Behavior Tests:** Added real behavior tests for both transports (`initialize`, `tools/list`, success + failing `tools/call`, origin rejection).
30
- - **Docker Modernization:** Updated Docker build flow to work without BuildKit-specific features and verified streamable HTTP initialization in container smoke testing.
117
+ | I want to… | Read next |
118
+ |---|---|
119
+ | Connect this MCP to my agent | [Copy the setup request](#set-up-with-your-agent) |
120
+ | See what my agent can do with it | [What to ask your agent](#what-to-ask-your-agent) |
121
+ | Find the credentials for my printer | [Printer backend setup](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SETUP.md#printer-backend-setup) |
122
+ | Configure it by hand, with Docker, or over HTTP | [Installation and configuration reference](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SETUP.md) |
123
+ | Slice from my agent or troubleshoot slicing | [Slicing guide](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SLICING.md) |
124
+ | Use open-source slicing for a Bambu Lab printer | [FULU guide](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/FULU.md) |
125
+ | Model or refit a part in Blender | [Blender guide](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/BLENDER.md) and [Blender tools](#blender-mcp) |
126
+ | See release changes or contributor credit | [Changelog](./CHANGELOG.md), [releases](https://github.com/DMontgomery40/mcp-3D-printer-server/releases), and [contributors](./CONTRIBUTORS.md) |
31
127
 
32
128
  </details>
33
129
 
34
130
  <details>
35
- <summary><strong>🗺️ Roadmap / TODO</strong></summary>
36
-
37
- - **Achieve Feature Parity:** Bring functionality (status detail, file operations, direct printing where possible, preset handling) for OctoPrint, Klipper, Duet, Repetier, Prusa Connect, and Creality Cloud up to the level of robustness planned for the Bambu implementation.
38
- - **Implement Full Bambu MQTT Status:** Refactor `getStatus` for Bambu to subscribe to MQTT reports and maintain real-time state.
39
- - **Implement Robust AMS Mapping:** Replace placeholder logic; correctly parse and use AMS mapping from `.3mf` slicer config or user overrides for the MQTT print command.
40
- - **Implement `.3mf` Print Overrides:** Add logic to the `print_3mf` tool to handle user-provided overrides (e.g., calibration flags) and potentially common slicer settings if feasible via MQTT/G-code.
41
- - **Calculate MD5 Hash:** Add logic to calculate and include the MD5 hash of the `.3mf` file in the MQTT print command (optional but recommended by protocol).
42
- - **Refactor Bambu File Ops:** Investigate replacing `bambu-js` FTP operations (`getFiles`, `uploadFile`) with direct MQTT methods if possible/stable, or contribute FTPS support to `bambu-js`.
43
- - **Add Preset Discovery Logic:** Improve preset resource listing (currently lists based on potential filenames, could parse index files if they exist).
44
- - **Expand `.3mf` Support:** Add `.3mf` printing support for other printer types where applicable.
45
- - **Error Handling & Reporting:** Enhance MQTT error handling and reporting of print progress/completion.
46
- - **Testing:** Conduct thorough runtime testing of all new Bambu features.
131
+ <summary><strong>What's new</strong></summary>
132
+
133
+ ## What's new
134
+
135
+ See the [changelog](./CHANGELOG.md) for versioned changes. The next release brings the print safety gate to every printer backend: a human confirms every print start and positive heating command, and the server checks the exact G-code against hardware and material ceilings. It also adds Bambu-compatible CLI slicing with resolved machine presets and a template registry, `blender_mcp_export_stl` for verified STL export from Blender, and this documentation site. Release 1.2.9 fixes Bambu FTPS uploads that failed with "Premature close" ([#22](https://github.com/DMontgomery40/mcp-3D-printer-server/issues/22)), adds standard Blender MCP discovery, forwarding, and verified STL edits, requires the Bambu printer model for raw print starts, and isolates each server's scratch files. Separately, [#20](https://github.com/DMontgomery40/mcp-3D-printer-server/pull/20) and [#21](https://github.com/DMontgomery40/mcp-3D-printer-server/pull/21) made per-call executable selectors, such as a slicer path or bridge command, require an explicit opt-in.
47
136
 
48
137
  </details>
49
138
 
50
139
  <details>
51
- <summary>Click to expand Table of Contents</summary>
140
+ <summary><strong>Table of Contents</strong></summary>
52
141
 
53
142
  ## Table of Contents
54
143
 
144
+ - [Set up with your agent](#set-up-with-your-agent)
145
+ - [What to ask your agent](#what-to-ask-your-agent)
146
+ - [Start here](#start-here)
147
+ - [What's new](#whats-new)
55
148
  - [Description](#description)
149
+ - [FULU and open-source printing](#fulu-and-open-source-printing)
56
150
  - [Features](#features)
57
- - [Installation](#installation)
58
- - [Prerequisites](#prerequisites)
59
- - [Install from npm](#install-from-npm)
60
- - [Install from source](#install-from-source)
61
- - [Running with Docker](#running-with-docker)
62
- - [Using Slicers with Docker](#using-slicers-with-docker)
63
- - [Configuration](#configuration)
64
- - [Usage](#usage)
65
- - [Supported Printer Management Systems](#supported-printer-management-systems)
66
- - [OctoPrint](#octoprint)
67
- - [Klipper (via Moonraker)](#klipper-via-moonraker)
68
- - [Duet](#duet)
69
- - [Repetier](#repetier)
70
- - [Bambu Labs](#bambu-labs)
71
- - [Finding Your Bambu Printer's Serial Number and Access Token](#finding-your-bambu-printers-serial-number-and-access-token)
72
- - [Bambu Communication Notes (MQTT & FTP)](#bambu-communication-notes-mqtt--ftp)
73
- - [Prusa Connect](#prusa-connect)
74
- - [Setting up Prusa Connect](#setting-up-prusa-connect)
75
- - [Creality Cloud](#creality-cloud)
76
- - [Setting up Creality Cloud](#setting-up-creality-cloud)
77
151
  - [Available Tools](#available-tools)
78
152
  - [STL Manipulation Tools](#stl-manipulation-tools)
79
153
  - [Printer Control Tools](#printer-control-tools)
80
154
  - [Bambu-Specific Tools](#bambu-specific-tools)
155
+ - [Slicing Tools](#slicing-tools)
156
+ - [Advanced Tools](#advanced-tools)
81
157
  - [Available Resources](#available-resources)
82
- - [Printer Resources](#printer-resources)
83
- - [Bambu Preset Resources](#bambu-preset-resources)
84
- - [Example Commands for LLM](#example-commands-for-claude)
85
- - [Bambu Lab Printer Limitations](#bambu-lab-printer-limitations)
86
- - [Limitations and Considerations](#limitations-and-considerations)
87
- - [Memory Usage](#memory-usage)
88
- - [STL Manipulation Limitations](#stl-manipulation-limitations)
89
- - [Visualization Limitations](#visualization-limitations)
90
- - [Performance Considerations](#performance-considerations)
91
- - [Testing Recommendations](#testing-recommendations)
92
- - [Appendix: MCP Safety Notes](#appendix-mcp-safety-notes)
93
- - [Badges](#badges)
158
+ - [Printer Limitations](#printer-limitations)
159
+ - [General Limitations and Considerations](#general-limitations-and-considerations)
160
+ - [MCP Safety Notes](#mcp-safety-notes)
94
161
  - [License](#license)
162
+ - [Acknowledgements](#acknowledgements)
95
163
 
96
164
  </details>
97
165
 
98
- ## Description
99
-
100
- This is a server that allows MCP users to connect with the API endpoints of these 3D Printers:
101
-
102
- - OctoPrint
103
- - Klipper (Moonraker)
104
- - Duet
105
- - Repetier
106
- - Bambu Labs
107
- - Prusa Connect
108
- - Creality/Ender
109
-
110
- This server is a Model Context Protocol (MCP) server for connecting Claude with 3D printer management systems. It allows MCP to interact with 3D printers through the APIs of various printer management systems such as OctoPrint, Klipper (via Moonraker), Duet, Repetier, and Bambu Labs printers.
111
-
112
- **Note on Resource Usage**: This MCP server includes advanced 3D model manipulation features that can be memory-intensive when working with large STL files. Please see the "Limitations and Considerations" section for important information about memory usage and performance.
113
-
114
- ## Features
115
-
116
- - Get printer status (temperatures, print progress, etc.)
117
- - List files on the printer
118
- - Upload G-code files to the printer
119
- - Start, cancel, and monitor print jobs
120
- - Set printer temperatures
121
- - Advanced STL file manipulation:
122
- - Extend base for better adhesion
123
- - Scale models uniformly or along specific axes
124
- - Rotate models around any axis
125
- - Translate (move) models
126
- - Modify specific sections of STL files (top, bottom, center, or custom)
127
- - Comprehensive STL analysis with detailed model information
128
- - Generate multi-angle SVG visualizations of STL files
129
- - Real-time progress reporting for long operations
130
- - Error handling with detailed diagnostics
131
- - Slice STL files to generate G-code
132
- - Confirm temperature settings in G-code files
133
- - Complete end-to-end workflow from STL modification to printing
134
- - Print `.3mf` files directly on Bambu Lab printers (via MQTT command)
135
- - Slice Bambu projects with FULU OrcaSlicer-bambulab (`SLICER_TYPE=orcaslicer-bambulab`) and auto-slice unsliced 3MF files before Bambu printing when a project slicer is configured
136
- - Inspect and probe the FULU BambuNetwork runtime (`check_fulu_orca_setup`) and call safe-by-default FULU bridge RPC methods for diagnostics and development (`fulu_bambu_network_rpc`)
137
- - Read Bambu Studio preset files (printer, filament, process) as resources
138
-
139
- ## Installation
140
-
141
- ### Prerequisites
142
-
143
- - Node.js 18 or higher
144
- - npm or yarn
145
-
146
- ### Install from npm
147
-
148
- ```bash
149
- npm install -g mcp-3d-printer-server
150
- ```
151
-
152
- ### Install from source
153
-
154
- ```bash
155
- git clone https://github.com/dmontgomery40/mcp-3d-printer-server.git
156
- cd mcp-3d-printer-server
157
- npm ci
158
- npm run build
159
- npm link # Makes the command available globally
160
- ```
161
-
162
- ### Running with Docker
163
-
164
- You can also run the server using Docker and Docker Compose for a containerized environment.
165
-
166
- 1. Ensure you have Docker and Docker Compose installed.
167
- 2. Copy `.env.example` to `.env` and configure your settings.
168
- 3. Build and run the container:
169
- ```bash
170
- docker-compose up --build -d
171
- ```
172
-
173
- #### Using Slicers with Docker
174
-
175
- Please note that the default Docker setup **cannot directly use a slicer installed on your host machine**. Mounting the slicer executable directly from the host into the container is unreliable due to operating system and library differences between your host and the container.
176
-
177
- The recommended approach is to **install your preferred slicer *inside* the Docker image**. This makes the container self-sufficient.
178
-
179
- To do this, you will need to modify the `Dockerfile`. Here's a conceptual example of how you might add PrusaSlicer, OrcaSlicer, or the FULU OrcaSlicer-bambulab build (specific commands may vary depending on the slicer, its dependencies, and current Alpine packages):
180
-
181
- ```dockerfile
182
- # ... other Dockerfile commands ...
183
-
184
- # Example: Install PrusaSlicer, OrcaSlicer, or FULU OrcaSlicer-bambulab (adjust command as needed)
185
- # Check Alpine package repositories first (e.g., apk add prusaslicer or apk add orcaslicer)
186
- # If not available, download and install manually (e.g., AppImage):
187
- # RUN apk add --no-cache fuse # FUSE might be needed for AppImages
188
- # RUN wget https://example.com/path/to/OrcaSlicer_Linux_Vxxxx.AppImage -O /usr/local/bin/orcaslicer && \
189
- # chmod +x /usr/local/bin/orcaslicer
190
-
191
- # Set the SLICER_PATH env var accordingly in docker-compose.yml or when running
192
- # Example for installed executable:
193
- ENV SLICER_PATH=/usr/local/bin/orcaslicer
194
-
195
- # ... rest of Dockerfile ...
196
- ```
197
-
198
- After modifying the `Dockerfile`, rebuild your image (`docker-compose build`). You'll also need to ensure the `SLICER_PATH` environment variable in your `.env` file or `docker-compose.yml` points to the correct path *inside the container* (e.g., `/usr/local/bin/orcaslicer`). For the FULU Bambu-enabled fork, set `SLICER_TYPE=orcaslicer-bambulab`.
199
-
200
- Apologies for not including a specific slicer out-of-the-box, but given the wide variety of slicers (PrusaSlicer, OrcaSlicer, Cura, etc.) and configurations available, pre-installing one would unnecessarily bloat the image for many users. If a particular slicer becomes a very common request, I can certainly look into adding official support for it in a future version.
201
-
202
- ## Configuration
203
-
204
- Create a `.env` file in the directory where you'll run the server or set environment variables:
205
-
206
- ```env
207
- # Required for authentication with your printer management system
208
- API_KEY=your_api_key_here
209
-
210
- # Default printer connection settings
211
- PRINTER_HOST=localhost
212
- PRINTER_PORT=80 # Port for non-Bambu HTTP APIs
213
- PRINTER_TYPE=octoprint # Options: octoprint, klipper, duet, repetier, bambu, prusa, creality
214
-
215
- # Optional: Directory for temporary files
216
- TEMP_DIR=/path/to/temp/dir
217
-
218
- # Bambu Labs specific configuration
219
- BAMBU_SERIAL=your_printer_serial # REQUIRED for Bambu
220
- BAMBU_TOKEN=your_access_token # REQUIRED for Bambu
221
- BAMBU_MODEL=p1s # REQUIRED for Bambu: p1s, p1p, x1c, x1e, a1, a1mini, h2d
222
- BED_TYPE=textured_plate # Bed plate: textured_plate, cool_plate, engineering_plate, hot_plate
223
- NOZZLE_DIAMETER=0.4 # Nozzle diameter in mm (default: 0.4)
224
-
225
- # Slicer configuration (for slice_stl tool)
226
- # For Bambu projects, the default is orcaslicer-bambulab unless SLICER_TYPE is set.
227
- SLICER_TYPE=orcaslicer-bambulab # Options: prusaslicer, cura, slic3r, orcaslicer, orcaslicer-bambulab, bambustudio
228
- SLICER_PATH=/path/to/slicer/executable
229
- SLICER_PROFILE=/path/to/slicer/profile
230
-
231
- # Optional aliases for FULU OrcaSlicer-bambulab when SLICER_PATH is not set
232
- FULU_ORCA_PATH=/path/to/FULU/OrcaSlicer
233
- ORCASLICER_BAMBULAB_PATH=/path/to/FULU/OrcaSlicer
234
- FULU_ORCA_PLUGIN_DIR=/path/to/FULU/OrcaSlicer.app/Contents/MacOS
235
- ORCASLICER_BAMBULAB_PLUGIN_DIR=/path/to/FULU/OrcaSlicer.app/Contents/MacOS
236
-
237
- # Optional FULU BambuNetwork bridge runtime
238
- # macOS default runtime dir:
239
- # /Users/you/Library/Application Support/OrcaSlicer/macos-bridge/runtime
240
- PJARCZAK_MAC_RUNTIME_DIR=
241
- FULU_BAMBU_BRIDGE_COMMAND=
242
-
243
- # Optional: Path to Bambu Studio user config dir (for loading presets)
244
- # Example macOS: /Users/your_user/Library/Application Support/BambuStudio/user/YOUR_USER_ID
245
- # Example Windows: C:\Users\your_user\AppData\Roaming\BambuStudio\user\YOUR_USER_ID
246
- # Example Linux: /home/your_user/.config/BambuStudio/user/YOUR_USER_ID
247
- BAMBU_STUDIO_CONFIG_PATH=
248
-
249
- # MCP transport configuration
250
- MCP_TRANSPORT=stdio # Options: stdio, streamable-http
251
- MCP_HTTP_HOST=127.0.0.1
252
- MCP_HTTP_PORT=3000
253
- MCP_HTTP_PATH=/mcp
254
- MCP_HTTP_STATEFUL=true
255
- MCP_HTTP_JSON_RESPONSE=true
256
- MCP_HTTP_ALLOWED_ORIGINS=http://localhost
257
-
258
- # Optional bridge command for blender_mcp_edit_model execute=true mode
259
- BLENDER_MCP_BRIDGE_COMMAND=
260
-
261
- # Accept per-call executable selectors instead of reading commands and paths
262
- # from server environment configuration. Off by default: slicer_path,
263
- # bridge_command, and active-probe path overrides can select which local
264
- # executable launches. MCP_ALLOW_BRIDGE_COMMAND_ARG remains a legacy alias for
265
- # bridge commands and bridge-derived probe paths only.
266
- MCP_ALLOW_EXECUTABLE_ARG=false
267
- ```
268
-
269
- ## Usage
270
-
271
- Add this server to your MCP client's config (Claude Desktop, Claude Code, Cursor, Codex, or any MCP-compatible client). Most JSON-based clients use an `mcpServers` entry with the command and env vars:
272
-
273
- ```json
274
- {
275
- "mcpServers": {
276
- "3dprint": {
277
- "command": "npx",
278
- "args": ["-y", "mcp-3d-printer-server"],
279
- "env": {
280
- "PRINTER_HOST": "your_printer_ip",
281
- "PRINTER_TYPE": "bambu",
282
- "BAMBU_SERIAL": "your_printer_serial",
283
- "BAMBU_TOKEN": "your_access_token",
284
- "BAMBU_MODEL": "p1s",
285
- "SLICER_TYPE": "orcaslicer-bambulab",
286
- "SLICER_PATH": "/path/to/FULU/OrcaSlicer",
287
- "FULU_ORCA_PLUGIN_DIR": "/Applications/OrcaSlicer.app/Contents/MacOS"
288
- }
289
- }
290
- }
291
- }
292
- ```
293
-
294
- For non-Bambu printers, replace the Bambu-specific env vars with `API_KEY` and the appropriate `PRINTER_TYPE` (see [Supported Printer Management Systems](#supported-printer-management-systems)).
295
-
296
- ### FULU OrcaSlicer-bambulab
297
-
298
- Use [`FULU-Foundation/OrcaSlicer-bambulab`](https://github.com/FULU-Foundation/OrcaSlicer-bambulab) as the first-class Bambu project slicer by setting:
299
-
300
- ```env
301
- PRINTER_TYPE=bambu
302
- SLICER_TYPE=orcaslicer-bambulab
303
- SLICER_PATH=/path/to/FULU/OrcaSlicer
304
- FULU_ORCA_PLUGIN_DIR=/path/to/FULU/runtime/payload
305
- BAMBU_MODEL=p1s
306
- ```
307
-
308
- Accepted aliases include `fulu_orca`, `fulu-orca`, `orca-studio`, and `orca_bambulab`. For Bambu printers, this is the default slicer family when `SLICER_TYPE` is not set.
309
-
310
- What the integration does:
311
-
312
- - `slice_stl` uses the FULU/Orca project CLI shape (`--slice 0 --export-3mf`) to produce a sliced Bambu-compatible 3MF.
313
- - `print_3mf` can auto-slice an unsliced 3MF through FULU OrcaSlicer-bambulab, then upload and start the sliced project through this server's Bambu print path.
314
- - `check_fulu_orca_setup` verifies the FULU executable, platform runtime payload, setup commands, and optional BambuNetwork bridge handshake.
315
- - `fulu_bambu_network_rpc` can call the FULU bridge protocol for diagnostics and development. Read-only methods are allowed by default; mutating methods require `allow_mutating_method=true`; FULU print methods still require `bambu_model`.
316
-
317
- What stays deliberately explicit:
318
-
319
- - This MCP server's existing Bambu print path is local MQTT plus FTPS and still needs `BAMBU_SERIAL`, `BAMBU_TOKEN`, and `PRINTER_HOST`.
320
- - FULU's BambuNetwork bridge is a separate runtime. The MCP can inspect it, probe it, and issue guarded bridge RPC calls, but it will not silently switch a print from local LAN control to cloud/BambuNetwork control.
321
- - `BAMBU_MODEL` remains mandatory for Bambu print operations because wrong machine presets can produce dangerous G-code.
322
-
323
- #### Current Bench Test Status
324
-
325
- This integration has been tested against the current FULU macOS release artifacts and a local Benchy smoke test. The MCP-side bug found during that bench was real: Bambu-family project slicers must use Orca/Bambu preset JSON with `--load-settings`, not the invalid `--load-machine` flag. That is fixed here.
326
-
327
- The old Bambu Studio fallback still works. Set:
328
-
329
- ```env
330
- SLICER_TYPE=bambustudio
331
- SLICER_PATH=/Applications/BambuStudio.app/Contents/MacOS/BambuStudio
332
- ```
333
-
334
- With that fallback, the same Benchy 3MF sliced successfully through Bambu Studio's CLI into a Bambu-compatible project 3MF. This is the known-good path while FULU platform packaging settles.
335
-
336
- macOS is not proven green yet. On this Mac, the FULU arm64 and x86_64 macOS release bundles hit the same CLI slice problem during Benchy testing: one path crashed with `SIGSEGV` inside OrcaSlicer CLI processing, and repeated attempts left uninterruptible macOS `UE` processes that ignored `SIGKILL`. The MCP now avoids pretending that is solved. `check_fulu_orca_setup` can inspect the bundle and bridge payload, but macOS users should treat FULU CLI slicing as active feedback territory until FULU ships a stable macOS CLI/runtime combination.
337
-
338
- We need Windows testers. The WSL 2 setup path, payload checks, and bridge command shape are represented in this MCP, but the full Windows path still needs real reports from people who can validate `install_runtime.ps1`, `verify_runtime.ps1`, bridge probing, CLI slicing, and a known-safe print workflow on their own machine.
339
-
340
- We will keep iterating with user and contributor feedback. Please report the OS, CPU architecture, FULU release asset name, `check_fulu_orca_setup` result, slicer command stderr, and whether the Bambu Studio fallback works on the same model.
341
-
342
- #### FULU Runtime Setup By Platform
343
-
344
- The FULU README currently says macOS is work in progress, but the source tree already ships macOS Lima runtime scripts and Windows WSL runtime scripts. This MCP knows those file layouts and returns the exact commands through `check_fulu_orca_setup`.
345
-
346
- Windows:
347
-
348
- ```bat
349
- dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
350
- dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
351
- ```
352
-
353
- Restart Windows, then run the FULU package scripts from the directory that contains `install_runtime.ps1`:
354
-
355
- ```powershell
356
- powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\install_runtime.ps1 -PackageDir . -PluginDir .
357
- powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\verify_runtime.ps1 -PackageDir . -PluginDir .
358
- ```
359
-
360
- Linux:
361
-
362
- Install the FULU OrcaSlicer-bambulab build normally, set `SLICER_TYPE=orcaslicer-bambulab`, and point `SLICER_PATH` at the executable. If you want bridge-level diagnostics, set `FULU_BAMBU_BRIDGE_COMMAND` to the packaged `pjarczak_bambu_linux_host`.
363
-
364
- macOS:
365
-
366
- Set the app payload directory, then run the scripts that FULU copies into the app bundle:
367
-
368
- ```bash
369
- export FULU_ORCA_PLUGIN_DIR="/Applications/OrcaSlicer.app/Contents/MacOS"
370
- bash "$FULU_ORCA_PLUGIN_DIR/install_runtime_macos.sh" -PackageDir "$FULU_ORCA_PLUGIN_DIR" -PluginDir "$FULU_ORCA_PLUGIN_DIR"
371
- bash "$FULU_ORCA_PLUGIN_DIR/verify_runtime_macos.sh" -PackageDir "$FULU_ORCA_PLUGIN_DIR" -PluginDir "$FULU_ORCA_PLUGIN_DIR"
372
- ```
373
-
374
- The default installed runtime is:
375
-
376
- ```text
377
- ~/Library/Application Support/OrcaSlicer/macos-bridge/runtime
378
- ```
379
-
380
- The bridge command shape is:
381
-
382
- ```bash
383
- "/Applications/OrcaSlicer.app/Contents/MacOS/pjarczak-bambu-linux-host-wrapper" "$HOME/Library/Application Support/OrcaSlicer/macos-bridge/runtime/pjarczak_bambu_linux_host"
384
- ```
385
-
386
- If your app is named `Orca Studio.app` or lives somewhere else, pass its real `Contents/MacOS` path as `plugin_dir` or `FULU_ORCA_PLUGIN_DIR`.
387
-
388
- #### Check The Setup Through MCP
389
-
390
- Ask your MCP client to call `check_fulu_orca_setup`, or call it from an agent with arguments like:
391
-
392
- ```json
393
- {
394
- "platform": "darwin",
395
- "slicer_path": "/Applications/OrcaSlicer.app/Contents/MacOS/OrcaSlicer",
396
- "plugin_dir": "/Applications/OrcaSlicer.app/Contents/MacOS",
397
- "run_bridge_probe": true,
398
- "bridge_command": "\"/Applications/OrcaSlicer.app/Contents/MacOS/pjarczak-bambu-linux-host-wrapper\" \"$HOME/Library/Application Support/OrcaSlicer/macos-bridge/runtime/pjarczak_bambu_linux_host\""
399
- }
400
- ```
401
-
402
- The result reports missing payload files, install/verify commands, the MCP env values to use, and bridge handshake/capability/runtime info when probing is enabled.
403
-
404
- > **Per-call executable selectors require `MCP_ALLOW_EXECUTABLE_ARG=1`.**
405
- > By default the bridge command and its derived paths are read from server environment
406
- > configuration. Passing `bridge_command`, or passing `slicer_path`, `plugin_dir`, or
407
- > `runtime_dir` with `run_bridge_probe=true`, returns an error naming the opt-in flag.
408
- > Non-executing setup inspection can still use the path arguments without the flag. These values
409
- > select which local executable this server launches, so accepting them for a probe lets whatever
410
- > is steering the model — a downloaded model's description, a README in an archive, 3MF metadata —
411
- > choose that program. The same gate applies to `slicer_path` on slicing tools. Set the
412
- > flag only for trusted iterative diagnostics; leave it off for normal use.
413
-
414
- #### FULU Bridge RPC
415
-
416
- `fulu_bambu_network_rpc` speaks the FULU bridge frame protocol from the MCP side. The protocol is little-endian binary frames with JSON bodies, using methods such as `bridge.handshake`, `bridge.capabilities`, `bridge.runtime_info`, and `net.get_user_print_info`.
417
-
418
- Safe diagnostic example:
419
-
420
- ```json
421
- {
422
- "method": "bridge.runtime_info",
423
- "bridge_command": "\"/Applications/OrcaSlicer.app/Contents/MacOS/pjarczak-bambu-linux-host-wrapper\" \"$HOME/Library/Application Support/OrcaSlicer/macos-bridge/runtime/pjarczak_bambu_linux_host\""
424
- }
425
- ```
426
-
427
- Mutating methods are intentionally gated:
428
-
429
- ```json
430
- {
431
- "method": "net.start_print",
432
- "allow_mutating_method": true,
433
- "bambu_model": "p1s",
434
- "payload": {
435
- "client_job_id": 1,
436
- "params": {
437
- "dev_id": "YOUR_PRINTER_ID"
438
- }
439
- }
440
- }
441
- ```
442
-
443
- That second example is intentionally incomplete because real BambuNetwork print calls need the full FULU/Bambu print parameter payload. The important part is that the MCP exposes the bridge without pretending a cloud print can be safely inferred from a local filename.
444
-
445
- Where this config lives depends on your client and OS:
446
-
447
- | Client / scope | macOS / Linux location | Windows location |
448
- |----------------|------------------------|------------------|
449
- | Claude Desktop (macOS / Windows) | `~/Library/Application Support/Claude/claude_desktop_config.json` | `%APPDATA%\Claude\claude_desktop_config.json` |
450
- | Claude Desktop (Linux) | Not officially supported for local MCP yet; Claude Desktop docs still list Linux support as coming soon. | N/A |
451
- | Claude Code (project-shared MCP) | `.mcp.json` in the project root | `.mcp.json` in the project root |
452
- | Claude Code (user/local MCP) | `~/.claude.json` | `%USERPROFILE%\.claude.json` |
453
- | Claude Code settings (not MCP server definitions) | `~/.claude/settings.json` | `%USERPROFILE%\.claude\settings.json` |
454
- | Cursor (project) | `.cursor/mcp.json` in the project root | `.cursor\mcp.json` in the project root |
455
- | Cursor (global) | `~/.cursor/mcp.json` | `%USERPROFILE%\.cursor\mcp.json` |
456
- | Codex (user; CLI, IDE extension, app) | `~/.codex/config.toml` | `%USERPROFILE%\.codex\config.toml` |
457
- | Codex (project, trusted projects only) | `.codex/config.toml` in the project root | `.codex\config.toml` in the project root |
458
-
459
- Codex uses TOML instead of the JSON shape above. You can manage MCP servers with `codex mcp`, or edit `config.toml` directly with a `[mcp_servers.<name>]` entry.
460
-
461
- Restart your client after editing the config. For Codex, run `/mcp` or `codex mcp list` to confirm the server loaded.
462
-
463
- ### Recommended: use with codemode-mcp
464
-
465
- For any MCP server with a large tool surface, wrapping it behind [codemode-mcp](https://github.com/jx-codes/codemode-mcp) dramatically reduces token usage. Instead of exposing every tool definition to the model, codemode lets the agent write code against a two-tool interface (`search()` and `execute()`), loading only the tools it needs on demand.
466
-
467
- Anthropic and Cloudflare independently demonstrated this pattern reduces MCP token costs by up to 98%:
468
-
469
- - [Code execution with MCP](https://www.anthropic.com/engineering/code-execution-with-mcp) (Anthropic)
470
- - [Code Mode: give agents an entire API in 1,000 tokens](https://blog.cloudflare.com/code-mode-mcp/) (Cloudflare)
471
-
472
- This applies to all MCP servers, not just this one.
473
-
474
- ### Blender MCP
475
-
476
- Set `BLENDER_MCP_COMMAND` to the executable for your standard stdio Blender
477
- MCP server (for example the full path to `uvx`) and `BLENDER_MCP_ARGS` to a
478
- JSON argument array such as `["blender-mcp"]`. Install and enable the matching
479
- addon in Blender, then start its connection. Both processes must be able to
480
- access the same local files. Printer tools work without Blender configured.
481
-
482
- 1. Call `blender_mcp_status` with `{"connect":true}` to initialize the server
483
- and inspect its advertised tools and input schemas.
484
- 2. Call `blender_mcp_call` with a discovered `tool_name` and `arguments`.
485
- For example, use `get_scene_info` with `{"user_prompt":"Inspect my scene"}`
486
- when advertised. Preserve the user's request in `user_prompt` when the
487
- remote schema asks for it. MCP images, errors, and metadata are preserved.
488
- 3. Use `blender_mcp_edit_model` for an STL import/edit/export operation:
489
-
490
- ```json
491
- {
492
- "stl_path": "/path/to/model.stl",
493
- "output_path": "/path/to/model-edited.stl",
494
- "operations": ["decimate:0.5"],
495
- "user_prompt": "Reduce the triangle count for printing",
496
- "execute": false
497
- }
498
- ```
499
-
500
- The default preview validates inputs and returns the generated Python without
501
- launching Blender. Omitting `output_path` selects a unique `model-edited-<id>.stl`
502
- beside the input; reuse the returned path when executing a previewed plan. Set `execute` to `true` to apply the edit. Supported operations
503
- are `decimate:<ratio>` (greater than zero through one), `remesh:<positive voxel
504
- size in STL units>`, and `boolean_union:<STL path>`. The helper requires Object
505
- Mode, preserves existing scene objects and selection, and publishes a new STL
506
- only after checking a matching export receipt and a finite triangle mesh.
507
- Binary STLs are validated in small chunks and may be up to 256 MiB. ASCII STLs
508
- are limited to 4 MiB; export larger meshes as binary STL.
509
- Existing input and output files are never overwritten. Inspect the result
510
- before slicing: valid STL geometry does not guarantee printability.
511
-
512
- `BLENDER_MCP_TIMEOUT_MS` defaults to 120000 (range 100–300000). Requests have
513
- bounded connection/discovery/call deadlines, close their child connection,
514
- and never automatically replay interrupted edits. After an interruption,
515
- inspect Blender before retrying because an edit may already have started.
516
- The edit deadline also covers input and output validation; cancellation stops
517
- validation between file reads, including scans of Boolean operands.
518
- MCP connection success alone does not prove the Blender addon is connected.
519
-
520
- Legacy `BLENDER_MCP_BRIDGE_COMMAND` shell commands remain supported. They
521
- receive JSON on stdin containing `modelPath`, `operations`, and `source`, plus
522
- `stlPath` and the same JSON in `MCP_BLENDER_PAYLOAD` for fork compatibility.
523
- Their result reports `output_verified: false`. Per-call executable overrides
524
- still require `MCP_ALLOW_EXECUTABLE_ARG=1` (or the legacy bridge-only opt-in).
525
- The standard MCP executable and its arguments are always server configuration.
526
-
527
- ## Supported Printer Management Systems
528
-
529
- ### OctoPrint
530
-
531
- OctoPrint is a popular web interface for 3D printers. It provides a REST API for controlling the printer.
532
-
533
- - Default port: 80 (http) or 443 (https)
534
- - Authentication: API key required
535
-
536
- ### Klipper (via Moonraker)
537
-
538
- Klipper is a firmware for 3D printers that works with the Moonraker API server.
539
-
540
- - Default port: 7125
541
- - Authentication: Depends on your Moonraker configuration
542
-
543
- ### Duet
544
-
545
- Duet is a control board for 3D printers with its own web interface (DuetWebControl).
546
-
547
- - Default port: 80 (http) or 443 (https)
548
- - Authentication: Depends on your Duet configuration
549
-
550
- ### Repetier
551
-
552
- Repetier-Server is a host software for 3D printers.
553
-
554
- - Default port: 3344
555
- - Authentication: API key required
556
-
557
- ### Bambu Labs
558
-
559
- Bambu Lab printers use MQTT for status and control and FTP for file operations.
560
-
561
- - Authentication: Serial number and access token required (set `BAMBU_SERIAL` and `BAMBU_TOKEN`)
562
- - Printer model: **Required** (set `BAMBU_MODEL`). Valid values: `p1s`, `p1p`, `x1c`, `x1e`, `a1`, `a1mini`, `h2d`. The guard applies to `start_print` and `upload_gcode` with `print=true` as well as the slicing/3MF paths. Pre-sliced files must already match the physical printer; the model setting does not inspect or convert their G-code.
563
- - Requirements: Printer must be on the same network with Developer Mode and LAN Only Mode enabled
564
- - Compatible with: X1C, X1E, P1S, P1P, A1, A1 Mini, H2D
565
-
566
- #### Finding Your Bambu Printer's Serial Number and Access Token
166
+ <details>
167
+ <summary><strong>Description</strong></summary>
567
168
 
568
- To connect to your Bambu Lab printer, you need two things:
169
+ ## Description
569
170
 
570
- 1. **Printer Serial Number**:
571
- - Look on the back or bottom of your printer for a sticker with a serial number (typically starts with "01P" or "01A" followed by numbers/letters)
572
- - Alternatively, open Bambu Studio, connect to your printer, go to Device > Device Management, and view your printer's information
171
+ `mcp-3d-printer-server` is a Model Context Protocol server for 3D printers. It gives an agent printer control (status, files, upload, start, cancel, and temperatures), STL mesh tools, slicer automation, Bambu Lab project printing, and an optional bridge to a Blender MCP server. One `PRINTER_TYPE` selects the default backend, and every printer tool accepts a per-call `type` and `host`, so one server can reach more than one printer.
573
172
 
574
- 2. **Access Token**:
575
- - The access token is a security code needed to connect directly to your printer
576
- - For P1 Series printers: Go to the touchscreen, select Settings > Network > LAN Mode, and you'll see the access code
577
- - For X1 Series printers: Go to the touchscreen, select Settings > Network > LAN Mode, and enable LAN Mode to see the access code
578
- - For A1 Mini: Use the Bambu Handy app to connect to your printer, then go to Settings > Network > LAN Mode
173
+ | Backend | `PRINTER_TYPE` | Testing evidence |
174
+ |---|---|---|
175
+ | Bambu Lab | `bambu` | Most tested, including maintainer hardware testing shared with the Bambu-only fork |
176
+ | OctoPrint | `octoprint` | Community-reported |
177
+ | Klipper (Moonraker) | `klipper` | Community-reported, including a Creality K1 Max through Moonraker |
178
+ | PrusaLink and Prusa Connect | `prusa` | Community-reported |
179
+ | Duet | `duet` | Implemented; no hardware reports yet |
180
+ | Repetier-Server | `repetier` | Implemented; no hardware reports yet |
181
+ | Creality | `creality` | Implemented; no hardware reports yet |
579
182
 
580
- **Note**: If your printer is not on the same local network or you can't find the access token, you may need to update your printer's firmware to the latest version to enable LAN Mode.
183
+ What each backend reads and sends differs. See [printer backend setup](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SETUP.md#printer-backend-setup) for the exact API calls, credentials, and linked reports.
581
184
 
582
- #### Bambu Communication Notes (MQTT & FTP)
185
+ **Note on resource usage.** The STL tools load the entire mesh into memory. Large or complex files (over about 10 MB) can use a lot of memory. See [General Limitations and Considerations](#general-limitations-and-considerations).
583
186
 
584
- - **MQTT:** This server uses the local MQTT protocol (port 8883, TLS) based on community findings (e.g., [OpenBambuAPI](https://github.com/Doridian/OpenBambuAPI)) to send commands like starting prints and cancelling jobs.
585
- - **FTP:** File listing and uploading currently rely on the FTP server running on the printer (via the `bambu-js` library helper). **Note:** This FTP connection might be **unsecured (plain FTP)** based on current library limitations. Use with awareness of your network security.
187
+ </details>
586
188
 
587
- ### Prusa Connect
189
+ <details>
190
+ <summary><strong>FULU and open-source printing</strong></summary>
588
191
 
589
- Prusa Connect is Prusa's own cloud-based solution for managing their printers.
192
+ ## FULU and open-source printing
590
193
 
591
- - Default port: 80 (http) or 443 (https)
592
- - Authentication: API key required
593
- - Compatible with: Prusa MK4, Prusa Mini, Prusa XL, and other Prusa printers with Prusa Connect
194
+ [FULU OrcaSlicer-bambulab](https://github.com/FULU-Foundation/OrcaSlicer-bambulab) is a first-class slicer target for Bambu Lab projects (`SLICER_TYPE=orcaslicer-bambulab`; aliases include `fulu-orca` and `orca-studio`), and the default slicer when `PRINTER_TYPE=bambu` and no slicer is configured. `slice_stl` and `print_3mf` auto-slicing use its project command line, and `check_fulu_orca_setup` inspects the install and runtime payload.
594
195
 
595
- For Prusa Connect cloud, use `connect.prusa3d.com` with `PRINTER_PORT=443`, or include the scheme directly with `PRINTER_HOST=https://connect.prusa3d.com`. The server normalizes both forms to HTTPS. Local PrusaLink hosts continue to use HTTP unless you provide an `https://` host or port `443`.
196
+ The optional FULU **BambuNetwork bridge** is a separate runtime. `fulu_bambu_network_rpc` can probe it and send guarded RPC calls, but the server never switches a print from its local MQTT and FTPS path to BambuNetwork or the cloud on its own.
596
197
 
597
- #### Setting up Prusa Connect
198
+ **[Follow the FULU guide](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/FULU.md)** for platform runtime setup, bridge probes, and the current macOS and Windows testing status.
598
199
 
599
- 1. Make sure your Prusa printer is updated to the latest firmware
600
- 2. Connect your printer to your Wi-Fi network
601
- 3. Create a Prusa Connect account and register your printer
602
- 4. Generate an API key from the Prusa Connect web interface under Settings > API Access
200
+ </details>
603
201
 
604
- ### Creality Cloud
202
+ <details>
203
+ <summary><strong>Features</strong></summary>
605
204
 
606
- Creality Cloud is Creality's management system for their printers.
205
+ ## Features
607
206
 
608
- - Default port: 80 (http) or 443 (https)
609
- - Authentication: Bearer token required
610
- - Compatible with: Ender series, CR series, and other Creality printers with network capabilities
207
+ - Seven printer backends, selected with `PRINTER_TYPE`: OctoPrint, Klipper (Moonraker), Duet, Repetier-Server, Bambu Lab, PrusaLink or Prusa Connect, and Creality
208
+ - Per-call `type`, `host`, `port`, and `api_key` arguments for working with more than one printer
209
+ - Printer status, file listing, G-code upload from inline content or a local path, starting a stored file, cancelling a job, and setting bed or nozzle temperatures
210
+ - STL tools: inspect dimensions, scale, rotate, translate, extend the base, merge vertices, center, lay flat, transform one section of a model, and render multi-angle SVG previews
211
+ - A print and heating safety gate on every backend: the exact G-code is inspected, every heater target is checked against hardware and material ceilings, the printer's state is checked, and a human confirms through MCP elicitation. Heater-off and cancel are never gated
212
+ - Slicing through PrusaSlicer, Slic3r, OrcaSlicer, CuraEngine, FULU OrcaSlicer-bambulab, or Bambu Studio command lines, with G-code peak-temperature checks and a one-call process-and-print pipeline
213
+ - Bambu-compatible CLI slicing with the exact model and nozzle machine preset resolved from your slicer installation, filament slots and colours, placement options, and a local template registry
214
+ - Bambu Lab project printing: upload a sliced `.3mf` over FTPS and start it over MQTT with the plate's G-code path, MD5, AMS mapping, and calibration flags, after checking the plate against a fresh printer report; auto-slice unsliced projects with FULU OrcaSlicer-bambulab or Bambu Studio
215
+ - Required Bambu printer model for print operations, asked for through MCP elicitation when missing
216
+ - FULU OrcaSlicer-bambulab setup inspection and diagnostic BambuNetwork bridge RPC, with raw print methods refused
217
+ - Optional Blender MCP bridge: discover a standard Blender MCP server's tools, forward calls, export named scene objects to a verified STL, and run verified STL edits
218
+ - Slicer, bridge, and Blender executables come from server configuration unless you explicitly opt in to per-call selectors
219
+ - MCP resources for printer status, files, and file details
220
+ - Transports: stdio (default) and streamable HTTP, plus a Docker image
611
221
 
612
- #### Setting up Creality Cloud
222
+ </details>
613
223
 
614
- 1. Install the Creality Cloud app on your mobile device
615
- 2. Create an account and add your printer
616
- 3. Enable local network access for your printer
617
- 4. Generate a token from the Creality Cloud app under Settings > Developer Options
224
+ <details>
225
+ <summary><strong>Available Tools</strong></summary>
618
226
 
619
227
  ## Available Tools
620
228
 
621
229
  <details>
622
- <summary>Click to expand STL Manipulation Tools</summary>
230
+ <summary><strong>STL Manipulation Tools</strong></summary>
623
231
 
624
232
  ### STL Manipulation Tools
625
233
 
626
- > **Memory Usage Warning**: The following STL manipulation tools load entire 3D models into memory. For large or complex STL files (>10MB), these operations can consume significant memory. When using these tools within the MCP environment, be mindful of memory constraints.
234
+ All STL tools load the full mesh into memory. Tools that change a model write a new file to the server's temporary directory, named after the input with a suffix such as `_scaled`, and return its path; the input file is not modified.
627
235
 
628
236
  #### get_stl_info
629
237
 
630
- Get detailed information about an STL file, including dimensions, vertex count, and bounding box.
631
-
632
- ```json
633
- {
634
- "stl_path": "/path/to/file.stl"
635
- }
636
- ```
637
-
638
- #### extend_stl_base
639
-
640
- Extend the base of an STL file by a specified amount.
238
+ Inspect an STL file without modifying it. Returns the bounding box, dimensions, center, vertex count, and face count.
641
239
 
642
240
  ```json
643
241
  {
644
- "stl_path": "/path/to/file.stl",
645
- "extension_inches": 2
242
+ "stl_path": "/path/to/model.stl"
646
243
  }
647
244
  ```
648
245
 
649
246
  #### scale_stl
650
247
 
651
- Scale an STL model uniformly or along specific axes.
248
+ Scale a model uniformly with `scale_factor`, or per axis with `scale_x`, `scale_y`, and `scale_z`. When any axis value is given, unspecified axes stay at 1.0.
652
249
 
653
250
  ```json
654
251
  {
655
- "stl_path": "/path/to/file.stl",
656
- "scale_factor": 1.5
252
+ "stl_path": "/path/to/model.stl",
253
+ "scale_factor": 1.2
657
254
  }
658
255
  ```
659
256
 
660
- Or for non-uniform scaling:
661
-
662
257
  ```json
663
258
  {
664
- "stl_path": "/path/to/file.stl",
259
+ "stl_path": "/path/to/model.stl",
665
260
  "scale_x": 1.2,
666
261
  "scale_y": 1.0,
667
262
  "scale_z": 1.5
@@ -670,12 +265,12 @@ Or for non-uniform scaling:
670
265
 
671
266
  #### rotate_stl
672
267
 
673
- Rotate an STL model around specific axes (in degrees).
268
+ Rotate a model around the X, Y, and Z axes, in degrees. Omitted axes default to 0.
674
269
 
675
270
  ```json
676
271
  {
677
- "stl_path": "/path/to/file.stl",
678
- "rotate_x": 45,
272
+ "stl_path": "/path/to/model.stl",
273
+ "rotate_x": 0,
679
274
  "rotate_y": 0,
680
275
  "rotate_z": 90
681
276
  }
@@ -683,31 +278,42 @@ Rotate an STL model around specific axes (in degrees).
683
278
 
684
279
  #### translate_stl
685
280
 
686
- Move an STL model along specific axes (in millimeters).
281
+ Move a model along the X, Y, and Z axes, in millimeters. Omitted axes default to 0.
687
282
 
688
283
  ```json
689
284
  {
690
- "stl_path": "/path/to/file.stl",
285
+ "stl_path": "/path/to/model.stl",
691
286
  "translate_x": 10,
692
287
  "translate_y": 5,
693
288
  "translate_z": 0
694
289
  }
695
290
  ```
696
291
 
292
+ #### extend_stl_base
293
+
294
+ Add solid geometry underneath the model to raise and widen its base. `extension_inches` is in **inches** and is converted to millimeters (25.4 mm per inch).
295
+
296
+ ```json
297
+ {
298
+ "stl_path": "/path/to/model.stl",
299
+ "extension_inches": 0.25
300
+ }
301
+ ```
302
+
697
303
  #### merge_vertices
698
304
 
699
- Merge vertices that are closer than a specified tolerance. Helps close small gaps and can slightly simplify the mesh.
305
+ Merge vertices closer together than `tolerance` (millimeters, default 0.01). This can close small gaps and slightly simplify the mesh.
700
306
 
701
307
  ```json
702
308
  {
703
309
  "stl_path": "/path/to/model.stl",
704
- "tolerance": 0.01 // Optional, default = 0.01mm
310
+ "tolerance": 0.01
705
311
  }
706
312
  ```
707
313
 
708
314
  #### center_model
709
315
 
710
- Translate the model so the center of its bounding box is at the world origin (0,0,0).
316
+ Move the model so the center of its bounding box is at the origin (0, 0, 0).
711
317
 
712
318
  ```json
713
319
  {
@@ -717,7 +323,7 @@ Translate the model so the center of its bounding box is at the world origin (0,
717
323
 
718
324
  #### lay_flat
719
325
 
720
- Attempt to identify the largest flat surface of the model (that isn't already facing directly up or down) and rotate the model so this face is oriented downwards on the XY plane (Z=0). Useful for orienting models for printing.
326
+ Find the model's largest flat face and rotate the model so that face rests on the XY plane (Z = 0). Works best on models with a clearly dominant flat face.
721
327
 
722
328
  ```json
723
329
  {
@@ -727,28 +333,28 @@ Attempt to identify the largest flat surface of the model (that isn't already fa
727
333
 
728
334
  #### modify_stl_section
729
335
 
730
- Apply a specific transformation to a selected section of an STL file. This allows for detailed modifications of specific parts of a model.
336
+ Apply a scale, rotation, or translation to one section of a model: the `top`, `bottom`, or `center` third of its bounding box, or a `custom` box. `value_x`, `value_y`, and `value_z` are scale factors, degrees, or millimeters depending on `transformation_type`.
731
337
 
732
338
  ```json
733
339
  {
734
- "stl_path": "/path/to/file.stl",
340
+ "stl_path": "/path/to/model.stl",
735
341
  "section": "top",
736
342
  "transformation_type": "scale",
737
343
  "value_x": 1.5,
738
- "value_y": 1.5,
344
+ "value_y": 1.5,
739
345
  "value_z": 1.5
740
346
  }
741
347
  ```
742
348
 
743
- For custom section bounds:
349
+ A `custom` section requires all six bounds:
744
350
 
745
351
  ```json
746
352
  {
747
- "stl_path": "/path/to/file.stl",
353
+ "stl_path": "/path/to/model.stl",
748
354
  "section": "custom",
749
355
  "transformation_type": "rotate",
750
356
  "value_x": 0,
751
- "value_y": 0,
357
+ "value_y": 0,
752
358
  "value_z": 45,
753
359
  "custom_min_x": -10,
754
360
  "custom_min_y": 0,
@@ -761,369 +367,480 @@ For custom section bounds:
761
367
 
762
368
  #### generate_stl_visualization
763
369
 
764
- Generate an SVG visualization of an STL file from multiple angles (front, side, top, and isometric views).
370
+ Render an SVG with front, side, top, and isometric views of a model. `width` and `height` set each view's size in pixels (default 300).
765
371
 
766
372
  ```json
767
373
  {
768
- "stl_path": "/path/to/file.stl",
374
+ "stl_path": "/path/to/model.stl",
769
375
  "width": 400,
770
376
  "height": 400
771
377
  }
772
378
  ```
773
379
 
774
- #### slice_stl
380
+ The SVG is a simplified schematic, not a photorealistic render.
381
+
382
+ </details>
383
+
384
+ <details>
385
+ <summary><strong>Printer Control Tools</strong></summary>
775
386
 
776
- Slice an STL file to generate G-code.
387
+ ### Printer Control Tools
388
+
389
+ Every printer tool accepts `host`, `port`, `type`, and `api_key`, and Bambu printers also use `bambu_serial` and `bambu_token`. Omitted values fall back to `PRINTER_HOST`, `PRINTER_PORT`, `PRINTER_TYPE`, `API_KEY`, `BAMBU_SERIAL`, and `BAMBU_TOKEN`. Keep keys in the server configuration rather than passing them in calls.
390
+
391
+ What each call does depends on the backend; see [printer backend setup](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SETUP.md#printer-backend-setup) for the exact API routes.
392
+
393
+ Every print start and positive heating command, on every backend, goes through a [safety gate](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SETUP.md#print-and-heating-safety): the server inspects the exact G-code it will start, checks each heater target against hardware and material ceilings, checks that the printer is ready, and asks a human to confirm through MCP elicitation. Turning a heater off (`temperature: 0`) and `cancel_print` are never gated.
394
+
395
+ #### get_printer_status
396
+
397
+ Read the printer's current status. The response is the backend's own status data: Bambu returns temperatures, job state, progress, layers, time remaining, and AMS data; OctoPrint returns printer state and temperatures; Klipper returns the Moonraker host state only.
777
398
 
778
399
  ```json
779
400
  {
780
- "stl_path": "/path/to/file.stl",
781
- "slicer_type": "orcaslicer",
782
- "slicer_path": "/path/to/orcaslicer",
783
- "slicer_profile": "/path/to/machine.json;/path/to/process.json",
784
- "filament_profile": "/path/to/flat-nylon-filament.json"
401
+ "type": "klipper",
402
+ "host": "192.168.1.50",
403
+ "port": "7125"
785
404
  }
786
405
  ```
787
406
 
788
- For OrcaSlicer, the server uses `--slice 0 --outputdir` and returns the renamed `plate_1.gcode` output. Load filament separately with `filament_profile` (`--load-filaments`) or encode it in `slicer_profile` after a pipe, for example `/path/to/process.json|/path/to/filament.json`.
407
+ #### list_printer_files
789
408
 
790
- #### confirm_temperatures
409
+ List the files stored on the printer or its host software. On Bambu printers it lists the `cache/`, `timelapse/`, and `logs/` directories.
410
+
411
+ ```json
412
+ {
413
+ "type": "octoprint",
414
+ "host": "192.168.1.100"
415
+ }
416
+ ```
791
417
 
792
- Confirm temperature settings in a G-code file.
418
+ #### upload_gcode
419
+
420
+ Upload G-code to the printer, and optionally start it. Pass `gcode_path` for a local file, or `gcode` with the content (or a local path). `filename` defaults to the basename of `gcode_path`; when printing, use a plain filename so the started file is exactly the uploaded one.
793
421
 
794
422
  ```json
795
423
  {
796
- "gcode_path": "/path/to/file.gcode",
797
- "extruder_temp": 200,
798
- "bed_temp": 60
424
+ "type": "klipper",
425
+ "host": "192.168.1.50",
426
+ "port": "7125",
427
+ "gcode_path": "/path/to/benchy.gcode",
428
+ "print": true,
429
+ "material": "PETG"
799
430
  }
800
431
  ```
801
432
 
802
- #### process_and_print_stl
433
+ - Without `print`, the file is only uploaded and nothing is inspected or started.
434
+ - With `print: true`, the exact uploaded bytes are inspected first (every `S` and `R` heater target, tool changes, and hardware and material ceilings), the printer's state is checked, and a human confirms before the job starts.
435
+ - Printing needs a declared material: slicer metadata in the file (`; filament_type = PLA`) or the `material` argument, which must not contradict the file.
436
+ - On Bambu printers, files go to `cache/` over FTPS, and printing also needs the model (`bambu_model` or `BAMBU_MODEL`). Automatic printing after upload supports `.gcode` only; print `.3mf` projects with `print_3mf`.
437
+
438
+ #### start_print
803
439
 
804
- Process an STL file (extend base), slice it, confirm temperatures, and start printing.
440
+ Start a G-code file that is already stored on the printer. The server downloads that exact file, inspects it, checks the printer's state, asks a human to confirm, and then starts a uniquely named checked copy. This works on Bambu Lab, OctoPrint, Klipper (Moonraker), and Duet. Repetier, Prusa, and Creality refuse, because their adapters have no verified download route; use `upload_gcode` with `print: true` instead.
805
441
 
806
442
  ```json
807
443
  {
808
- "stl_path": "/path/to/file.stl",
809
- "extension_inches": 2,
810
- "extruder_temp": 200,
811
- "bed_temp": 60,
812
- "host": "192.168.1.100",
813
444
  "type": "octoprint",
814
- "api_key": "YOUR_API_KEY"
445
+ "host": "192.168.1.100",
446
+ "filename": "benchy.gcode",
447
+ "material": "PLA"
448
+ }
449
+ ```
450
+
451
+ Pass `material` when the file has no `filament_type` metadata. On Bambu printers it also needs the model and supports `.gcode` files only; bare filenames are looked up in `cache/`.
452
+
453
+ #### cancel_print
454
+
455
+ Cancel the current print job. Cancelling is never gated and also cancels checked prints still waiting to start. There is no pause or resume tool; cancelling is not resumable.
456
+
457
+ ```json
458
+ {
459
+ "type": "prusa",
460
+ "host": "192.168.1.120"
461
+ }
462
+ ```
463
+
464
+ #### set_printer_temperature
465
+
466
+ Set a target temperature for a printer component. Use `bed` or `extruder`; Bambu also accepts `nozzle`, `tool`, and `tool0`. OctoPrint nozzle targets are sent to `tool0`.
467
+
468
+ ```json
469
+ {
470
+ "type": "klipper",
471
+ "host": "192.168.1.50",
472
+ "port": "7125",
473
+ "component": "extruder",
474
+ "temperature": 215,
475
+ "material": "PLA"
815
476
  }
816
477
  ```
817
478
 
818
- **Note:** Automatic orientation for optimal printing (minimizing supports, etc.) is a complex task typically handled by slicer GUIs (like OrcaSlicer or PrusaSlicer) and is not implemented in this server.
479
+ - `temperature` must be a finite number of 0 or more. `0` switches the heater off and is never gated.
480
+ - Positive targets are checked before connecting against independent hardware ceilings and the material's ceiling, need a ready printer, and ask a human to confirm.
481
+ - Positive nozzle heating needs `material` (for example PLA, PETG, or ABS), including for spools without RFID.
482
+ - On Bambu printers, positive heating also needs `bambu_model` (or `BAMBU_MODEL`), and nozzle heating uses `nozzle_diameter` (0.2, 0.4, 0.6, or 0.8; default `NOZZLE_DIAMETER` or 0.4). Both are checked against the live printer.
819
483
 
820
484
  </details>
821
485
 
822
486
  <details>
823
- <summary>Click to expand Printer Control Tools</summary>
487
+ <summary><strong>Bambu-Specific Tools</strong></summary>
824
488
 
825
- ### Printer Control Tools
489
+ ### Bambu-Specific Tools
826
490
 
827
- #### get_printer_status
491
+ These tools work with `PRINTER_TYPE=bambu` (or `type: "bambu"`). Set up LAN Only Mode, the serial number, the access code, and the model as described in [Bambu Lab setup](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SETUP.md#bambu-lab).
492
+
493
+ #### print_3mf
494
+
495
+ Upload a sliced `.3mf` project to a Bambu printer over FTPS and start it with an MQTT `project_file` command that carries the plate's G-code path, its MD5, the AMS mapping, and the calibration flags. **`bambu_model` is required** (or `BAMBU_MODEL`); without it the server asks through MCP elicitation when the client supports it, or returns an error. The wrong model can crash the bed into the nozzle.
828
496
 
829
- Get the current status of the 3D printer.
497
+ Before anything is uploaded, the server inspects a private copy of the selected plate (model, nozzle, bed type, materials, and every heater target). It checks them against per-model hardware limits, material ceilings, and a fresh MQTT report of the printer's model, serial, nozzle, state, errors, and loaded filament. A human then confirms, and the report is checked again before dispatch.
830
498
 
831
499
  ```json
832
500
  {
833
- "host": "192.168.1.100",
834
- "type": "octoprint",
835
- "api_key": "YOUR_API_KEY"
501
+ "three_mf_path": "/path/to/bracket.gcode.3mf",
502
+ "bambu_model": "p1s",
503
+ "bed_type": "textured_plate",
504
+ "use_ams": true,
505
+ "ams_mapping": { "Generic PLA": 0 },
506
+ "bed_leveling": true,
507
+ "flow_calibration": true,
508
+ "vibration_calibration": true,
509
+ "layer_inspect": true,
510
+ "timelapse": false
836
511
  }
837
512
  ```
838
513
 
839
- For Bambu printers, this currently only confirms MQTT connection.
514
+ - If the project has no plate G-code, the server tries to [auto-slice it](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SLICING.md#print_3mf-auto-slicing) with FULU OrcaSlicer-bambulab or Bambu Studio. If slicing fails, or the selected plate still has no G-code, it stops with an error and never uploads the original project.
515
+ - `ams_mapping` is an object whose values are AMS slot numbers. When it is omitted, the mapping embedded in the 3MF is used; with no mapping at all, the print runs without AMS. `use_ams: false` turns AMS off.
516
+ - After sending the command, the server watches fresh reports for up to 15 seconds (`BAMBU_DISPATCH_CHECK_MS`) and returns `dispatch: "started"` or `"unconfirmed"`. If the firmware refuses the command (HMS 0500-0500-0001-0007 on firmware 01.08.05 and later without Developer Mode), the call fails and says so; the checked file stays on the printer's storage.
517
+ - `nozzle_type` (`stainless_steel`, `hardened_steel`, `tungsten_carbide`, `brass`) sets the installed nozzle when the project must be auto-sliced. The job's nozzle type must match the printer's report.
518
+ - `bed_type` is one of `textured_plate`, `cool_plate`, `engineering_plate`, or `hot_plate` (default `BED_TYPE`, else `textured_plate`). It must match the plate's bed metadata, so a file sliced for another plate, or without bed metadata, is refused until `bed_type` matches.
519
+ - `nozzle_diameter` accepts 0.2, 0.4, 0.6, or 0.8 (default `NOZZLE_DIAMETER` or 0.4).
520
+ - Calibration flags default to on (timelapse to off) when omitted.
521
+ - `layer_height`, `nozzle_temperature`, `bed_temperature`, and `support_enabled` are accepted but not applied: those settings are baked into the sliced file. Change them in the slicer.
522
+ - A success response means the command was sent, not that the print started cleanly. Check the printer's status afterward.
840
523
 
841
- #### list_printer_files
524
+ #### check_fulu_orca_setup
842
525
 
843
- List files available on the printer.
526
+ Inspect a FULU OrcaSlicer-bambulab install: the executable, the platform runtime payload, the install and verify commands, and optionally a BambuNetwork bridge handshake. Paths default to the server environment; see [checking the setup](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/FULU.md#check-the-setup-through-mcp).
844
527
 
845
528
  ```json
846
529
  {
847
- "host": "192.168.1.100",
848
- "type": "octoprint",
849
- "api_key": "YOUR_API_KEY"
530
+ "platform": "darwin",
531
+ "run_bridge_probe": true
850
532
  }
851
533
  ```
852
534
 
853
- For Bambu printers, lists files in the `gcodes` directory via FTP.
535
+ `bridge_command`, and `slicer_path`, `plugin_dir`, or `runtime_dir` with `run_bridge_probe: true`, require `MCP_ALLOW_EXECUTABLE_ARG=1`.
854
536
 
855
- #### upload_gcode
537
+ #### fulu_bambu_network_rpc
856
538
 
857
- Upload G-code content or a local G-code file path to the printer.
539
+ Call one FULU BambuNetwork bridge method for diagnostics. Read-only methods such as `bridge.handshake`, `bridge.runtime_info`, and `net.get_user_print_info` are allowed by default. Agent and session setup methods require `allow_mutating_method: true`. Raw print methods (such as `net.start_print`), printer messages (`net.send_message`), file transfers, and unknown methods are refused, because they would bypass the print safety gate; print with `print_3mf`. `bambu_model` is informational only. See [bridge RPC](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/FULU.md#bridge-rpc).
858
540
 
859
541
  ```json
860
542
  {
861
- "host": "192.168.1.100",
862
- "type": "octoprint",
863
- "api_key": "YOUR_API_KEY",
864
- "filename": "my_print.gcode",
865
- "gcode": "G28\nG1 X100 Y100 Z10 F3000\n...",
866
- "print": true
543
+ "method": "bridge.handshake"
867
544
  }
868
545
  ```
869
546
 
870
- For larger files, pass a local path instead. If `filename` is omitted, the printer filename defaults to the basename of `gcode_path`.
547
+ The bridge command comes from `FULU_BAMBU_BRIDGE_COMMAND`; a per-call `bridge_command` requires `MCP_ALLOW_EXECUTABLE_ARG=1`.
548
+
549
+ </details>
550
+
551
+ <details>
552
+ <summary><strong>Slicing Tools</strong></summary>
553
+
554
+ ### Slicing Tools
555
+
556
+ See the [slicing guide](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SLICING.md) for slicer types, profiles, and troubleshooting. Slicing a file yourself in the slicer's GUI and uploading the result is the most predictable path.
557
+
558
+ #### slice_stl
559
+
560
+ Slice an STL or 3MF with the configured slicer and return the output path: G-code for PrusaSlicer, Slic3r, generic OrcaSlicer, and CuraEngine, or a sliced `.3mf` for the Bambu-compatible path.
561
+
562
+ The **Bambu-compatible path** is used for Bambu Studio, FULU OrcaSlicer-bambulab, and OrcaSlicer when the call passes `bambu_model`:
563
+
564
+ - The machine preset always comes from `bambu_model` (or `BAMBU_MODEL`, asked for when missing) and `nozzle_diameter` (default `NOZZLE_DIAMETER` or 0.4). The exact `<model> <diameter> nozzle` preset must exist in the selected slicer installation. Its `inherits` and `include` chains are resolved before the slicer runs.
565
+ - `slicer_profile` (or `SLICER_PROFILE`) is a process profile only. A `machine;process` list is rejected with instructions.
566
+ - Slicing accepts `p1s`, `p1p`, `p2s`, `x1c`, `x1e`, `a1`, `a1mini`, `h2d`, `h2s`, and `h2c` when the installed slicer has that preset. Printing still accepts only the seven models in `BAMBU_MODEL`.
567
+ - The output must contain a nonempty `Metadata/plate_<n>.gcode`. Failures stop with the slicer's exit code or signal, the tails of its output, and slicing-specific advice.
871
568
 
872
569
  ```json
873
570
  {
874
- "host": "192.168.1.100",
875
- "type": "klipper",
876
- "api_key": "YOUR_API_KEY",
877
- "gcode_path": "/path/to/my_print.gcode",
878
- "print": true
571
+ "stl_path": "/path/to/phone-case.stl",
572
+ "slicer_type": "bambustudio",
573
+ "bambu_model": "p1s",
574
+ "nozzle_diameter": "0.4",
575
+ "bed_type": "textured_plate",
576
+ "load_filaments": "/path/to/filaments/tpu-95a-hf.json",
577
+ "arrange": true,
578
+ "orient": false
879
579
  }
880
580
  ```
881
581
 
882
- For Bambu printers, uploads to the `gcodes` directory via FTP. Cannot start print automatically.
582
+ Options for the Bambu-compatible path:
883
583
 
884
- #### start_print
584
+ | Argument | What it does |
585
+ |---|---|
586
+ | `bed_type` | Build plate: `textured_plate`, `cool_plate`, `engineering_plate`, or `hot_plate` (default `BED_TYPE` or `textured_plate`) |
587
+ | `nozzle_type` | Installed nozzle: `stainless_steel`, `hardened_steel`, `tungsten_carbide`, or `brass` (default `BAMBU_NOZZLE_TYPE`, else the preset's stock nozzle). Printing requires it to match the printer's reported nozzle |
588
+ | `load_filaments` | Filament profile JSON paths in slot order, `;`-separated. One profile applies to every slot; otherwise give one per slot. `filament_profile` is an alias |
589
+ | `load_filament_ids` | Comma-separated filament IDs mapping filaments to objects, such as `1,2,3,1` |
590
+ | `filament_colours` | One `#RRGGBB` per filament slot, `;`-separated. Defaults to the input 3MF's colours, then each profile's colour |
591
+ | `template_3mf_path`, `template_name`, `template_dir` | Reuse a 3MF's or profile's slicer settings as the process profile (defaults: `BAMBU_TEMPLATE_3MF_PATH`, `BAMBU_TEMPLATE_DIR`). An explicit `slicer_profile` takes precedence |
592
+ | `uptodate`, `min_save`, `skip_modified_gcodes` | Refresh 3MF presets to the installed slicer, write a smaller 3MF, or ignore custom G-code embedded in an input 3MF |
593
+ | `orient`, `arrange`, `ensure_on_bed`, `repetitions`, `clone_objects`, `skip_objects`, `slice_plate` | Placement: auto-orient, auto-arrange (set `false` to keep a layout), drop floating models onto the bed, copies, per-object clone counts, objects to skip, and which plate to slice (0 = all) |
594
+ | `scale`, `rotate`, `rotate_x`, `rotate_y` | Transform before slicing (uniform scale; rotations in degrees) |
595
+ | `enable_timelapse`, `allow_mix_temp` | Insert timelapse parking moves; allow filaments with different temperature needs on one plate |
596
+
597
+ Generic slicers keep their own profile formats: PrusaSlicer and Slic3r load one exported config, and generic OrcaSlicer takes `machine.json;process.json`, optionally followed by `|filament.json`. `slicer_type`, `slicer_profile`, and `filament_profile` fall back to `SLICER_TYPE`, `SLICER_PROFILE`, and `FILAMENT_PROFILE`. The slicer executable comes from `SLICER_PATH`; a per-call `slicer_path` requires `MCP_ALLOW_EXECUTABLE_ARG=1`. See the [slicing guide](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/SLICING.md#bambu-compatible-slicing).
885
598
 
886
- Start printing a file that is already on the printer.
599
+ #### slice_with_template
600
+
601
+ Slice an STL or 3MF with a named template from the local template registry. The template supplies the process settings; the machine preset still comes from `bambu_model` and `nozzle_diameter`. It takes the same arguments as `slice_stl`, and an explicit `slicer_profile` in the call overrides the template.
887
602
 
888
603
  ```json
889
604
  {
890
- "host": "192.168.1.100",
891
- "type": "octoprint",
892
- "api_key": "YOUR_API_KEY",
893
- "filename": "my_print.gcode"
605
+ "stl_path": "/path/to/bracket.stl",
606
+ "template_name": "p1s-petg-strong",
607
+ "bambu_model": "p1s"
894
608
  }
895
609
  ```
896
610
 
897
- **Not recommended for Bambu printers.** Use `print_3mf` for Bambu `.3mf` files.
611
+ #### list_templates
898
612
 
899
- #### cancel_print
613
+ List the saved slicing templates (`.3mf`, `.json`, `.config`) in the registry directory, `BAMBU_TEMPLATE_DIR` (default `~/Sync/bambu/templates`), or in `template_dir`.
614
+
615
+ ```json
616
+ {}
617
+ ```
618
+
619
+ #### save_template
900
620
 
901
- Cancel the current print job.
621
+ Copy a local `.3mf`, `.json`, or `.config` file into the template registry. `template_name` defaults to the source filename without its extension.
902
622
 
903
623
  ```json
904
624
  {
905
- "host": "192.168.1.100",
906
- "type": "octoprint",
907
- "api_key": "YOUR_API_KEY"
625
+ "source_path": "/path/to/p1s-petg-strong.3mf",
626
+ "template_name": "p1s-petg-strong"
908
627
  }
909
628
  ```
910
629
 
911
- For Bambu printers, sends the `stop_print` command via MQTT.
630
+ #### get_slice_settings
912
631
 
913
- #### set_printer_temperature
632
+ Read the slicer settings in a 3MF, an extracted `project_settings.config`, or a profile JSON without slicing: layer height, infill, walls, supports, brim, bed, printer, and filaments. Pass `source_path`, or `template_name` to read a saved template.
633
+
634
+ ```json
635
+ {
636
+ "template_name": "p1s-petg-strong"
637
+ }
638
+ ```
914
639
 
915
- Set the temperature of a printer component.
640
+ #### confirm_temperatures
641
+
642
+ Report every heater target in a G-code file: `S` and `R` forms, tool-addressed targets, RepRapFirmware `G10`/`M568`, and Klipper `SET_HEATER_TEMPERATURE`. An expected `extruder_temp` or `bed_temp` matches only when it equals the file's highest target, which the result returns as `peak`. It is read-only; the printing tools enforce their own safety gate.
916
643
 
917
644
  ```json
918
645
  {
919
- "host": "192.168.1.100",
646
+ "gcode_path": "/path/to/model.gcode",
647
+ "extruder_temp": 240,
648
+ "bed_temp": 80
649
+ }
650
+ ```
651
+
652
+ #### process_and_print_stl
653
+
654
+ Extend an STL's base, slice it, and print it through the same checked print gate as `upload_gcode` and `print_3mf`, including the human confirmation. If you pass `extruder_temp` or `bed_temp`, each must equal the sliced job's highest target (`S` and `R` forms, every tool); a mismatch stops before anything is uploaded. Pass `material` when the sliced G-code has no `filament_type` metadata. On a Bambu printer with a Bambu-compatible slicer, the sliced `.3mf` goes through the `print_3mf` checks, and the printer model is required.
655
+
656
+ ```json
657
+ {
658
+ "stl_path": "/path/to/model.stl",
659
+ "extension_inches": 0.1,
660
+ "extruder_temp": 210,
661
+ "bed_temp": 60,
662
+ "material": "PLA",
920
663
  "type": "octoprint",
921
- "api_key": "YOUR_API_KEY",
922
- "component": "extruder",
923
- "temperature": 200
664
+ "host": "192.168.1.100"
924
665
  }
925
666
  ```
926
667
 
927
- For Bambu printers, this dispatches firmware G-code temperature commands (`M104` for nozzle, `M140` for bed) over MQTT.
668
+ Use `slice_stl`, `confirm_temperatures`, and `upload_gcode` separately when you want to review the sliced file before the print is offered for confirmation.
928
669
 
929
670
  </details>
930
671
 
931
- <details open>
932
- <summary>Click to expand Bambu-Specific Tools</summary>
672
+ <details>
673
+ <summary><strong>Advanced Tools</strong></summary>
933
674
 
934
- ### Bambu-Specific Tools
675
+ ### Advanced Tools
935
676
 
936
- #### check_fulu_orca_setup
677
+ #### Blender MCP
937
678
 
938
- Inspects the FULU OrcaSlicer-bambulab executable, platform runtime payload, setup commands, and optional BambuNetwork bridge probe.
679
+ Connect a standard stdio Blender MCP server with `BLENDER_MCP_COMMAND` (for example, the full path to `uvx`) and `BLENDER_MCP_ARGS` (for example `["mcp-for-blender"]`). The [mcp-for-blender](https://github.com/ahujasid/mcp-for-blender) project was formerly published as `blender-mcp`, which still works as a compatibility wrapper. Install and enable its addon in Blender and start the addon's connection. Blender and this server must be able to read the same local files. Printer tools work without Blender configured. Keep Blender open while your agent works: the addon does not run in background mode. See the [Blender guide](https://github.com/DMontgomery40/mcp-3D-printer-server/blob/main/docs/BLENDER.md) for setup, units, and a worked example that refits a phone case for a new phone end to end.
939
680
 
940
- The `bridge_command` shown below requires `MCP_ALLOW_EXECUTABLE_ARG=1`; otherwise it is read from `FULU_BAMBU_BRIDGE_COMMAND`. See [Check The Setup Through MCP](#check-the-setup-through-mcp).
681
+ #### blender_mcp_status
682
+
683
+ Inspect the Blender MCP configuration. With `connect: true`, it starts the configured server, initializes it, and lists its tools by name and summary. Pass `tool_names` to get the full input schemas of the tools you are about to call (`include_schemas: true` returns all of them, which is large). A successful connection does not prove the addon inside Blender is running; call `get_scene_info` through `blender_mcp_call` to check that.
941
684
 
942
685
  ```json
943
686
  {
944
- "platform": "darwin",
945
- "slicer_path": "/Applications/OrcaSlicer.app/Contents/MacOS/OrcaSlicer",
946
- "plugin_dir": "/Applications/OrcaSlicer.app/Contents/MacOS",
947
- "run_bridge_probe": true,
948
- "bridge_command": "\"/Applications/OrcaSlicer.app/Contents/MacOS/pjarczak-bambu-linux-host-wrapper\" \"$HOME/Library/Application Support/OrcaSlicer/macos-bridge/runtime/pjarczak_bambu_linux_host\""
687
+ "connect": true,
688
+ "tool_names": ["execute_blender_code"]
949
689
  }
950
690
  ```
951
691
 
952
- #### fulu_bambu_network_rpc
692
+ #### blender_mcp_call
953
693
 
954
- Calls one FULU BambuNetwork bridge JSON RPC method. Read-only methods such as `bridge.handshake`, `bridge.runtime_info`, and `net.get_user_print_info` are allowed by default. Methods that can mutate account, printer, cloud, or print state require `allow_mutating_method=true`; FULU print methods also require `bambu_model`.
694
+ Call a tool the Blender MCP server advertises, such as `get_scene_info` or `execute_blender_code`, with arguments matching its discovered schema. The full MCP result, including images and errors, is returned. Calls can change the active Blender scene and are never retried automatically. Preserve the user's own words in `user_prompt` when the remote tool asks for it.
955
695
 
956
696
  ```json
957
697
  {
958
- "method": "bridge.handshake",
959
- "bridge_command": "\"/Applications/OrcaSlicer.app/Contents/MacOS/pjarczak-bambu-linux-host-wrapper\" \"$HOME/Library/Application Support/OrcaSlicer/macos-bridge/runtime/pjarczak_bambu_linux_host\""
698
+ "tool_name": "get_scene_info",
699
+ "arguments": { "user_prompt": "Inspect the scene before preparing a print." }
960
700
  }
961
701
  ```
962
702
 
963
- #### print_3mf
964
-
965
- Uploads a sliced `.3mf` file to a Bambu printer via FTP and initiates the print job via an MQTT command. If the 3MF has no embedded plate G-code and a project slicer is configured, the server can auto-slice it first with FULU OrcaSlicer-bambulab or Bambu Studio. Allows overriding some print parameters like AMS mapping.
703
+ #### blender_mcp_export_stl
966
704
 
967
- **`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 and damage the printer. If not provided in the tool call and `BAMBU_MODEL` is not set in the environment, the server will ask interactively via MCP elicitation (if supported by your client) or return a clear error.
705
+ Export named objects from the live Blender scene to a new STL for slicing. Use it after modelling or editing through `blender_mcp_call`; Blender MCP's own `export_scene` writes GLB or FBX, not STL. The export writes world-space geometry with modifiers applied, without changing the scene, selection, or mode.
968
706
 
969
707
  ```json
970
708
  {
971
- "three_mf_path": "/path/to/your_model.3mf",
972
- "bambu_model": "p1s",
973
- "bed_type": "textured_plate",
974
- "host": "your_bambu_ip",
975
- "bambu_serial": "YOUR_SERIAL",
976
- "bambu_token": "YOUR_TOKEN",
977
- "slicer_type": "orcaslicer-bambulab",
978
- "slicer_path": "/path/to/FULU/OrcaSlicer",
979
- "use_ams": true,
980
- "ams_mapping": [0, 1, 2, 3],
981
- "bed_leveling": true,
982
- "flow_calibration": false,
983
- "vibration_calibration": false,
984
- "timelapse": false
709
+ "object_names": ["PhoneCase"],
710
+ "output_path": "/path/to/phone-case.stl",
711
+ "user_prompt": "Make it fit my iPhone 17 Pro Max."
985
712
  }
986
713
  ```
987
714
 
988
- **Note:** Overriding slicer settings like layer height or temperature via this tool is not supported by the printer's MQTT command. Apply those changes before generating the `.3mf` file.
715
+ - The result reports `output_verified: true`, the triangle count, and `bounding_box.dimensions` measured from the written file. Compare the dimensions with what you expect before slicing.
716
+ - STL files carry no units and slicers read them as millimetres. An imported STL keeps its numbers, so the default `scale: 1` is right. If a part was modelled in metres, the result warns that it is under 1 unit across; export again with `scale: 1000`.
717
+ - `output_path` must be new and its parent must exist; nothing is ever overwritten. On any Blender error, mismatched receipt, or invalid file, nothing is published.
989
718
 
990
- </details>
719
+ #### blender_mcp_edit_model
991
720
 
992
- ## Available Resources
721
+ Import an STL into Blender, apply ordered edits, and export a new STL. Supported operations are `decimate:<ratio>` (greater than 0, up to 1), `remesh:<voxel size>` (positive, in STL units), and `boolean_union:<STL path>`. Use `blender_mcp_call` for anything else.
993
722
 
994
- <details>
995
- <summary>Click to expand Printer Resources</summary>
723
+ ```json
724
+ {
725
+ "stl_path": "/path/to/model.stl",
726
+ "output_path": "/path/to/model-edited.stl",
727
+ "operations": ["decimate:0.5"],
728
+ "user_prompt": "Reduce the triangle count for printing.",
729
+ "execute": false
730
+ }
731
+ ```
996
732
 
997
- ### Printer Resources
733
+ - The default (`execute: false`) validates the request and returns the plan and generated Python without launching Blender. Set `execute: true` to apply it, reusing the preview's `output_path`.
734
+ - Omitting `output_path` selects a unique `model-edited-<id>.stl` beside the input. Existing input and output files are never overwritten.
735
+ - The edit requires Object Mode, preserves existing scene objects and selection, and publishes the new STL only after checking a matching export receipt and a valid, finite triangle mesh. Binary STLs up to 256 MiB are validated in small chunks; ASCII STLs are limited to 4 MiB.
736
+ - Requests have connection, discovery, and call deadlines (`BLENDER_MCP_TIMEOUT_MS`, default 120000) that also cover file validation. Interrupted edits are never replayed; inspect Blender before retrying, because an edit may already have started.
737
+ - A valid STL is not proof of printability. Inspect the result before slicing.
998
738
 
999
- - `printer://{host}/status` - Current status of the 3D printer (limited for Bambu currently)
1000
- - `printer://{host}/files` - List of files available on the 3D printer (FTP for Bambu)
1001
- - `printer://{host}/file/{filename}` - Content of a specific G-code file (checks existence only for Bambu)
739
+ Legacy `BLENDER_MCP_BRIDGE_COMMAND` shell commands remain supported when no standard command is configured. They receive JSON on stdin (`modelPath`, `operations`, `source`, and `stlPath`) and the same JSON in `MCP_BLENDER_PAYLOAD`, and their results report `output_verified: false`. A per-call `bridge_command` requires `MCP_ALLOW_EXECUTABLE_ARG=1`.
1002
740
 
1003
741
  </details>
1004
742
 
1005
- <details open>
1006
- <summary>Click to expand Bambu Preset Resources</summary>
743
+ </details>
1007
744
 
1008
- ### Bambu Preset Resources
745
+ <details>
746
+ <summary><strong>Available Resources</strong></summary>
747
+
748
+ ## Available Resources
1009
749
 
1010
- If the `BAMBU_STUDIO_CONFIG_PATH` environment variable is set to your Bambu Studio user settings directory, you can read your saved presets.
750
+ Resources follow the MCP resource protocol. They use the configured `PRINTER_TYPE` and credentials; the host segment selects the printer address.
1011
751
 
1012
- - `preset://bambu/machine/{preset_name}` - Reads a machine preset file (e.g., `Bambu Lab P1S 0.4 nozzle.json`)
1013
- - `preset://bambu/filament/{preset_name}` - Reads a filament preset file (e.g., `Generic PLA.json`)
1014
- - `preset://bambu/process/{preset_name}` - Reads a process preset file (e.g., `0.20mm Standard @BBL P1S.json`)
752
+ - `printer://{host}/status`: the printer's current status, as returned by `get_printer_status`
753
+ - `printer://{host}/files`: the file list, as returned by `list_printer_files`
754
+ - `printer://{host}/file/{filename}`: details for one file. On Bambu printers this only reports whether the file exists.
1015
755
 
1016
- **Example Usage:**
1017
- "Read the content of my Bambu process preset named '0.16mm Optimal @BBL P1S'"
1018
- (Claude would call ReadResource with `preset://bambu/process/0.16mm%20Optimal%20%40BBL%20P1S`)
756
+ For example, `printer://192.168.1.100/status` reads the status of the printer at that address.
1019
757
 
1020
758
  </details>
1021
759
 
1022
- ## Example Commands for Claude
760
+ <details>
761
+ <summary><strong>Printer Limitations</strong></summary>
762
+
763
+ ## Printer Limitations
764
+
765
+ 1. **Status depth varies by backend.** Bambu status includes progress, layers, and time remaining. OctoPrint status comes from `/api/printer` (state and temperatures, not job progress). Klipper status comes from Moonraker's `/printer/info`, which reports the host state but not job progress or temperatures. Duet, Repetier, and Creality responses have not been verified on hardware.
766
+ 2. **Cancel, but no pause.** There is no pause or resume tool. `cancel_print` stops the job.
767
+ 3. **Plain HTTP for most backends.** OctoPrint, Klipper, Duet, Repetier, and Creality adapters connect over `http://`. The Prusa adapter uses HTTPS for Prusa Connect, an `https://` host, or port 443.
768
+ 4. **Moonraker authentication is optional; Duet has no password support.** Set `API_KEY` for Moonraker hosts that require authentication. Leave it empty only when Moonraker trusts the MCP host. A password-protected Duet cannot be reached yet.
769
+ 5. **Command sent is not print finished.** A success response means the printer or its host accepted the request. Check status, and the printer itself, before you walk away.
770
+ 6. **Bambu prints need a sliced project and the right model.** `print_3mf` needs a `.3mf` with `Metadata/plate_<n>.gcode`, uploads it to `cache/`, and starts plate 1. Print settings such as layer height and temperatures cannot be changed at print time. `start_print` handles plain `.gcode` files only.
771
+ 7. **Bambu AMS mapping is simple.** `ams_mapping` values are sorted and padded to five entries; real behavior still depends on firmware, loaded filament, and the project's metadata. For AMS inventory and color matching, see [bambu-printer-mcp](https://github.com/DMontgomery40/bambu-printer-mcp).
772
+ 8. **Bambu temperatures go through G-code.** Temperature targets are sent as `M104` or `M140` over MQTT, so the printer's firmware and current state decide whether they apply.
773
+ 9. **Bambu networking assumes a trusted LAN.** MQTT and FTPS use the printer's self-signed certificate. Uploads use TLS 1.2 with session reuse; confirmation on the X1C firmware reported in [#22](https://github.com/DMontgomery40/mcp-3D-printer-server/issues/22) is still outstanding.
774
+ 10. **Safety checks read files and reports, not the physical printer.** A declared material cannot prove what spool is loaded, and a finished-job report cannot prove the bed is clear, which is why a human confirms. Klipper macro parameters that name a heater are checked, but macro bodies stored on the printer cannot be inspected. On Duet/RepRapFirmware, selecting a tool (`T0`) heats it to the temperature already stored on the printer; activation-only `M568` and `M144` are refused, but a plain tool change is allowed because every firmware uses it. The safety gate is tested with mocked printer transports and loopback HTTP APIs, plus one real Bambu P1S run that reached the firmware's command check; other printer systems have not been exercised on real hardware in this release.
775
+ 11. **Remote starts need a download route.** `start_print` of a file already on the printer works on Bambu Lab, OctoPrint, Klipper, and Duet. Repetier, Prusa, and Creality refuse it; upload the local G-code with `print: true` instead.
1023
776
 
1024
- Here are some example commands you can give to Claude after connecting the MCP server:
777
+ </details>
1025
778
 
1026
- ### Printer Control
1027
- - "What's the current status of my 3D printer?"
1028
- - "Show me the list of files on my printer."
1029
- - "Upload this G-code to my printer: [G-code content]"
1030
- - "Start printing the file named 'benchy.gcode'."
1031
- - "Cancel the current print job."
1032
- - "Set the extruder temperature to 200°C."
1033
- - "Set the bed temperature to 60°C."
779
+ <details>
780
+ <summary><strong>General Limitations and Considerations</strong></summary>
1034
781
 
1035
- ### STL Manipulation and Printing
1036
- - "Take this STL file and extend the base by 2 inches, then send to slicer and queue up in my printer."
1037
- - "Extend the base of model.stl by 1.5 inches."
1038
- - "Scale this STL file by 150% uniformly."
1039
- - "Scale model.stl to be twice as wide but keep the same height."
1040
- - "Rotate this model 90 degrees around the Z axis."
1041
- - "Move this STL model up by 5mm to create a gap underneath."
1042
- - "Can you modify just the top part of this model to make it 20% larger?"
1043
- - "Analyze this STL file and tell me its dimensions and details."
1044
- - "Generate a visualization of this STL file so I can see what it looks like."
1045
- - "Create SVG visualizations of my model from different angles."
1046
- - "Make the base of this model wider without changing its height."
1047
- - "Slice the modified STL file using PrusaSlicer."
1048
- - "Confirm that the temperatures in the G-code are 200°C for the extruder and 60°C for the bed."
1049
- - "Process this STL file, make the base 2 inches longer, slice it, and start printing, but confirm the temperatures first."
1050
- - "Print `~/Downloads/my_model.3mf` on the Bambu printer."
1051
- - "Upload `~/Desktop/calibration_cube.3mf` to the Bambu printer using AMS slots 0 and 2, and turn off bed leveling."
1052
- - "Cancel the print job on my Bambu P1S."
1053
- - "What are the settings in my Bambu filament preset 'Generic PETG'?"
1054
- - "Show me my Bambu process presets."
782
+ ## General Limitations and Considerations
1055
783
 
1056
- ## Bambu Lab Printer Limitations
784
+ ### Memory usage
1057
785
 
1058
- Due to the nature of the Bambu Lab printer API, there are some limitations:
786
+ - STL tools load the whole mesh into memory as Three.js geometry. Files over about 10 MB can use several hundred MB of RAM.
787
+ - Running several operations in a row on large files can build up memory between garbage collection cycles.
788
+ - There is no built-in memory cap. On constrained systems, avoid processing several large files at once.
1059
789
 
1060
- 1. **Printable 3MF requirement:** `print_3mf` ultimately needs a sliced 3MF that includes at least one `Metadata/plate_<n>.gcode` entry so the server can compute MD5 and start the job correctly. Unsliced 3MF files can be auto-sliced first when `SLICER_TYPE=orcaslicer-bambulab` or `SLICER_TYPE=bambustudio` is configured.
790
+ ### STL manipulation limitations
1061
791
 
1062
- 2. **AMS behavior caveat:** AMS mapping is passed through the MQTT project-file command, but real behavior still depends on printer firmware, loaded filament, and the sliced project's metadata.
792
+ - `lay_flat` looks for the largest flat face; results on organic or rounded models can be unpredictable.
793
+ - `extend_stl_base` adds new geometry beneath the model. Complex or non-planar undersides can produce gaps or intersections at the join, so inspect the result.
794
+ - `merge_vertices` with a large tolerance can change the model's shape. The 0.01 mm default is safe for most models.
795
+ - `modify_stl_section` works best on simple geometry. Non-manifold meshes (holes, overlapping faces, internal geometry) can produce unexpected results for any transformation; repair them first in your slicer or a mesh tool.
1063
796
 
1064
- 3. **Temperature control path:** Temperature updates are implemented through G-code command dispatch (`M104`/`M140`) over MQTT, so effective behavior still depends on printer firmware acceptance and current printer state.
797
+ ### Visualization limitations
1065
798
 
1066
- 4. **File transfer channel:** Uploads use Bambu's FTPS path (port 990) directly through `basic-ftp` with implicit TLS 1.2 on both channels, allowing the data connection to reuse the control session. TLS options also explicitly preserve the printer host identity on the data connection, fixing [Node session binding](https://github.com/nodejs/node/issues/64402) on current Node 22/24. TLS 1.2 avoids additional TLS 1.3 session-ticket timing differences. The compatibility path is tested against a local FTPS server; confirmation on the reporting X1C firmware is still needed. Some read/list operations still use `bambu-js` helpers.
799
+ - `generate_stl_visualization` produces a simplified schematic, not a true 3D render, and very detailed models may lose detail.
1067
800
 
1068
- 5. **Direct start path scope:** `startJob` currently targets `.gcode` files on printer storage; `.3mf` jobs should be initiated through `print_3mf` so metadata and plate selection are handled.
801
+ ### Performance considerations
1069
802
 
1070
- 6. **Status consistency:** Status reads force a `pushall` refresh when possible, but complete real-time, event-stream status semantics across all Bambu models still need deeper hardening.
803
+ - Slicing can take from seconds to several minutes, depending on the model and your CPU. Slicer runs time out after `SLICER_TIMEOUT_MS` (10 minutes by default).
804
+ - Large uploads depend on your network and the printer's storage speed.
805
+ - Bambu MQTT connections are reused. If a printer restarts or the network drops, the next call reconnects.
1071
806
 
1072
- 7. **FULU BambuNetwork bridge scope:** The FULU bridge exposes BambuNetwork functionality through its own runtime and RPC protocol. This MCP can inspect/probe that runtime and issue guarded bridge RPC calls, but local `print_3mf` still uses the server's explicit local MQTT/FTPS path unless a future change maps a complete FULU cloud-print payload safely.
807
+ </details>
1073
808
 
1074
- ## Limitations and Considerations
809
+ <details>
810
+ <summary><strong>MCP Safety Notes</strong></summary>
1075
811
 
1076
- ### Memory Usage
1077
- - **Large STL Files**: Processing large or complex STL files can consume significant memory. The entire STL geometry is loaded into memory during operations.
1078
- - **Multiple Operations**: Running multiple STL operations in sequence (especially on large files) may cause memory to accumulate if garbage collection doesn't keep up.
1079
- - **MCP Environment**: Since this runs as an MCP server, be aware that Claude's MCP environment has memory constraints. Complex operations on very large STL files may cause out-of-memory issues.
812
+ ## MCP Safety Notes
1080
813
 
1081
- ### STL Manipulation Limitations
1082
- - **Section Modification**: The section-specific modification feature works best on simpler geometries. Complex or non-manifold meshes may produce unexpected results.
1083
- - **Base Extension**: The base extension algorithm works by adding a new geometry underneath the model. For models with complex undersides, results may not be perfect.
1084
- - **Error Handling**: While we've added robust error handling, some edge cases in complex STL files might still cause issues.
814
+ Prompt injection is an open problem for tool-using agents. A downloaded model's description, a README inside an archive, 3MF metadata, or a web page can all contain instructions aimed at your agent. Practical mitigations:
1085
815
 
1086
- ### Visualization Limitations
1087
- - **SVG Representation**: The SVG visualization is a simplified schematic representation, not a true 3D render.
1088
- - **Complex Models**: For very complex models, the visualization may not accurately represent all details.
816
+ - Treat tool output and downloaded files as untrusted input.
817
+ - Keep printer keys and access codes in server configuration, with the least privilege your printer software allows.
818
+ - Keep per-call executable selectors off. Slicer, bridge, and Blender commands come from server configuration unless `MCP_ALLOW_EXECUTABLE_ARG=1` is set.
819
+ - Keep print confirmation on. The server asks a human through MCP elicitation before every print start and positive heating command, and refuses clients that cannot ask. `PRINT_REQUIRE_CONFIRMATION=0` (all printers) or `BAMBU_REQUIRE_CONFIRMATION=0` (Bambu only) opts out for headless setups; the first print after a finished job still asks.
820
+ - Heater ceilings come only from server configuration (`PRINTER_MAX_NOZZLE_TEMP`, `PRINTER_MAX_BED_TEMP`, `PRINTER_MAX_CHAMBER_TEMP`, or Bambu's per-model limits). Tool arguments and G-code never raise them.
821
+ - Run the streamable HTTP transport on a trusted network. It binds to `127.0.0.1` by default and has no built-in authentication.
822
+ - Set `BAMBU_MODEL` correctly and never substitute a similar model.
1089
823
 
1090
- ### Performance Considerations
1091
- - **Slicing Operations**: External slicer processes can be CPU-intensive and may take considerable time for complex models.
1092
- - **Progress Reporting**: For large files, progress updates may appear to stall at certain processing stages.
824
+ </details>
1093
825
 
1094
- ### Testing Recommendations
1095
- - Start with smaller STL files (< 10MB) to test functionality
1096
- - Monitor memory usage when processing large files
1097
- - Test modifications on simple geometries before attempting complex ones
1098
- - Consider running on a system with at least 4GB of available RAM for larger operations
826
+ <details>
827
+ <summary><strong>License</strong></summary>
1099
828
 
1100
- ## Appendix: MCP Safety Notes
829
+ ## License
1101
830
 
1102
- See [Recommended: use with codemode-mcp](#recommended-use-with-codemode-mcp) for reducing token overhead with large tool surfaces.
831
+ GPL-2.0. See [LICENSE](./LICENSE) for the full text.
1103
832
 
1104
- ### Prompt Injection: Risks and Mitigations
833
+ </details>
1105
834
 
1106
- Prompt injection is an open problem for tool-using agents. Practical mitigations:
835
+ <details>
836
+ <summary><strong>Acknowledgements</strong></summary>
1107
837
 
1108
- - Least-privilege credentials and short-lived tokens.
1109
- - Strict schema validation and explicit allowlists for actions/hosts.
1110
- - Human confirmation gates for destructive operations.
1111
- - Execution sandboxing with resource/time limits.
1112
- - Treat tool output as untrusted input by default.
838
+ ## Acknowledgements
1113
839
 
1114
- ## Badges
840
+ Thank you to the **[FULU Foundation](https://www.fulu.org/), [Louis Rossmann](https://www.youtube.com/@rossmanngroup), and the [OrcaSlicer-bambulab community](https://github.com/FULU-Foundation/OrcaSlicer-bambulab)** for advancing user choice, repair rights, and interoperable tools.
1115
841
 
1116
- | Badge | Description |
1117
- |-------|-------------|
1118
- | [![npm version](https://img.shields.io/npm/v/mcp-3d-printer-server.svg)](https://www.npmjs.com/package/mcp-3d-printer-server) | The current version of the package on npm |
1119
- | [![License: GPL-2.0](https://img.shields.io/badge/License-GPL%20v2-blue.svg)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) | This project is licensed under GPL-2.0 |
1120
- | [![TypeScript](https://img.shields.io/badge/TypeScript-4.9%2B-blue)](https://www.typescriptlang.org/) | This project is written in TypeScript 4.9+ |
1121
- | [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/DMontgomery40/mcp-3D-printer-server/graphs/commit-activity) | This project is actively maintained |
1122
- | [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://makeapullrequest.com) | We welcome contributions via Pull Requests |
1123
- | [![Node.js Version](https://img.shields.io/badge/node-%3E%3D%2018.0.0-green.svg)](https://nodejs.org/en/download/) | Requires Node.js 18.0.0 or higher |
1124
- | [![Downloads](https://img.shields.io/npm/dm/mcp-3d-printer-server.svg)](https://www.npmjs.com/package/mcp-3d-printer-server) | Number of downloads per month from npm |
1125
- | [![GitHub stars](https://img.shields.io/github/stars/dmontgomery40/mcp-3d-printer-server.svg?style=social&label=Star)](https://github.com/DMontgomery40/mcp-3D-printer-server) | Number of GitHub stars this project has received |
842
+ Bambu Lab support builds on community protocol research, including [OpenBambuAPI](https://github.com/Doridian/OpenBambuAPI). The Bambu-only fork, [bambu-printer-mcp](https://github.com/DMontgomery40/bambu-printer-mcp), shares its Blender MCP integration and FTPS fixes with this project.
1126
843
 
1127
- ## License
844
+ This project is listed in the [Glama MCP server directory](https://glama.ai/mcp/servers/7f6v2enbgk). See [CONTRIBUTORS.md](./CONTRIBUTORS.md) for the people whose code, reports, and printer testing shaped it.
1128
845
 
1129
- GPL-2.0
846
+ </details>