@gmag11/nodered-mcp-server 1.0.1
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/LICENSE +201 -0
- package/README.md +162 -0
- package/index.js +133 -0
- package/package.json +58 -0
- package/resources/skills/nodered-flow-builder/SKILL.md +659 -0
- package/resources/skills/nodered-flow-layout/SKILL.md +395 -0
- package/resources/skills/nodered-flowfuse-dashboard/SKILL.md +941 -0
- package/resources/skills/nodered-fundamentals/SKILL.md +323 -0
- package/resources/skills/nodered-jsonata/SKILL.md +1039 -0
- package/resources/skills/nodered-mustache/SKILL.md +588 -0
- package/resources/skills/nodered-node-reference/SKILL.md +1020 -0
- package/resources/skills/nodered-node-reference/examples/common.json +113 -0
- package/resources/skills/nodered-node-reference/examples/network.json +107 -0
- package/resources/skills/nodered-node-reference/examples/parser.json +147 -0
- package/resources/skills/nodered-node-reference/examples/sequence.json +141 -0
- package/resources/skills/nodered-node-reference/examples/storage.json +104 -0
- package/resources/skills/nodered-patterns/SKILL.md +414 -0
- package/resources/skills/nodered-patterns/examples/error-handler.json +72 -0
- package/resources/skills/nodered-patterns/examples/http-endpoint.json +42 -0
- package/resources/skills/nodered-patterns/examples/mqtt-subscriber.json +47 -0
- package/resources/skills/nodered-patterns/examples/timer-flow.json +50 -0
- package/resources/skills/nodered-subflows/SKILL.md +261 -0
- package/resources/skills/nodered-uibuilder/SKILL.md +500 -0
- package/src/auth/api-key-verifier.js +36 -0
- package/src/auth/composite-verifier.js +59 -0
- package/src/auth/config.js +106 -0
- package/src/auth/oauth-clients-store.js +107 -0
- package/src/auth/oauth-provider.js +149 -0
- package/src/auth/oauth-token-store.js +312 -0
- package/src/nodered/auth.js +158 -0
- package/src/nodered/client.js +199 -0
- package/src/nodered/comms-client.js +500 -0
- package/src/renderer/colors.js +161 -0
- package/src/renderer/geometry.js +115 -0
- package/src/renderer/html-builder.js +571 -0
- package/src/renderer/index.js +51 -0
- package/src/renderer/ir-builder.js +161 -0
- package/src/renderer/layout.js +126 -0
- package/src/renderer/mermaid-builder.js +109 -0
- package/src/renderer/svg-builder.js +228 -0
- package/src/schemas/responses.js +283 -0
- package/src/server.js +844 -0
- package/src/skills/loader.js +84 -0
- package/src/staging-store.js +258 -0
- package/src/tools/add-nodes-to-group.js +216 -0
- package/src/tools/connect-nodes.js +115 -0
- package/src/tools/constants.js +45 -0
- package/src/tools/create-flow.js +87 -0
- package/src/tools/create-node.js +126 -0
- package/src/tools/create-subflow-instance.js +123 -0
- package/src/tools/create-subflow.js +101 -0
- package/src/tools/delete-context.js +60 -0
- package/src/tools/delete-flow.js +81 -0
- package/src/tools/delete-group.js +116 -0
- package/src/tools/delete-node.js +73 -0
- package/src/tools/delete-subflow.js +103 -0
- package/src/tools/deploy.js +94 -0
- package/src/tools/disconnect-nodes.js +158 -0
- package/src/tools/export-flow.js +161 -0
- package/src/tools/export-subflow.js +78 -0
- package/src/tools/flow-utils.js +376 -0
- package/src/tools/get-config-nodes.js +86 -0
- package/src/tools/get-context.js +76 -0
- package/src/tools/get-flow-diagram.js +99 -0
- package/src/tools/get-flow-nodes.js +116 -0
- package/src/tools/get-flows.js +74 -0
- package/src/tools/get-node-detail.js +77 -0
- package/src/tools/get-node-type-detail.js +92 -0
- package/src/tools/get-palette-nodes.js +63 -0
- package/src/tools/get-staging-status.js +34 -0
- package/src/tools/get-subflow-detail.js +110 -0
- package/src/tools/get-subflows.js +105 -0
- package/src/tools/import-flow.js +310 -0
- package/src/tools/inject-message.js +117 -0
- package/src/tools/install-node.js +31 -0
- package/src/tools/read-debug-messages.js +155 -0
- package/src/tools/refresh-staging.js +62 -0
- package/src/tools/remove-nodes-from-group.js +162 -0
- package/src/tools/render-staging.js +69 -0
- package/src/tools/response-utils.js +42 -0
- package/src/tools/search-nodes.js +134 -0
- package/src/tools/uninstall-node.js +31 -0
- package/src/tools/update-flow.js +95 -0
- package/src/tools/update-group.js +77 -0
- package/src/tools/update-node.js +132 -0
- package/src/tools/update-subflow.js +84 -0
- package/src/transport/http.js +252 -0
- package/src/transport/stdio.js +16 -0
- package/src/transport/ws-server.js +223 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire Geometry — Bezier Path Generation
|
|
3
|
+
*
|
|
4
|
+
* Ported from Node-RED's view.js `generateLinkPath()` function
|
|
5
|
+
* (Apache 2.0 license, Copyright JS Foundation and other contributors).
|
|
6
|
+
*
|
|
7
|
+
* Generates SVG path `d` attribute strings for cubic Bézier curves
|
|
8
|
+
* connecting two nodes, matching Node-RED's visual wire style.
|
|
9
|
+
*
|
|
10
|
+
* @module renderer/geometry
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// Constants matching Node-RED view.js
|
|
14
|
+
const NODE_WIDTH = 100;
|
|
15
|
+
const NODE_HEIGHT = 30;
|
|
16
|
+
const LINE_CURVE_SCALE = 0.75;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Generate an SVG path `d` string for a cubic Bézier wire between two nodes.
|
|
20
|
+
*
|
|
21
|
+
* Adapted from Node-RED's `generateLinkPath()` in
|
|
22
|
+
* packages/node_modules/@node-red/editor-client/src/js/ui/view.js
|
|
23
|
+
*
|
|
24
|
+
* @param {number} origX - Source node right-edge X
|
|
25
|
+
* @param {number} origY - Source port Y
|
|
26
|
+
* @param {number} destX - Target node left-edge X
|
|
27
|
+
* @param {number} destY - Target port Y
|
|
28
|
+
* @param {number} sc - Direction: 1 for left→right, -1 for right→left
|
|
29
|
+
* @param {boolean} [hasStatus=false] - Whether the source/target node has status (adds vertical offset)
|
|
30
|
+
* @returns {string} SVG path `d` attribute
|
|
31
|
+
*/
|
|
32
|
+
export function generateLinkPath(origX, origY, destX, destY, sc, hasStatus = false) {
|
|
33
|
+
const dy = destY - origY;
|
|
34
|
+
const dx = destX - origX;
|
|
35
|
+
const delta = Math.sqrt(dy * dy + dx * dx);
|
|
36
|
+
let scale = LINE_CURVE_SCALE;
|
|
37
|
+
let scaleY = 0;
|
|
38
|
+
|
|
39
|
+
if (dx * sc > 0) {
|
|
40
|
+
if (delta < NODE_WIDTH) {
|
|
41
|
+
scale = 0.75 - 0.75 * ((NODE_WIDTH - delta) / NODE_WIDTH);
|
|
42
|
+
}
|
|
43
|
+
} else {
|
|
44
|
+
scale = 0.4 - 0.2 * (Math.max(0, (NODE_WIDTH - Math.min(Math.abs(dx), Math.abs(dy))) / NODE_WIDTH));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (dx * sc > 0) {
|
|
48
|
+
// Horizontal connection: smooth S-curve
|
|
49
|
+
const cp = [
|
|
50
|
+
[origX + sc * (NODE_WIDTH * scale), origY + scaleY * NODE_HEIGHT],
|
|
51
|
+
[destX - sc * scale * NODE_WIDTH, destY - scaleY * NODE_HEIGHT],
|
|
52
|
+
];
|
|
53
|
+
return `M ${origX} ${origY} C ${cp[0][0]} ${cp[0][1]} ${cp[1][0]} ${cp[1][1]} ${destX} ${destY}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Vertical or reversed connection: L-shaped with rounded corners
|
|
57
|
+
const midX = Math.floor(destX - dx / 2);
|
|
58
|
+
const midY = Math.floor(destY - dy / 2);
|
|
59
|
+
|
|
60
|
+
if (Math.abs(dy) < 10) {
|
|
61
|
+
// Nearly horizontal: draw below nodes
|
|
62
|
+
const bottomY = Math.max(origY, destY) + (hasStatus ? 35 : 25);
|
|
63
|
+
const startCurveHeight = bottomY - origY;
|
|
64
|
+
const endCurveHeight = bottomY - destY;
|
|
65
|
+
|
|
66
|
+
const cp = [
|
|
67
|
+
[origX + sc * 15, origY],
|
|
68
|
+
[origX + sc * 25, origY + 5],
|
|
69
|
+
[origX + sc * 25, origY + startCurveHeight / 2],
|
|
70
|
+
[origX + sc * 25, origY + startCurveHeight - 5],
|
|
71
|
+
[origX + sc * 15, origY + startCurveHeight],
|
|
72
|
+
[origX, origY + startCurveHeight],
|
|
73
|
+
[destX - sc * 15, origY + startCurveHeight],
|
|
74
|
+
[destX - sc * 25, origY + startCurveHeight - 5],
|
|
75
|
+
[destX - sc * 25, destY + endCurveHeight / 2],
|
|
76
|
+
[destX - sc * 25, destY + 5],
|
|
77
|
+
[destX - sc * 15, destY],
|
|
78
|
+
[destX, destY],
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
return (
|
|
82
|
+
`M ${origX} ${origY}` +
|
|
83
|
+
` C ${cp[0][0]} ${cp[0][1]} ${cp[1][0]} ${cp[1][1]} ${cp[2][0]} ${cp[2][1]}` +
|
|
84
|
+
` C ${cp[3][0]} ${cp[3][1]} ${cp[4][0]} ${cp[4][1]} ${cp[5][0]} ${cp[5][1]}` +
|
|
85
|
+
` h ${dx}` +
|
|
86
|
+
` C ${cp[6][0]} ${cp[6][1]} ${cp[7][0]} ${cp[7][1]} ${cp[8][0]} ${cp[8][1]}` +
|
|
87
|
+
` C ${cp[9][0]} ${cp[9][1]} ${cp[10][0]} ${cp[10][1]} ${cp[11][0]} ${cp[11][1]}`
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Vertical stack: L-shaped path
|
|
92
|
+
const cpHeight = NODE_HEIGHT / 2;
|
|
93
|
+
const y1 = (destY + midY) / 2;
|
|
94
|
+
const topX = origX + sc * NODE_WIDTH * scale;
|
|
95
|
+
const topY = dy > 0 ? Math.min(y1 - dy / 2, origY + cpHeight) : Math.max(y1 - dy / 2, origY - cpHeight);
|
|
96
|
+
const bottomX = destX - sc * NODE_WIDTH * scale;
|
|
97
|
+
const bottomY = dy > 0 ? Math.max(y1, destY - cpHeight) : Math.min(y1, destY + cpHeight);
|
|
98
|
+
const x1 = (origX + topX) / 2;
|
|
99
|
+
|
|
100
|
+
const cp = [
|
|
101
|
+
[x1, origY],
|
|
102
|
+
[topX, dy > 0 ? Math.max(origY, topY - cpHeight) : Math.min(origY, topY + cpHeight)],
|
|
103
|
+
[x1, dy > 0 ? Math.min(midY, topY + cpHeight) : Math.max(midY, topY - cpHeight)],
|
|
104
|
+
[bottomX, dy > 0 ? Math.max(midY, bottomY - cpHeight) : Math.min(midY, bottomY + cpHeight)],
|
|
105
|
+
[(destX + bottomX) / 2, destY],
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
return (
|
|
109
|
+
`M ${origX} ${origY}` +
|
|
110
|
+
` C ${cp[0][0]} ${cp[0][1]} ${cp[1][0]} ${cp[1][1]} ${topX} ${topY}` +
|
|
111
|
+
` S ${cp[2][0]} ${cp[2][1]} ${midX} ${midY}` +
|
|
112
|
+
` S ${cp[3][0]} ${cp[3][1]} ${bottomX} ${bottomY}` +
|
|
113
|
+
` S ${cp[4][0]} ${cp[4][1]} ${destX} ${destY}`
|
|
114
|
+
);
|
|
115
|
+
}
|