flowspec-mcp 2.0.1 → 2.1.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.
package/README.md CHANGED
@@ -46,7 +46,7 @@ Local mode connects to the FlowSpec desktop server at `http://localhost:3456`.
46
46
  |----------|----------|---------|-------------|
47
47
  | `FLOWSPEC_MODE` | No | `cloud` | `cloud` for direct Neon SQL, `local` for desktop server HTTP |
48
48
  | `DATABASE_URL` | Cloud mode | — | Neon Postgres connection string |
49
- | `FLOWSPEC_USER_ID` | Cloud mode | — | Clerk user ID for project ownership |
49
+ | `FLOWSPEC_USER_ID` | Cloud mode | — | Clerk user ID find yours at [flowspec.app/account](https://flowspec.app/account) |
50
50
  | `FLOWSPEC_LOCAL_URL` | No | `http://localhost:3456` | Desktop server URL (local mode) |
51
51
 
52
52
  ## Available Tools
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Normalises MCP input data into the format the FlowSpec web app expects.
3
+ *
4
+ * The MCP accepts a simplified schema (e.g. `dataType`, flat `constraints`
5
+ * string, `transformType`) for convenience when called by Claude Code.
6
+ * The web app's Svelte Flow components expect a stricter shape — this
7
+ * module bridges the two.
8
+ */
9
+ type NodeType = 'datapoint' | 'component' | 'transform' | 'table';
10
+ /**
11
+ * Normalise node data from the MCP's simplified input into the web-app format.
12
+ * Safe to call on data that's already in the correct format — it won't break it.
13
+ */
14
+ export declare function normaliseNodeData(nodeType: NodeType, data: Record<string, unknown>): Record<string, unknown>;
15
+ export {};
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Normalises MCP input data into the format the FlowSpec web app expects.
3
+ *
4
+ * The MCP accepts a simplified schema (e.g. `dataType`, flat `constraints`
5
+ * string, `transformType`) for convenience when called by Claude Code.
6
+ * The web app's Svelte Flow components expect a stricter shape — this
7
+ * module bridges the two.
8
+ */
9
+ function normaliseDataPoint(data) {
10
+ const out = { ...data };
11
+ // dataType → type (MCP uses 'dataType' to avoid collision with the node-level 'type')
12
+ if ('dataType' in out && !('type' in out)) {
13
+ out.type = out.dataType;
14
+ delete out.dataType;
15
+ }
16
+ // constraints: string → string[]
17
+ if (typeof out.constraints === 'string') {
18
+ out.constraints = out.constraints
19
+ ? out.constraints.split(',').map((s) => s.trim()).filter(Boolean)
20
+ : [];
21
+ }
22
+ if (!Array.isArray(out.constraints))
23
+ out.constraints = [];
24
+ // Defaults
25
+ if (!out.source)
26
+ out.source = 'captured';
27
+ if (out.sourceDefinition === undefined)
28
+ out.sourceDefinition = '';
29
+ return out;
30
+ }
31
+ function normaliseComponent(data) {
32
+ const out = { ...data };
33
+ if (!Array.isArray(out.displays))
34
+ out.displays = [];
35
+ if (!Array.isArray(out.captures))
36
+ out.captures = [];
37
+ return out;
38
+ }
39
+ function normaliseTransform(data) {
40
+ const out = { ...data };
41
+ // transformType → type
42
+ if ('transformType' in out && !('type' in out)) {
43
+ out.type = out.transformType;
44
+ delete out.transformType;
45
+ }
46
+ const transformType = out.type ?? 'formula';
47
+ // logic: string → { type, content }
48
+ if (typeof out.logic === 'string') {
49
+ const logicMap = {
50
+ formula: 'formula',
51
+ validation: 'formula',
52
+ workflow: 'steps',
53
+ };
54
+ out.logic = {
55
+ type: logicMap[transformType] ?? 'formula',
56
+ content: out.logic,
57
+ };
58
+ }
59
+ // Defaults
60
+ if (!out.description)
61
+ out.description = out.label ?? '';
62
+ if (!Array.isArray(out.inputs))
63
+ out.inputs = [];
64
+ if (!Array.isArray(out.outputs))
65
+ out.outputs = [];
66
+ return out;
67
+ }
68
+ /**
69
+ * Normalise node data from the MCP's simplified input into the web-app format.
70
+ * Safe to call on data that's already in the correct format — it won't break it.
71
+ */
72
+ export function normaliseNodeData(nodeType, data) {
73
+ switch (nodeType) {
74
+ case 'datapoint': return normaliseDataPoint(data);
75
+ case 'component': return normaliseComponent(data);
76
+ case 'transform': return normaliseTransform(data);
77
+ case 'table': return data; // table format already matches
78
+ default: return data;
79
+ }
80
+ }
81
+ //# sourceMappingURL=normalise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalise.js","sourceRoot":"","sources":["../src/normalise.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { createNodeViaApi } from '../db.js';
3
+ import { normaliseNodeData } from '../normalise.js';
3
4
  export const createNodeSchema = z.object({
4
5
  projectId: z.string().describe('UUID of the project'),
5
6
  type: z.enum(['datapoint', 'component', 'transform', 'table']).describe('Node type'),
@@ -10,10 +11,11 @@ export const createNodeSchema = z.object({
10
11
  data: z.record(z.unknown()).describe('Node data (label, type, constraints, etc. — varies by node type)'),
11
12
  });
12
13
  export async function handleCreateNode(args) {
14
+ const normalisedData = normaliseNodeData(args.type, args.data);
13
15
  const node = await createNodeViaApi(args.projectId, {
14
16
  type: args.type,
15
17
  position: args.position,
16
- data: args.data,
18
+ data: normalisedData,
17
19
  });
18
20
  if (!node) {
19
21
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"createNode.js","sourceRoot":"","sources":["../../src/tools/createNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACrD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IACpF,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC9C,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KAC/C,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,kEAAkE,CAAC;CACzG,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAsC;IAC3E,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE;QAClD,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,8CAA8C,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1G,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,WAAW,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,WAAW,IAAI,CAAC,EAAE,GAAG;aACrF,CAAC;KACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"createNode.js","sourceRoot":"","sources":["../../src/tools/createNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACrD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IACpF,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC9C,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KAC/C,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,kEAAkE,CAAC;CACzG,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAsC;IAC3E,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/D,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE;QAClD,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,cAAc;KACrB,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,8CAA8C,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1G,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,WAAW,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,WAAW,IAAI,CAAC,EAAE,GAAG;aACrF,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
- import { updateNodeViaApi } from '../db.js';
2
+ import { updateNodeViaApi, getProject } from '../db.js';
3
+ import { normaliseNodeData } from '../normalise.js';
3
4
  export const updateNodeSchema = z.object({
4
5
  projectId: z.string().describe('UUID of the project'),
5
6
  nodeId: z.string().describe('UUID of the node to update'),
@@ -11,8 +12,13 @@ export const updateNodeSchema = z.object({
11
12
  });
12
13
  export async function handleUpdateNode(args) {
13
14
  const updates = {};
14
- if (args.data)
15
- updates.data = args.data;
15
+ if (args.data) {
16
+ // Look up the existing node type so we can normalise correctly
17
+ const project = await getProject(args.projectId);
18
+ const existing = project?.canvas_state?.nodes?.find((n) => n.id === args.nodeId);
19
+ const nodeType = (existing?.type ?? 'datapoint');
20
+ updates.data = normaliseNodeData(nodeType, args.data);
21
+ }
16
22
  if (args.position)
17
23
  updates.position = args.position;
18
24
  const node = await updateNodeViaApi(args.projectId, args.nodeId, updates);
@@ -1 +1 @@
1
- {"version":3,"file":"updateNode.js","sourceRoot":"","sources":["../../src/tools/updateNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACrD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACzD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;IAC7G,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;QACb,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;KACd,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;CAC9C,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAsC;IAC3E,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxC,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAEpD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE1E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,8BAA8B,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACvF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gBAAgB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"updateNode.js","sourceRoot":"","sources":["../../src/tools/updateNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACrD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACzD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;IAC7G,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;QACb,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;KACd,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;CAC9C,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAsC;IAC3E,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,+DAA+D;QAC/D,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,IAAI,IAAI,WAAW,CAAsD,CAAC;QACtG,OAAO,CAAC,IAAI,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAEpD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE1E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,8BAA8B,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACvF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gBAAgB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flowspec-mcp",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "type": "module",
5
5
  "description": "MCP server for FlowSpec — exposes project specs to Claude Code",
6
6
  "bin": {