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.
- package/CHANGELOG.md +228 -0
- package/CONTRIBUTORS.md +49 -0
- package/README.md +529 -739
- package/dist/3mf_parser.js +8 -8
- package/dist/blender-mcp-bridge.d.ts +11 -0
- package/dist/blender-mcp-bridge.js +661 -0
- package/dist/fulu-orca.js +29 -5
- package/dist/index.js +752 -212
- package/dist/printers/bambu-node-guard.d.ts +2 -0
- package/dist/printers/bambu-node-guard.js +38 -0
- package/dist/printers/bambu.d.ts +53 -7
- package/dist/printers/bambu.js +420 -120
- package/dist/printers/creality.d.ts +15 -6
- package/dist/printers/creality.js +42 -9
- package/dist/printers/duet.d.ts +11 -6
- package/dist/printers/duet.js +57 -34
- package/dist/printers/generic-base.d.ts +69 -0
- package/dist/printers/generic-base.js +209 -0
- package/dist/printers/klipper.d.ts +17 -6
- package/dist/printers/klipper.js +63 -16
- package/dist/printers/octoprint.d.ts +18 -6
- package/dist/printers/octoprint.js +64 -9
- package/dist/printers/printer-factory.d.ts +11 -2
- package/dist/printers/printer-factory.js +9 -8
- package/dist/printers/prusa.d.ts +14 -6
- package/dist/printers/prusa.js +56 -9
- package/dist/printers/repetier.d.ts +18 -6
- package/dist/printers/repetier.js +48 -6
- package/dist/safety/archive.d.ts +11 -0
- package/dist/safety/archive.js +214 -0
- package/dist/safety/artifact.d.ts +6 -0
- package/dist/safety/artifact.js +66 -0
- package/dist/safety/confirmation.d.ts +22 -0
- package/dist/safety/confirmation.js +43 -0
- package/dist/safety/expected-peaks.d.ts +24 -0
- package/dist/safety/expected-peaks.js +24 -0
- package/dist/safety/gcode-thermal.d.ts +64 -0
- package/dist/safety/gcode-thermal.js +382 -0
- package/dist/safety/limits.d.ts +31 -0
- package/dist/safety/limits.js +105 -0
- package/dist/safety/print-file.d.ts +25 -0
- package/dist/safety/print-file.js +517 -0
- package/dist/safety/printer-state.d.ts +51 -0
- package/dist/safety/printer-state.js +365 -0
- package/dist/slicer/bambu-cli.d.ts +110 -0
- package/dist/slicer/bambu-cli.js +547 -0
- package/dist/slicer/profile-flatten.d.ts +104 -0
- package/dist/slicer/profile-flatten.js +676 -0
- package/dist/slicer/run-slicer.d.ts +18 -0
- package/dist/slicer/run-slicer.js +102 -0
- package/dist/slicer/slicer-error.d.ts +27 -0
- package/dist/slicer/slicer-error.js +53 -0
- package/dist/slicer/templates.d.ts +126 -0
- package/dist/slicer/templates.js +255 -0
- package/dist/stl/stl-manipulator.d.ts +25 -3
- package/dist/stl/stl-manipulator.js +214 -232
- package/package.json +30 -14
- package/server.json +29 -0
- package/src/3mf_parser.ts +8 -8
- package/src/blender-mcp-bridge.ts +611 -0
- package/src/fulu-orca.ts +36 -6
- package/src/index.ts +888 -255
- package/src/printers/bambu-node-guard.ts +44 -0
- package/src/printers/bambu.ts +458 -158
- package/src/printers/creality.ts +40 -9
- package/src/printers/duet.ts +64 -53
- package/src/printers/generic-base.ts +286 -0
- package/src/printers/klipper.ts +83 -28
- package/src/printers/octoprint.ts +74 -21
- package/src/printers/printer-factory.ts +21 -11
- package/src/printers/prusa.ts +53 -10
- package/src/printers/repetier.ts +55 -17
- package/src/safety/archive.ts +181 -0
- package/src/safety/artifact.ts +58 -0
- package/src/safety/confirmation.ts +56 -0
- package/src/safety/expected-peaks.ts +47 -0
- package/src/safety/gcode-thermal.ts +404 -0
- package/src/safety/limits.ts +98 -0
- package/src/safety/print-file.ts +354 -0
- package/src/safety/printer-state.ts +339 -0
- package/src/slicer/bambu-cli.ts +633 -0
- package/src/slicer/profile-flatten.ts +830 -0
- package/src/slicer/run-slicer.ts +126 -0
- package/src/slicer/slicer-error.ts +72 -0
- package/src/slicer/templates.ts +288 -0
- package/src/stl/stl-manipulator.ts +247 -275
- 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
|
-
"
|
|
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
|
|
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.
|
|
70
|
-
"axios": "^1.
|
|
71
|
-
"bambu-
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
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": "^
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
216
|
+
console.error('3MF parsing completed.');
|
|
217
217
|
return combinedData;
|
|
218
218
|
|
|
219
219
|
} catch (error: any) {
|