mcp-node-red 1.0.0

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 (41) hide show
  1. package/.github/workflows/ci.yml +37 -0
  2. package/.github/workflows/release.yml +30 -0
  3. package/.mcp.json.example +11 -0
  4. package/.releaserc.json +17 -0
  5. package/CHANGELOG.md +8 -0
  6. package/CLAUDE.md +147 -0
  7. package/LICENSE +21 -0
  8. package/README.md +330 -0
  9. package/dist/client.d.ts +20 -0
  10. package/dist/client.d.ts.map +1 -0
  11. package/dist/client.js +110 -0
  12. package/dist/client.js.map +1 -0
  13. package/dist/index.d.ts +3 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +7 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/schemas.d.ts +252 -0
  18. package/dist/schemas.d.ts.map +1 -0
  19. package/dist/schemas.js +44 -0
  20. package/dist/schemas.js.map +1 -0
  21. package/dist/server.d.ts +26 -0
  22. package/dist/server.d.ts.map +1 -0
  23. package/dist/server.js +121 -0
  24. package/dist/server.js.map +1 -0
  25. package/dist/tools/create-flow.d.ts +8 -0
  26. package/dist/tools/create-flow.d.ts.map +1 -0
  27. package/dist/tools/create-flow.js +26 -0
  28. package/dist/tools/create-flow.js.map +1 -0
  29. package/dist/tools/get-flows.d.ts +8 -0
  30. package/dist/tools/get-flows.d.ts.map +1 -0
  31. package/dist/tools/get-flows.js +12 -0
  32. package/dist/tools/get-flows.js.map +1 -0
  33. package/dist/tools/update-flow.d.ts +8 -0
  34. package/dist/tools/update-flow.d.ts.map +1 -0
  35. package/dist/tools/update-flow.js +32 -0
  36. package/dist/tools/update-flow.js.map +1 -0
  37. package/dist/tools/validate-flow.d.ts +8 -0
  38. package/dist/tools/validate-flow.d.ts.map +1 -0
  39. package/dist/tools/validate-flow.js +36 -0
  40. package/dist/tools/validate-flow.js.map +1 -0
  41. package/package.json +46 -0
@@ -0,0 +1,12 @@
1
+ export async function getFlows(client) {
2
+ const result = await client.getFlows();
3
+ return {
4
+ content: [
5
+ {
6
+ type: 'text',
7
+ text: JSON.stringify(result, null, 2),
8
+ },
9
+ ],
10
+ };
11
+ }
12
+ //# sourceMappingURL=get-flows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-flows.js","sourceRoot":"","sources":["../../src/tools/get-flows.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAqB;IAClD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;IACvC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aACtC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { NodeRedClient } from '../client.js';
2
+ export declare function updateFlow(client: NodeRedClient, args: unknown): Promise<{
3
+ content: {
4
+ type: "text";
5
+ text: string;
6
+ }[];
7
+ }>;
8
+ //# sourceMappingURL=update-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-flow.d.ts","sourceRoot":"","sources":["../../src/tools/update-flow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAQlD,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO;;;;;GA8BpE"}
@@ -0,0 +1,32 @@
1
+ import { z } from 'zod';
2
+ import { UpdateFlowRequestSchema } from '../schemas.js';
3
+ const UpdateFlowArgsSchema = z.object({
4
+ flowId: z.string(),
5
+ updates: z.string(),
6
+ });
7
+ export async function updateFlow(client, args) {
8
+ const parsed = UpdateFlowArgsSchema.parse(args);
9
+ let flowData;
10
+ try {
11
+ flowData = JSON.parse(parsed.updates);
12
+ }
13
+ catch (error) {
14
+ throw new Error(`Invalid JSON in updates parameter: ${error instanceof Error ? error.message : String(error)}`);
15
+ }
16
+ // Ensure id matches flowId parameter
17
+ const updateData = {
18
+ ...(typeof flowData === 'object' && flowData !== null ? flowData : {}),
19
+ id: parsed.flowId,
20
+ };
21
+ const validated = UpdateFlowRequestSchema.parse(updateData);
22
+ const result = await client.updateFlow(parsed.flowId, validated);
23
+ return {
24
+ content: [
25
+ {
26
+ type: 'text',
27
+ text: JSON.stringify(result, null, 2),
28
+ },
29
+ ],
30
+ };
31
+ }
32
+ //# sourceMappingURL=update-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-flow.js","sourceRoot":"","sources":["../../src/tools/update-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAqB,EAAE,IAAa;IACnE,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEhD,IAAI,QAAiB,CAAC;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,sCAAsC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC/F,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,EAAE,EAAE,MAAM,CAAC,MAAM;KAClB,CAAC;IAEF,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEjE,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aACtC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { NodeRedClient } from '../client.js';
2
+ export declare function validateFlow(client: NodeRedClient, args: unknown): Promise<{
3
+ content: {
4
+ type: "text";
5
+ text: string;
6
+ }[];
7
+ }>;
8
+ //# sourceMappingURL=validate-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-flow.d.ts","sourceRoot":"","sources":["../../src/tools/validate-flow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAOlD,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO;;;;;GAmCtE"}
@@ -0,0 +1,36 @@
1
+ import { z } from 'zod';
2
+ import { UpdateFlowRequestSchema } from '../schemas.js';
3
+ const ValidateFlowArgsSchema = z.object({
4
+ flow: z.string(),
5
+ });
6
+ export async function validateFlow(client, args) {
7
+ const parsed = ValidateFlowArgsSchema.parse(args);
8
+ let flowData;
9
+ try {
10
+ flowData = JSON.parse(parsed.flow);
11
+ }
12
+ catch (error) {
13
+ return {
14
+ content: [
15
+ {
16
+ type: 'text',
17
+ text: JSON.stringify({
18
+ valid: false,
19
+ errors: [`Invalid JSON: ${error instanceof Error ? error.message : String(error)}`],
20
+ }, null, 2),
21
+ },
22
+ ],
23
+ };
24
+ }
25
+ const validated = UpdateFlowRequestSchema.parse(flowData);
26
+ const result = await client.validateFlow(validated);
27
+ return {
28
+ content: [
29
+ {
30
+ type: 'text',
31
+ text: JSON.stringify(result, null, 2),
32
+ },
33
+ ],
34
+ };
35
+ }
36
+ //# sourceMappingURL=validate-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-flow.js","sourceRoot":"","sources":["../../src/tools/validate-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAqB,EAAE,IAAa;IACrE,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElD,IAAI,QAAiB,CAAC;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,KAAK,EAAE,KAAK;wBACZ,MAAM,EAAE,CAAC,iBAAiB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;qBACpF,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAEpD,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aACtC;SACF;KACF,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "mcp-node-red",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for Node-RED workflow management",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "mcp-node-red": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "test": "vitest run",
14
+ "test:coverage": "vitest run --coverage",
15
+ "lint": "biome check .",
16
+ "lint:fix": "biome check --write .",
17
+ "format": "biome format --write ."
18
+ },
19
+ "keywords": [
20
+ "mcp",
21
+ "node-red",
22
+ "model-context-protocol",
23
+ "workflow",
24
+ "automation"
25
+ ],
26
+ "author": "",
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "@modelcontextprotocol/sdk": "^1.0.4",
30
+ "undici": "^7.3.0",
31
+ "zod": "^3.24.1"
32
+ },
33
+ "devDependencies": {
34
+ "@biomejs/biome": "^1.9.4",
35
+ "@semantic-release/changelog": "^6.0.3",
36
+ "@semantic-release/git": "^10.0.1",
37
+ "@types/node": "^22.10.5",
38
+ "@vitest/coverage-v8": "^2.1.8",
39
+ "semantic-release": "^24.2.9",
40
+ "typescript": "^5.7.2",
41
+ "vitest": "^2.1.8"
42
+ },
43
+ "engines": {
44
+ "node": ">=20"
45
+ }
46
+ }