flowspec-mcp 2.0.0 → 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 +1 -1
- package/dist/db.js +2 -1
- package/dist/db.js.map +1 -1
- package/dist/normalise.d.ts +15 -0
- package/dist/normalise.js +81 -0
- package/dist/normalise.js.map +1 -0
- package/dist/tools/createNode.js +3 -1
- package/dist/tools/createNode.js.map +1 -1
- package/dist/tools/listProjects.js +6 -1
- package/dist/tools/listProjects.js.map +1 -1
- package/dist/tools/updateNode.js +9 -3
- package/dist/tools/updateNode.js.map +1 -1
- package/package.json +1 -1
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
|
|
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
|
package/dist/db.js
CHANGED
|
@@ -9,7 +9,8 @@ if (MODE === 'cloud') {
|
|
|
9
9
|
throw new Error('DATABASE_URL environment variable is required in cloud mode');
|
|
10
10
|
FLOWSPEC_USER_ID = process.env.FLOWSPEC_USER_ID ?? null;
|
|
11
11
|
if (!FLOWSPEC_USER_ID)
|
|
12
|
-
throw new Error('FLOWSPEC_USER_ID environment variable is required in cloud mode'
|
|
12
|
+
throw new Error('FLOWSPEC_USER_ID environment variable is required in cloud mode.\n' +
|
|
13
|
+
'Find your User ID at: https://flowspec.app/account (under "MCP Configuration").');
|
|
13
14
|
sql = neon(DATABASE_URL);
|
|
14
15
|
}
|
|
15
16
|
// ─── Local mode (HTTP to desktop server) ───────────────────────────
|
package/dist/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAOtE,IAAI,GAAG,GAAmB,IAAI,CAAC;AAC/B,IAAI,gBAAgB,GAAkB,IAAI,CAAC;AAE3C,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;IACrB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC9C,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAClG,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC;IACxD,IAAI,CAAC,gBAAgB;QAAE,MAAM,IAAI,KAAK,
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|
package/dist/tools/createNode.js
CHANGED
|
@@ -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:
|
|
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;
|
|
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,10 +1,15 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { listProjects } from '../db.js';
|
|
3
|
+
import { MODE } from '../config.js';
|
|
3
4
|
export const listProjectsSchema = z.object({});
|
|
4
5
|
export async function handleListProjects() {
|
|
5
6
|
const projects = await listProjects();
|
|
6
7
|
if (projects.length === 0) {
|
|
7
|
-
|
|
8
|
+
const hint = MODE === 'cloud'
|
|
9
|
+
? ' If you expected to see projects, your FLOWSPEC_USER_ID may be incorrect. ' +
|
|
10
|
+
'Find your correct User ID at: https://flowspec.app/account (under "MCP Configuration").'
|
|
11
|
+
: '';
|
|
12
|
+
return { content: [{ type: 'text', text: `No projects found.${hint}` }] };
|
|
8
13
|
}
|
|
9
14
|
const lines = projects.map((p) => `- **${p.name}** (id: ${p.id}) — updated ${p.updated_at}`);
|
|
10
15
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listProjects.js","sourceRoot":"","sources":["../../src/tools/listProjects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"listProjects.js","sourceRoot":"","sources":["../../src/tools/listProjects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,KAAK,OAAO;YAC3B,CAAC,CAAC,4EAA4E;gBAC5E,yFAAyF;YAC3F,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qBAAqB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;IACrF,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,UAAU,EAAE,CACjE,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,QAAQ,CAAC,MAAM,mBAAmB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;KAC1G,CAAC;AACJ,CAAC"}
|
package/dist/tools/updateNode.js
CHANGED
|
@@ -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
|
-
|
|
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;
|
|
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"}
|