mcp-3d-printer-server 1.2.5 → 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 (87) hide show
  1. package/CHANGELOG.md +228 -0
  2. package/CONTRIBUTORS.md +49 -0
  3. package/README.md +529 -739
  4. package/dist/3mf_parser.js +8 -8
  5. package/dist/blender-mcp-bridge.d.ts +11 -0
  6. package/dist/blender-mcp-bridge.js +661 -0
  7. package/dist/fulu-orca.js +29 -5
  8. package/dist/index.js +752 -212
  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 -120
  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 +30 -14
  58. package/server.json +29 -0
  59. package/src/3mf_parser.ts +8 -8
  60. package/src/blender-mcp-bridge.ts +611 -0
  61. package/src/fulu-orca.ts +36 -6
  62. package/src/index.ts +888 -255
  63. package/src/printers/bambu-node-guard.ts +44 -0
  64. package/src/printers/bambu.ts +458 -158
  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
  87. package/dist/index.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "mcp-3d-printer-server",
3
- "version": "1.2.5",
3
+ "mcpName": "io.github.DMontgomery40/mcp-3d-printer-server",
4
+ "version": "1.2.11",
4
5
  "description": "MCP server for connecting Claude with 3D printer management systems",
5
6
  "main": "dist/index.js",
6
7
  "repository": "https://github.com/DMontgomery40/mcp-3D-printer-server",
@@ -11,8 +12,11 @@
11
12
  "start:http": "MCP_TRANSPORT=streamable-http node dist/index.js",
12
13
  "dev": "nodemon src/index.ts --exec \"npm run build && npm start\"",
13
14
  "build": "tsc",
14
- "test": "npm run build && node dist/test/stl-manipulator-test.js && node --test tests/**/*.test.mjs",
15
- "inspect": "npm run build && npx @modelcontextprotocol/inspector dist/index.js"
15
+ "test": "npm run build && node dist/test/stl-manipulator-test.js && node --test tests/*.test.mjs tests/slicer/*.test.mjs tests/safety/*.test.mjs",
16
+ "inspect": "npm run build && npx @modelcontextprotocol/inspector dist/index.js",
17
+ "prepack": "npm run build",
18
+ "test:package": "node scripts/test-package.mjs",
19
+ "test:blender-live": "npm run build && node scripts/blender-live-check.mjs"
16
20
  },
17
21
  "bin": {
18
22
  "mcp-3d-printer-server": "./dist/index.js",
@@ -28,10 +32,11 @@
28
32
  "dist/http-server.js",
29
33
  "dist/index.d.ts",
30
34
  "dist/index.js",
31
- "dist/index.js.map",
32
35
  "dist/printers",
36
+ "dist/safety",
33
37
  "dist/sse-server.d.ts",
34
38
  "dist/sse-server.js",
39
+ "dist/slicer",
35
40
  "dist/stl",
36
41
  "dist/test",
37
42
  "dist/types.d.ts",
@@ -41,7 +46,9 @@
41
46
  "src/http-server.ts",
42
47
  "src/index.ts",
43
48
  "src/printers",
49
+ "src/safety",
44
50
  "src/sse-server.ts",
51
+ "src/slicer",
45
52
  "src/stl",
46
53
  "src/test/3DBenchy.3mf",
47
54
  "src/test/stl-manipulator-test.js",
@@ -49,7 +56,13 @@
49
56
  "src/test/tsconfig.json",
50
57
  "src/types.ts",
51
58
  "README.md",
52
- "LICENSE"
59
+ "LICENSE",
60
+ "dist/blender-mcp-bridge.js",
61
+ "dist/blender-mcp-bridge.d.ts",
62
+ "src/blender-mcp-bridge.ts",
63
+ "CHANGELOG.md",
64
+ "CONTRIBUTORS.md",
65
+ "server.json"
53
66
  ],
54
67
  "keywords": [
55
68
  "mcp",
@@ -66,14 +79,13 @@
66
79
  "author": "David Montgomery",
67
80
  "license": "GPL-2.0",
68
81
  "dependencies": {
69
- "@modelcontextprotocol/sdk": "^1.27.0",
70
- "axios": "^1.6.2",
71
- "bambu-js": "^2.2.2",
72
- "bambu-node": "^3.22.21",
73
- "basic-ftp": "^5.2.0",
74
- "dotenv": "^16.3.1",
75
- "form-data": "^4.0.0",
76
- "jszip": "^3.10.1",
82
+ "@modelcontextprotocol/sdk": "^1.32.1",
83
+ "axios": "^1.20.0",
84
+ "bambu-node": "3.22.21",
85
+ "basic-ftp": "^6.2.2",
86
+ "dotenv": "^16.6.1",
87
+ "form-data": "^4.0.6",
88
+ "jszip": "^3.10.2",
77
89
  "three": "^0.173.0",
78
90
  "xml2js": "^0.6.2",
79
91
  "zod": "^3.25.76"
@@ -83,6 +95,10 @@
83
95
  "@types/node": "^18.0.0",
84
96
  "@types/three": "^0.173.0",
85
97
  "@types/xml2js": "^0.4.14",
86
- "nodemon": "^2.0.22"
98
+ "nodemon": "^3.1.14",
99
+ "typescript": "~5.9.3"
100
+ },
101
+ "engines": {
102
+ "node": ">=18"
87
103
  }
88
104
  }
package/server.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.DMontgomery40/mcp-3d-printer-server",
4
+ "title": "MCP 3D Printer Server",
5
+ "description": "Control 3D printers, edit STL/3MF models, slice files, and connect Blender through MCP.",
6
+ "repository": {
7
+ "url": "https://github.com/DMontgomery40/mcp-3D-printer-server",
8
+ "source": "github"
9
+ },
10
+ "version": "1.2.11",
11
+ "packages": [
12
+ {
13
+ "registryType": "npm",
14
+ "identifier": "mcp-3d-printer-server",
15
+ "version": "1.2.11",
16
+ "runtimeHint": "npx",
17
+ "transport": { "type": "stdio" },
18
+ "environmentVariables": [
19
+ { "name": "PRINTER_TYPE", "description": "Printer backend: octoprint, klipper, duet, repetier, bambu, prusa, or creality.", "isRequired": true },
20
+ { "name": "PRINTER_HOST", "description": "Printer IP address or hostname.", "isRequired": true },
21
+ { "name": "PRINTER_PORT", "description": "Optional backend-specific port." },
22
+ { "name": "API_KEY", "description": "API key for printer backends that require authentication.", "isSecret": true },
23
+ { "name": "BAMBU_SERIAL", "description": "Printer serial number; required for Bambu Lab." },
24
+ { "name": "BAMBU_TOKEN", "description": "LAN access code; required for Bambu Lab.", "isSecret": true },
25
+ { "name": "BAMBU_MODEL", "description": "Exact Bambu model; required for Bambu print operations." }
26
+ ]
27
+ }
28
+ ]
29
+ }
package/src/3mf_parser.ts CHANGED
@@ -81,7 +81,7 @@ async function parseBambuConfig(zip: JSZip): Promise<Partial<BambuSlicerConfig>>
81
81
  if (file) {
82
82
  configFile = file;
83
83
  configContent = await file.async('string');
84
- console.log(`Found Bambu config file: ${configFile.name}`);
84
+ console.error(`Found Bambu config file: ${configFile.name}`);
85
85
  break; // Use the first one found (project usually has the most)
86
86
  }
87
87
  }
@@ -91,14 +91,14 @@ async function parseBambuConfig(zip: JSZip): Promise<Partial<BambuSlicerConfig>>
91
91
  // Attempt to parse as JSON
92
92
  const jsonData = JSON.parse(configContent);
93
93
  const parsedConfig = parseBambuJSONConfig(jsonData);
94
- console.log('Bambu config parsed successfully as JSON.');
94
+ console.error('Bambu config parsed successfully as JSON.');
95
95
  return parsedConfig;
96
96
  } catch (jsonError: any) {
97
97
  console.warn(`Failed to parse ${configFile.name} as JSON: ${jsonError.message}. Attempting INI parse as fallback...`);
98
98
  // Fallback: Try parsing as INI if JSON fails (though unlikely based on sample)
99
99
  try {
100
100
  const parsedConfig = parseFallbackINIConfig(configContent); // Keep a simple INI parser as fallback
101
- console.log('Bambu config parsed successfully as INI (fallback).');
101
+ console.error('Bambu config parsed successfully as INI (fallback).');
102
102
  return parsedConfig;
103
103
  } catch (iniError: any) {
104
104
  console.error(`Error parsing Bambu config ${configFile.name} as INI (fallback):`, iniError);
@@ -106,7 +106,7 @@ async function parseBambuConfig(zip: JSZip): Promise<Partial<BambuSlicerConfig>>
106
106
  }
107
107
  }
108
108
  } else {
109
- console.log('No Bambu-specific config file found in Metadata directory.');
109
+ console.error('No Bambu-specific config file found in Metadata directory.');
110
110
  return {};
111
111
  }
112
112
  }
@@ -181,7 +181,7 @@ async function parse3DModelConfig(zip: JSZip): Promise<{ metadata: ThreeMFMetada
181
181
  });
182
182
  }
183
183
 
184
- console.log('3dmodel.model parsed successfully.');
184
+ console.error('3dmodel.model parsed successfully.');
185
185
  return { metadata, objects, build: { items: buildItems } };
186
186
 
187
187
  } catch (error: any) {
@@ -193,14 +193,14 @@ async function parse3DModelConfig(zip: JSZip): Promise<{ metadata: ThreeMFMetada
193
193
  export { ThreeMFData };
194
194
 
195
195
  export async function parse3MF(filePath: string): Promise<ThreeMFData> {
196
- console.log(`Parsing 3MF file: ${filePath}`);
196
+ console.error(`Parsing 3MF file: ${filePath}`);
197
197
  try {
198
198
  const data = await fs.readFile(filePath);
199
199
  const zip = await JSZip.loadAsync(data);
200
200
 
201
201
  // List files for debugging
202
202
  // const fileList = Object.keys(zip.files);
203
- // console.log('Files in 3MF:', fileList);
203
+ // console.error('Files in 3MF:', fileList);
204
204
 
205
205
  const { metadata, objects, build } = await parse3DModelConfig(zip);
206
206
  const bambuConfig = await parseBambuConfig(zip);
@@ -213,7 +213,7 @@ export async function parse3MF(filePath: string): Promise<ThreeMFData> {
213
213
  slicerConfig: bambuConfig
214
214
  };
215
215
 
216
- console.log('3MF parsing completed.');
216
+ console.error('3MF parsing completed.');
217
217
  return combinedData;
218
218
 
219
219
  } catch (error: any) {