flowspec-mcp 4.2.2 → 5.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.
@@ -0,0 +1,6 @@
1
+ import type { CanvasNode, CanvasEdge, Screen } from '../types.js';
2
+ /**
3
+ * Exports canvas state to JSON specification optimised for Claude Code.
4
+ * Adapted from web app — uses plain interfaces instead of @xyflow/svelte types.
5
+ */
6
+ export declare function exportToJson(nodes: CanvasNode[], edges: CanvasEdge[], projectName?: string, screens?: Screen[]): string;
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Exports canvas state to JSON specification optimised for Claude Code.
3
+ * Adapted from web app — uses plain interfaces instead of @xyflow/svelte types.
4
+ */
5
+ export function exportToJson(nodes, edges, projectName = 'Untitled Project', screens = []) {
6
+ const exportableNodes = nodes.filter((n) => n.type !== 'image' && n.type !== 'screen');
7
+ const dataPointNodes = exportableNodes.filter((n) => n.type === 'datapoint');
8
+ const componentNodes = exportableNodes.filter((n) => n.type === 'component');
9
+ const transformNodes = exportableNodes.filter((n) => n.type === 'transform');
10
+ const tableNodes = exportableNodes.filter((n) => n.type === 'table');
11
+ const locationMap = buildLocationMap(dataPointNodes, componentNodes, edges);
12
+ // Build node label lookup for screen region export
13
+ const nodeLabelMap = new Map();
14
+ for (const n of exportableNodes) {
15
+ const label = n.data.label ?? 'Untitled';
16
+ nodeLabelMap.set(n.id, { label, type: n.type ?? 'unknown' });
17
+ }
18
+ const spec = {
19
+ version: '1.2.0',
20
+ metadata: {
21
+ projectName,
22
+ exportedAt: new Date().toISOString(),
23
+ nodeCount: exportableNodes.length,
24
+ edgeCount: edges.length,
25
+ },
26
+ dataPoints: dataPointNodes.map((node) => {
27
+ const data = node.data;
28
+ return {
29
+ id: node.id,
30
+ label: data.label,
31
+ type: data.type,
32
+ source: data.source,
33
+ sourceDefinition: data.sourceDefinition,
34
+ constraints: data.constraints,
35
+ locations: locationMap.get(node.id) ?? [],
36
+ };
37
+ }),
38
+ components: componentNodes.map((node) => {
39
+ const data = node.data;
40
+ const result = {
41
+ id: node.id,
42
+ label: data.label,
43
+ displays: data.displays,
44
+ captures: data.captures,
45
+ };
46
+ if (data.wireframeRef) {
47
+ result.wireframeRef = data.wireframeRef;
48
+ }
49
+ return result;
50
+ }),
51
+ transforms: transformNodes.map((node) => {
52
+ const data = node.data;
53
+ return {
54
+ id: node.id,
55
+ type: data.type,
56
+ description: data.description,
57
+ inputs: data.inputs,
58
+ outputs: data.outputs,
59
+ logic: data.logic,
60
+ };
61
+ }),
62
+ dataFlow: edges.filter((e) => {
63
+ return e.data?.edgeType !== 'contains';
64
+ }).map((edge) => {
65
+ const result = {
66
+ from: edge.source,
67
+ to: edge.target,
68
+ edgeType: edge.data?.edgeType ?? 'flows-to',
69
+ };
70
+ if (edge.data?.label) {
71
+ result.label = edge.data.label;
72
+ }
73
+ return result;
74
+ }),
75
+ };
76
+ // Add tables section if table nodes exist
77
+ if (tableNodes.length > 0) {
78
+ spec.tables = tableNodes.map((node) => {
79
+ const data = node.data;
80
+ const result = {
81
+ id: node.id,
82
+ label: data.label,
83
+ sourceType: data.sourceType,
84
+ columns: (data.columns ?? []).map((c) => ({ name: c.name, type: c.type })),
85
+ };
86
+ if (data.endpoint) {
87
+ result.endpoint = data.endpoint;
88
+ }
89
+ return result;
90
+ });
91
+ }
92
+ // Add screens section if screens exist
93
+ if (screens.length > 0) {
94
+ spec.screens = screens.map((sc) => ({
95
+ id: sc.id,
96
+ name: sc.name,
97
+ imageFilename: sc.imageFilename,
98
+ regions: sc.regions.map((r) => {
99
+ const region = {
100
+ id: r.id,
101
+ label: r.label,
102
+ position: {
103
+ x: Math.round(r.position.x * 10) / 10,
104
+ y: Math.round(r.position.y * 10) / 10,
105
+ },
106
+ size: {
107
+ width: Math.round(r.size.width * 10) / 10,
108
+ height: Math.round(r.size.height * 10) / 10,
109
+ },
110
+ elements: r.elementIds.map((eid) => {
111
+ const info = nodeLabelMap.get(eid);
112
+ return {
113
+ nodeId: eid,
114
+ nodeLabel: info?.label ?? 'Missing element',
115
+ nodeType: info?.type ?? 'unknown',
116
+ };
117
+ }),
118
+ };
119
+ if (r.componentNodeId) {
120
+ region.componentNodeId = r.componentNodeId;
121
+ }
122
+ return region;
123
+ }),
124
+ }));
125
+ }
126
+ return JSON.stringify(spec, null, 2);
127
+ }
128
+ function buildLocationMap(dataPoints, components, edges) {
129
+ const map = new Map();
130
+ for (const dp of dataPoints) {
131
+ map.set(dp.id, []);
132
+ }
133
+ for (const edge of edges) {
134
+ const sourceIsDataPoint = dataPoints.some((n) => n.id === edge.source);
135
+ const targetIsComponent = components.some((n) => n.id === edge.target);
136
+ if (sourceIsDataPoint && targetIsComponent) {
137
+ const locations = map.get(edge.source) ?? [];
138
+ locations.push({ component: edge.target, role: 'output' });
139
+ map.set(edge.source, locations);
140
+ }
141
+ const sourceIsComponent = components.some((n) => n.id === edge.source);
142
+ const targetIsDataPoint = dataPoints.some((n) => n.id === edge.target);
143
+ if (sourceIsComponent && targetIsDataPoint) {
144
+ const locations = map.get(edge.target) ?? [];
145
+ locations.push({ component: edge.source, role: 'input' });
146
+ map.set(edge.target, locations);
147
+ }
148
+ }
149
+ return map;
150
+ }
151
+ //# sourceMappingURL=jsonExporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonExporter.js","sourceRoot":"","sources":["../../src/export/jsonExporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Converts a validated JSON spec back into FlowSpec canvas nodes and edges.
3
+ * Ported from src/lib/import/yamlImporter.ts — uses MCP types, no @xyflow deps.
4
+ * Lenient: uses sensible defaults for missing fields, skips broken edges.
5
+ */
6
+ import type { CanvasNode, CanvasEdge, Screen } from '../types.js';
7
+ export interface ImportResult {
8
+ nodes: CanvasNode[];
9
+ edges: CanvasEdge[];
10
+ screens: Screen[];
11
+ projectName: string;
12
+ stats: {
13
+ dataPoints: number;
14
+ components: number;
15
+ transforms: number;
16
+ tables: number;
17
+ edges: number;
18
+ skippedEdges: number;
19
+ skippedNodes: number;
20
+ };
21
+ }
22
+ export declare function importFromJson(spec: Record<string, unknown>): ImportResult;
@@ -0,0 +1,227 @@
1
+ export function importFromJson(spec) {
2
+ const metadata = (spec.metadata ?? {});
3
+ const projectName = metadata.projectName ?? 'Imported Project';
4
+ const rawDataPoints = spec.dataPoints ?? [];
5
+ const rawComponents = spec.components ?? [];
6
+ const rawTransforms = spec.transforms ?? [];
7
+ const rawDataFlow = spec.dataFlow ?? [];
8
+ const rawTables = spec.tables ?? [];
9
+ const nodes = [];
10
+ const seenIds = new Set();
11
+ let skippedNodes = 0;
12
+ // --- DataPoints ---
13
+ for (const dp of rawDataPoints) {
14
+ const id = dp.id;
15
+ if (!id || seenIds.has(id)) {
16
+ skippedNodes++;
17
+ continue;
18
+ }
19
+ seenIds.add(id);
20
+ nodes.push({
21
+ id,
22
+ type: 'datapoint',
23
+ position: { x: 0, y: 0 },
24
+ data: {
25
+ label: dp.label ?? 'Untitled',
26
+ type: validDataType(dp.type),
27
+ source: validSource(dp.source),
28
+ sourceDefinition: dp.sourceDefinition ?? '',
29
+ constraints: Array.isArray(dp.constraints) ? dp.constraints : []
30
+ }
31
+ });
32
+ }
33
+ // --- Components ---
34
+ for (const comp of rawComponents) {
35
+ const id = comp.id;
36
+ if (!id || seenIds.has(id)) {
37
+ skippedNodes++;
38
+ continue;
39
+ }
40
+ seenIds.add(id);
41
+ const data = {
42
+ label: comp.label ?? 'Untitled Component',
43
+ displays: Array.isArray(comp.displays) ? comp.displays : [],
44
+ captures: Array.isArray(comp.captures) ? comp.captures : []
45
+ };
46
+ if (comp.wireframeRef) {
47
+ data.wireframeRef = comp.wireframeRef;
48
+ }
49
+ nodes.push({ id, type: 'component', position: { x: 0, y: 0 }, data });
50
+ }
51
+ // --- Transforms ---
52
+ for (const tx of rawTransforms) {
53
+ const id = tx.id;
54
+ if (!id || seenIds.has(id)) {
55
+ skippedNodes++;
56
+ continue;
57
+ }
58
+ seenIds.add(id);
59
+ const description = tx.description ?? '';
60
+ const rawLogic = (tx.logic ?? {});
61
+ nodes.push({
62
+ id,
63
+ type: 'transform',
64
+ position: { x: 0, y: 0 },
65
+ data: {
66
+ label: description || 'Untitled Transform',
67
+ type: validLogicType(tx.type),
68
+ description,
69
+ inputs: Array.isArray(tx.inputs) ? tx.inputs : [],
70
+ outputs: Array.isArray(tx.outputs) ? tx.outputs : [],
71
+ logic: {
72
+ type: validLogicContentType(rawLogic.type),
73
+ content: rawLogic.content ?? ''
74
+ }
75
+ }
76
+ });
77
+ }
78
+ // --- Tables ---
79
+ for (const tbl of rawTables) {
80
+ const id = tbl.id;
81
+ if (!id || seenIds.has(id)) {
82
+ skippedNodes++;
83
+ continue;
84
+ }
85
+ seenIds.add(id);
86
+ const rawColumns = Array.isArray(tbl.columns) ? tbl.columns : [];
87
+ const columns = rawColumns.map((c) => ({
88
+ name: c.name ?? '',
89
+ type: validDataType(c.type)
90
+ }));
91
+ nodes.push({
92
+ id,
93
+ type: 'table',
94
+ position: { x: 0, y: 0 },
95
+ data: {
96
+ label: tbl.label ?? 'Untitled Table',
97
+ sourceType: validTableSourceType(tbl.sourceType),
98
+ columns,
99
+ endpoint: tbl.endpoint ?? ''
100
+ }
101
+ });
102
+ }
103
+ // --- Edges (no markerEnd — visual-only, not needed in canvas_state) ---
104
+ const edges = [];
105
+ let skippedEdges = 0;
106
+ for (const flow of rawDataFlow) {
107
+ const from = flow.from;
108
+ const to = flow.to;
109
+ if (!from || !to || !seenIds.has(from) || !seenIds.has(to)) {
110
+ skippedEdges++;
111
+ continue;
112
+ }
113
+ const edgeData = {
114
+ edgeType: validEdgeType(flow.edgeType)
115
+ };
116
+ if (flow.label) {
117
+ edgeData.label = flow.label;
118
+ }
119
+ edges.push({
120
+ id: crypto.randomUUID(),
121
+ source: from,
122
+ target: to,
123
+ type: 'typed',
124
+ data: edgeData
125
+ });
126
+ }
127
+ // --- Screens (import metadata + auto-create screen nodes) ---
128
+ const screens = [];
129
+ const rawScreens = spec.screens ?? [];
130
+ let screenOffsetY = 50;
131
+ for (const rawSc of rawScreens) {
132
+ const screenId = rawSc.id ?? crypto.randomUUID();
133
+ const rawRegions = Array.isArray(rawSc.regions) ? rawSc.regions : [];
134
+ const regions = rawRegions.map((r) => {
135
+ const rawElements = Array.isArray(r.elements) ? r.elements : [];
136
+ return {
137
+ id: r.id ?? crypto.randomUUID(),
138
+ label: r.label,
139
+ position: {
140
+ x: (r.position?.x ?? 10),
141
+ y: (r.position?.y ?? 10)
142
+ },
143
+ size: {
144
+ width: (r.size?.width ?? 20),
145
+ height: (r.size?.height ?? 15)
146
+ },
147
+ elementIds: rawElements
148
+ .map((el) => el.nodeId)
149
+ .filter((eid) => seenIds.has(eid)),
150
+ componentNodeId: r.componentNodeId || undefined
151
+ };
152
+ });
153
+ const elementCount = regions.reduce((sum, r) => sum + r.elementIds.length, 0);
154
+ screens.push({
155
+ id: screenId,
156
+ name: rawSc.name ?? 'Imported Screen',
157
+ imageUrl: '',
158
+ imageWidth: 1920,
159
+ imageHeight: 1080,
160
+ imageFilename: rawSc.imageFilename,
161
+ regions
162
+ });
163
+ // Auto-create screen node on canvas
164
+ const screenNodeId = crypto.randomUUID();
165
+ nodes.push({
166
+ id: screenNodeId,
167
+ type: 'screen',
168
+ position: { x: 50, y: screenOffsetY },
169
+ data: {
170
+ label: rawSc.name ?? 'Imported Screen',
171
+ screenId,
172
+ regionCount: regions.length,
173
+ elementCount
174
+ }
175
+ });
176
+ screenOffsetY += 160;
177
+ }
178
+ return {
179
+ nodes,
180
+ edges,
181
+ screens,
182
+ projectName,
183
+ stats: {
184
+ dataPoints: nodes.filter((n) => n.type === 'datapoint').length,
185
+ components: nodes.filter((n) => n.type === 'component').length,
186
+ transforms: nodes.filter((n) => n.type === 'transform').length,
187
+ tables: nodes.filter((n) => n.type === 'table').length,
188
+ edges: edges.length,
189
+ skippedEdges,
190
+ skippedNodes
191
+ }
192
+ };
193
+ }
194
+ // --- Validation helpers with defaults ---
195
+ const VALID_DATA_TYPES = new Set(['string', 'number', 'boolean', 'object', 'array']);
196
+ function validDataType(t) {
197
+ return t && VALID_DATA_TYPES.has(t) ? t : 'string';
198
+ }
199
+ const VALID_SOURCES = new Set(['captured', 'inferred']);
200
+ function validSource(s) {
201
+ return s && VALID_SOURCES.has(s) ? s : 'captured';
202
+ }
203
+ const VALID_LOGIC_TYPES = new Set(['formula', 'validation', 'workflow']);
204
+ function validLogicType(t) {
205
+ return t && VALID_LOGIC_TYPES.has(t) ? t : 'formula';
206
+ }
207
+ const VALID_LOGIC_CONTENT_TYPES = new Set(['formula', 'decision_table', 'steps']);
208
+ function validLogicContentType(t) {
209
+ return t && VALID_LOGIC_CONTENT_TYPES.has(t)
210
+ ? t
211
+ : 'formula';
212
+ }
213
+ const VALID_TABLE_SOURCE_TYPES = new Set(['database', 'api', 'file', 'manual']);
214
+ function validTableSourceType(t) {
215
+ return t && VALID_TABLE_SOURCE_TYPES.has(t) ? t : 'database';
216
+ }
217
+ const VALID_EDGE_TYPES = new Set([
218
+ 'flows-to',
219
+ 'derives-from',
220
+ 'transforms',
221
+ 'validates',
222
+ 'contains'
223
+ ]);
224
+ function validEdgeType(t) {
225
+ return t && VALID_EDGE_TYPES.has(t) ? t : 'flows-to';
226
+ }
227
+ //# sourceMappingURL=jsonImporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonImporter.js","sourceRoot":"","sources":["../../src/import/jsonImporter.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { listProjectsSchema, handleListProjects } from './tools/listProjects.js';
3
- import { getYamlSchema, handleGetYaml } from './tools/getYaml.js';
3
+ import { getJsonSchema, handleGetJson } from './tools/getJson.js';
4
4
  import { getProjectSchema, handleGetProject } from './tools/getProject.js';
5
5
  import { searchNodesSchema, handleSearchNodes } from './tools/searchNodes.js';
6
6
  import { getScreenContextSchema, handleGetScreenContext } from './tools/getScreenContext.js';
@@ -14,8 +14,9 @@ import { deleteNodeSchema, handleDeleteNode } from './tools/deleteNode.js';
14
14
  import { createEdgeSchema, handleCreateEdge } from './tools/createEdge.js';
15
15
  import { deleteEdgeSchema, handleDeleteEdge } from './tools/deleteEdge.js';
16
16
  import { analyseProjectSchema, handleAnalyseProject } from './tools/analyseProject.js';
17
+ import { validateProjectSchema, handleValidateProject } from './tools/validateProject.js';
17
18
  // v3 write tools
18
- import { importYamlSchema, handleImportYaml } from './tools/importYaml.js';
19
+ import { importJsonSchema, handleImportJson } from './tools/importJson.js';
19
20
  import { autoLayoutSchema, handleAutoLayout } from './tools/autoLayout.js';
20
21
  import { uploadImageSchema, handleUploadImage } from './tools/uploadImage.js';
21
22
  import { createScreenSchema, handleCreateScreen } from './tools/createScreen.js';
@@ -30,14 +31,14 @@ import { MODE } from './config.js';
30
31
  export function createServer() {
31
32
  const server = new McpServer({
32
33
  name: 'flowspec',
33
- version: '4.2.2',
34
+ version: '5.0.0',
34
35
  });
35
36
  // ─── Read tools ──────────────────────────────────────────────────
36
37
  server.tool('flowspec_list_projects', 'List all FlowSpec projects with names and dates', listProjectsSchema.shape, handleListProjects);
37
- server.tool('flowspec_get_yaml', 'Get the full YAML spec for a FlowSpec project (optimised for Claude Code consumption)', getYamlSchema.shape, handleGetYaml);
38
+ server.tool('flowspec_get_json', 'Get the full JSON spec for a FlowSpec project (optimised for Claude Code consumption)', getJsonSchema.shape, handleGetJson);
38
39
  server.tool('flowspec_get_project', 'Get project data (nodes, edges, screens) for a FlowSpec project', getProjectSchema.shape, handleGetProject);
39
40
  server.tool('flowspec_search_nodes', 'Search for nodes by label across all projects, optionally filtered by type', searchNodesSchema.shape, handleSearchNodes);
40
- server.tool('flowspec_get_screen_context', 'Get screen/region/element structure for a FlowSpec project (lightweight alternative to full YAML)', getScreenContextSchema.shape, handleGetScreenContext);
41
+ server.tool('flowspec_get_screen_context', 'Get screen/region/element structure for a FlowSpec project (lightweight alternative to full JSON)', getScreenContextSchema.shape, handleGetScreenContext);
41
42
  // ─── Write tools (v2) ────────────────────────────────────────────
42
43
  server.tool('flowspec_create_project', 'Create a new FlowSpec project. Before building from a codebase, scan source files for @flowspec annotations (left by the codebase-indexer skill) to avoid re-discovering already-indexed elements.', createProjectSchema.shape, handleCreateProject);
43
44
  server.tool('flowspec_update_project', 'Update a project name or replace its entire canvas state', updateProjectSchema.shape, handleUpdateProject);
@@ -48,8 +49,9 @@ export function createServer() {
48
49
  server.tool('flowspec_create_edge', 'Connect two nodes with an edge type (flows-to, derives-from, transforms, validates, contains)', createEdgeSchema.shape, handleCreateEdge);
49
50
  server.tool('flowspec_delete_edge', 'Remove an edge from a project', deleteEdgeSchema.shape, handleDeleteEdge);
50
51
  server.tool('flowspec_analyse_project', 'Run orphan node and duplicate label analysis on a project', analyseProjectSchema.shape, handleAnalyseProject);
52
+ server.tool('flowspec_validate_project', 'Validate data flow semantics: DataPoint sources, Transform I/O, Component references, type matching, and circular dependencies', validateProjectSchema.shape, handleValidateProject);
51
53
  // ─── Write tools (v3) ────────────────────────────────────────────
52
- server.tool('flowspec_import_yaml', 'Import specification to create/merge nodes, edges, and screens. If the codebase has @flowspec annotations, incorporate them into the spec before importing to avoid duplicating pre-indexed elements.', importYamlSchema.shape, handleImportYaml);
54
+ server.tool('flowspec_import_json', 'Import JSON specification to create/merge nodes, edges, and screens. If the codebase has @flowspec annotations, incorporate them into the spec before importing to avoid duplicating pre-indexed elements.', importJsonSchema.shape, handleImportJson);
53
55
  server.tool('flowspec_auto_layout', 'Apply automatic hierarchical layout (Dagre) to organize nodes', autoLayoutSchema.shape, handleAutoLayout);
54
56
  server.tool('flowspec_upload_image', 'Upload an image and get its URL with auto-detected dimensions', uploadImageSchema.shape, handleUploadImage);
55
57
  server.tool('flowspec_create_screen', 'Create a new wireframe screen with optional image', createScreenSchema.shape, handleCreateScreen);
@@ -60,7 +62,7 @@ export function createServer() {
60
62
  server.tool('flowspec_remove_region', 'Remove a region from a screen', removeRegionSchema.shape, handleRemoveRegion);
61
63
  server.tool('flowspec_update_edge', 'Update edge type, label, or handle positions', updateEdgeSchema.shape, handleUpdateEdge);
62
64
  server.tool('flowspec_clone_project', 'Clone a project for backup or branching', cloneProjectSchema.shape, handleCloneProject);
63
- console.error(`FlowSpec MCP v4.2.0 — mode: ${MODE}`);
65
+ console.error(`FlowSpec MCP v5.0.0 — mode: ${MODE}`);
64
66
  return server;
65
67
  }
66
68
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod';
2
+ export declare const getJsonSchema: z.ZodObject<{
3
+ projectId: z.ZodString;
4
+ }, "strip", z.ZodTypeAny, {
5
+ projectId: string;
6
+ }, {
7
+ projectId: string;
8
+ }>;
9
+ export declare function handleGetJson(args: z.infer<typeof getJsonSchema>): Promise<{
10
+ content: {
11
+ type: "text";
12
+ text: string;
13
+ }[];
14
+ isError: boolean;
15
+ } | {
16
+ content: {
17
+ type: "text";
18
+ text: string;
19
+ }[];
20
+ isError?: undefined;
21
+ }>;
@@ -0,0 +1,23 @@
1
+ import { z } from 'zod';
2
+ import { getProject } from '../db.js';
3
+ import { exportToJson } from '../export/jsonExporter.js';
4
+ export const getJsonSchema = z.object({
5
+ projectId: z.string().describe('UUID of the FlowSpec project'),
6
+ });
7
+ export async function handleGetJson(args) {
8
+ const project = await getProject(args.projectId);
9
+ if (!project) {
10
+ return {
11
+ content: [{ type: 'text', text: `Project not found: ${args.projectId}` }],
12
+ isError: true,
13
+ };
14
+ }
15
+ const nodes = project.canvas_state?.nodes ?? [];
16
+ const edges = project.canvas_state?.edges ?? [];
17
+ const screens = project.canvas_state?.screens ?? [];
18
+ const json = exportToJson(nodes, edges, project.name, screens);
19
+ return {
20
+ content: [{ type: 'text', text: json }],
21
+ };
22
+ }
23
+ //# sourceMappingURL=getJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getJson.js","sourceRoot":"","sources":["../../src/tools/getJson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;CAC/D,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAmC;IACrE,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,sBAAsB,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YAClF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,OAAO,IAAI,EAAE,CAAC;IAEpD,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE/D,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;KACjD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { z } from 'zod';
2
+ export declare const importJsonSchema: z.ZodObject<{
3
+ projectId: z.ZodString;
4
+ json: z.ZodString;
5
+ autoLayout: z.ZodOptional<z.ZodBoolean>;
6
+ layoutDirection: z.ZodOptional<z.ZodEnum<["TB", "BT", "LR", "RL"]>>;
7
+ merge: z.ZodOptional<z.ZodBoolean>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ projectId: string;
10
+ json: string;
11
+ autoLayout?: boolean | undefined;
12
+ layoutDirection?: "TB" | "BT" | "LR" | "RL" | undefined;
13
+ merge?: boolean | undefined;
14
+ }, {
15
+ projectId: string;
16
+ json: string;
17
+ autoLayout?: boolean | undefined;
18
+ layoutDirection?: "TB" | "BT" | "LR" | "RL" | undefined;
19
+ merge?: boolean | undefined;
20
+ }>;
21
+ export declare function handleImportJson(args: z.infer<typeof importJsonSchema>): Promise<{
22
+ content: {
23
+ type: "text";
24
+ text: string;
25
+ }[];
26
+ isError: boolean;
27
+ } | {
28
+ content: {
29
+ type: "text";
30
+ text: string;
31
+ }[];
32
+ isError?: undefined;
33
+ }>;
@@ -0,0 +1,96 @@
1
+ import { z } from 'zod';
2
+ import { getProject, updateProjectViaApi } from '../db.js';
3
+ import { importFromJson } from '../import/jsonImporter.js';
4
+ import { computeAutoLayout } from '../layout/autoLayout.js';
5
+ export const importJsonSchema = z.object({
6
+ projectId: z.string().describe('UUID of the target project'),
7
+ json: z.string().describe('JSON spec string (FlowSpec v1.2.0 format)'),
8
+ autoLayout: z.boolean().optional().describe('Run dagre auto-layout after import (default: true)'),
9
+ layoutDirection: z.enum(['TB', 'BT', 'LR', 'RL']).optional().describe('Layout direction (default: TB)'),
10
+ merge: z.boolean().optional().describe('true = add to existing canvas, false = replace (default: false)'),
11
+ });
12
+ export async function handleImportJson(args) {
13
+ // Parse JSON string
14
+ let spec;
15
+ try {
16
+ spec = JSON.parse(args.json);
17
+ }
18
+ catch (e) {
19
+ return {
20
+ content: [{ type: 'text', text: `JSON parse error: ${e.message}` }],
21
+ isError: true,
22
+ };
23
+ }
24
+ if (!spec || typeof spec !== 'object') {
25
+ return {
26
+ content: [{ type: 'text', text: 'Invalid JSON: expected an object at the top level' }],
27
+ isError: true,
28
+ };
29
+ }
30
+ // Import JSON → nodes/edges/screens
31
+ const result = importFromJson(spec);
32
+ // Apply auto-layout if requested (default: true)
33
+ const shouldLayout = args.autoLayout !== false;
34
+ if (shouldLayout && result.nodes.length > 0) {
35
+ const direction = args.layoutDirection ?? 'TB';
36
+ const positions = computeAutoLayout(result.nodes, result.edges, { rankdir: direction, pinnedNodeIds: new Set() });
37
+ for (const node of result.nodes) {
38
+ const pos = positions.get(node.id);
39
+ if (pos)
40
+ node.position = pos;
41
+ }
42
+ }
43
+ // Build canvas state
44
+ let nodes;
45
+ let edges;
46
+ let screens = result.screens;
47
+ if (args.merge) {
48
+ // Merge mode: add imported nodes/edges/screens to existing
49
+ const project = await getProject(args.projectId);
50
+ if (!project) {
51
+ return {
52
+ content: [{ type: 'text', text: `Project not found: ${args.projectId}` }],
53
+ isError: true,
54
+ };
55
+ }
56
+ const existing = project.canvas_state;
57
+ nodes = [...(existing.nodes ?? []), ...result.nodes];
58
+ edges = [...(existing.edges ?? []), ...result.edges];
59
+ screens = [...(existing.screens ?? []), ...result.screens];
60
+ }
61
+ else {
62
+ // Replace mode: imported data replaces existing canvas
63
+ nodes = result.nodes;
64
+ edges = result.edges;
65
+ }
66
+ const canvasState = { nodes, edges, screens };
67
+ const updated = await updateProjectViaApi(args.projectId, { canvas_state: canvasState });
68
+ if (!updated) {
69
+ return {
70
+ content: [{ type: 'text', text: `Failed to update project — not found: ${args.projectId}` }],
71
+ isError: true,
72
+ };
73
+ }
74
+ const { stats } = result;
75
+ const lines = [
76
+ `Imported JSON into project **${updated.name}**`,
77
+ '',
78
+ `| Metric | Count |`,
79
+ `|--------|-------|`,
80
+ `| Data points | ${stats.dataPoints} |`,
81
+ `| Components | ${stats.components} |`,
82
+ `| Transforms | ${stats.transforms} |`,
83
+ `| Tables | ${stats.tables} |`,
84
+ `| Edges | ${stats.edges} |`,
85
+ `| Screens | ${result.screens.length} |`,
86
+ `| Skipped nodes | ${stats.skippedNodes} |`,
87
+ `| Skipped edges | ${stats.skippedEdges} |`,
88
+ '',
89
+ `Mode: ${args.merge ? 'merge (added to existing)' : 'replace'}`,
90
+ shouldLayout ? `Layout: ${args.layoutDirection ?? 'TB'}` : 'Layout: skipped',
91
+ ];
92
+ return {
93
+ content: [{ type: 'text', text: lines.join('\n') }],
94
+ };
95
+ }
96
+ //# sourceMappingURL=importJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importJson.js","sourceRoot":"","sources":["../../src/tools/importJson.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod';
2
+ export declare const validateProjectSchema: z.ZodObject<{
3
+ projectId: z.ZodString;
4
+ }, "strip", z.ZodTypeAny, {
5
+ projectId: string;
6
+ }, {
7
+ projectId: string;
8
+ }>;
9
+ export declare function handleValidateProject(args: z.infer<typeof validateProjectSchema>): Promise<{
10
+ content: {
11
+ type: "text";
12
+ text: string;
13
+ }[];
14
+ isError: boolean;
15
+ } | {
16
+ content: {
17
+ type: "text";
18
+ text: string;
19
+ }[];
20
+ isError?: undefined;
21
+ }>;
@@ -0,0 +1,299 @@
1
+ import { z } from 'zod';
2
+ import { getProject } from '../db.js';
3
+ export const validateProjectSchema = z.object({
4
+ projectId: z.string().describe('UUID of the project to validate'),
5
+ });
6
+ // ─── Validation Functions ────────────────────────────────────────
7
+ function validateDataPointSources(nodes, edges) {
8
+ const issues = [];
9
+ const dataPoints = nodes.filter((n) => n.type === 'datapoint');
10
+ for (const dp of dataPoints) {
11
+ const source = dp.data?.source ?? 'captured';
12
+ const label = dp.data?.label ?? 'Untitled';
13
+ const incomingEdges = edges.filter((e) => e.target === dp.id);
14
+ const sourceNodeTypes = incomingEdges
15
+ .map((e) => {
16
+ const sourceNode = nodes.find((n) => n.id === e.source);
17
+ return sourceNode?.type ?? 'unknown';
18
+ })
19
+ .filter((t) => t !== 'unknown');
20
+ let expectedTypes = [];
21
+ switch (source) {
22
+ case 'captured':
23
+ expectedTypes = ['screen', 'component'];
24
+ break;
25
+ case 'retrieved':
26
+ expectedTypes = ['table', 'transform', 'component'];
27
+ break;
28
+ case 'inferred':
29
+ expectedTypes = ['transform'];
30
+ break;
31
+ }
32
+ if (incomingEdges.length === 0) {
33
+ issues.push({
34
+ violation: 'missing-source',
35
+ nodeId: dp.id,
36
+ label,
37
+ source,
38
+ expectedSourceTypes: expectedTypes,
39
+ actualSourceTypes: [],
40
+ });
41
+ continue;
42
+ }
43
+ if (incomingEdges.length > 1) {
44
+ issues.push({
45
+ violation: 'multiple-sources',
46
+ nodeId: dp.id,
47
+ label,
48
+ source,
49
+ expectedSourceTypes: expectedTypes,
50
+ actualSourceTypes: sourceNodeTypes,
51
+ });
52
+ continue;
53
+ }
54
+ const actualType = sourceNodeTypes[0];
55
+ if (!expectedTypes.includes(actualType)) {
56
+ issues.push({
57
+ violation: 'wrong-source-type',
58
+ nodeId: dp.id,
59
+ label,
60
+ source,
61
+ expectedSourceTypes: expectedTypes,
62
+ actualSourceTypes: [actualType],
63
+ });
64
+ }
65
+ }
66
+ return issues;
67
+ }
68
+ function validateTransforms(nodes, edges) {
69
+ const issues = [];
70
+ const transforms = nodes.filter((n) => n.type === 'transform');
71
+ for (const transform of transforms) {
72
+ const label = transform.data?.label ?? 'Untitled';
73
+ const transformType = transform.data?.type ?? 'formula';
74
+ const incomingEdges = edges.filter((e) => e.target === transform.id);
75
+ const outgoingEdges = edges.filter((e) => e.source === transform.id);
76
+ if (incomingEdges.length === 0) {
77
+ issues.push({
78
+ violation: 'no-inputs',
79
+ nodeId: transform.id,
80
+ label,
81
+ transformType,
82
+ });
83
+ }
84
+ if (outgoingEdges.length === 0) {
85
+ issues.push({
86
+ violation: 'no-outputs',
87
+ nodeId: transform.id,
88
+ label,
89
+ transformType,
90
+ });
91
+ }
92
+ }
93
+ return issues;
94
+ }
95
+ function validateComponentReferences(nodes) {
96
+ const issues = [];
97
+ const components = nodes.filter((n) => n.type === 'component');
98
+ const nodeIdSet = new Set(nodes.map((n) => n.id));
99
+ for (const component of components) {
100
+ const label = component.data?.label ?? 'Untitled';
101
+ const captures = component.data?.captures ?? [];
102
+ const displays = component.data?.displays ?? [];
103
+ const invalidCaptures = captures.filter((id) => !nodeIdSet.has(id));
104
+ if (invalidCaptures.length > 0) {
105
+ issues.push({
106
+ violation: 'invalid-capture-reference',
107
+ nodeId: component.id,
108
+ label,
109
+ invalidRefs: invalidCaptures,
110
+ });
111
+ }
112
+ const invalidDisplays = displays.filter((id) => !nodeIdSet.has(id));
113
+ if (invalidDisplays.length > 0) {
114
+ issues.push({
115
+ violation: 'invalid-display-reference',
116
+ nodeId: component.id,
117
+ label,
118
+ invalidRefs: invalidDisplays,
119
+ });
120
+ }
121
+ }
122
+ return issues;
123
+ }
124
+ function validateTableDataPointTypes(nodes, edges) {
125
+ const issues = [];
126
+ const dataPoints = nodes.filter((n) => n.type === 'datapoint');
127
+ const tables = nodes.filter((n) => n.type === 'table');
128
+ for (const dp of dataPoints) {
129
+ if (dp.data?.source !== 'retrieved')
130
+ continue;
131
+ const tableEdges = edges.filter((e) => {
132
+ if (e.target !== dp.id)
133
+ return false;
134
+ const sourceNode = nodes.find((n) => n.id === e.source);
135
+ return sourceNode?.type === 'table';
136
+ });
137
+ for (const edge of tableEdges) {
138
+ const table = tables.find((t) => t.id === edge.source);
139
+ if (!table)
140
+ continue;
141
+ const dpLabel = (dp.data?.label ?? '').toLowerCase().trim();
142
+ const matchingColumn = (table.data?.columns ?? []).find((col) => col.name.toLowerCase().trim() === dpLabel);
143
+ if (matchingColumn && matchingColumn.type !== dp.data?.type) {
144
+ issues.push({
145
+ violation: 'type-mismatch',
146
+ dataPointId: dp.id,
147
+ dataPointLabel: dp.data?.label ?? 'Untitled',
148
+ dataPointType: dp.data?.type ?? 'unknown',
149
+ tableId: table.id,
150
+ tableLabel: table.data?.label ?? 'Untitled',
151
+ columnName: matchingColumn.name,
152
+ columnType: matchingColumn.type,
153
+ });
154
+ }
155
+ }
156
+ }
157
+ return issues;
158
+ }
159
+ function detectCircularDependencies(nodes, edges) {
160
+ const issues = [];
161
+ const adjacency = new Map();
162
+ for (const node of nodes) {
163
+ adjacency.set(node.id, []);
164
+ }
165
+ for (const edge of edges) {
166
+ const edgeType = edge.data?.edgeType;
167
+ if (edgeType === 'derives-from' || edgeType === 'transforms') {
168
+ const targets = adjacency.get(edge.source) ?? [];
169
+ targets.push(edge.target);
170
+ adjacency.set(edge.source, targets);
171
+ }
172
+ }
173
+ const visited = new Set();
174
+ const recStack = new Set();
175
+ const cycles = [];
176
+ function dfs(nodeId, path) {
177
+ visited.add(nodeId);
178
+ recStack.add(nodeId);
179
+ path.push(nodeId);
180
+ const neighbors = adjacency.get(nodeId) ?? [];
181
+ for (const neighbor of neighbors) {
182
+ if (!visited.has(neighbor)) {
183
+ dfs(neighbor, [...path]);
184
+ }
185
+ else if (recStack.has(neighbor)) {
186
+ const cycleStart = path.indexOf(neighbor);
187
+ const cycle = path.slice(cycleStart);
188
+ cycles.push([...cycle, neighbor]);
189
+ }
190
+ }
191
+ recStack.delete(nodeId);
192
+ }
193
+ for (const node of nodes) {
194
+ if (!visited.has(node.id)) {
195
+ dfs(node.id, []);
196
+ }
197
+ }
198
+ const seenCycles = new Set();
199
+ for (const cycle of cycles) {
200
+ const normalized = [...cycle].sort().join('->');
201
+ if (seenCycles.has(normalized))
202
+ continue;
203
+ seenCycles.add(normalized);
204
+ const labels = cycle.map((id) => {
205
+ const node = nodes.find((n) => n.id === id);
206
+ return node?.data?.label ?? 'Unknown';
207
+ });
208
+ issues.push({
209
+ violation: 'circular-dependency',
210
+ cycle,
211
+ labels,
212
+ });
213
+ }
214
+ return issues;
215
+ }
216
+ // ─── Main Handler ────────────────────────────────────────────────
217
+ export async function handleValidateProject(args) {
218
+ const project = await getProject(args.projectId);
219
+ if (!project) {
220
+ return {
221
+ content: [{ type: 'text', text: `Project not found: ${args.projectId}` }],
222
+ isError: true,
223
+ };
224
+ }
225
+ const nodes = project.canvas_state?.nodes ?? [];
226
+ const edges = project.canvas_state?.edges ?? [];
227
+ // Run all validators
228
+ const dataPointSourceIssues = validateDataPointSources(nodes, edges);
229
+ const transformIssues = validateTransforms(nodes, edges);
230
+ const componentReferenceIssues = validateComponentReferences(nodes);
231
+ const tableDataPointMismatches = validateTableDataPointTypes(nodes, edges);
232
+ const circularDependencies = detectCircularDependencies(nodes, edges);
233
+ const totalIssues = dataPointSourceIssues.length +
234
+ transformIssues.length +
235
+ componentReferenceIssues.length +
236
+ tableDataPointMismatches.length +
237
+ circularDependencies.length;
238
+ // Format output
239
+ const lines = [];
240
+ lines.push(`## Data Flow Validation for ${project.name}`);
241
+ if (totalIssues === 0) {
242
+ lines.push('');
243
+ lines.push('✅ **All data flow rules passed!**');
244
+ return {
245
+ content: [{ type: 'text', text: lines.join('\n') }],
246
+ };
247
+ }
248
+ lines.push('');
249
+ lines.push(`⚠️ **${totalIssues} issue${totalIssues !== 1 ? 's' : ''} found** (all warnings)`);
250
+ // DataPoint Source Issues
251
+ if (dataPointSourceIssues.length > 0) {
252
+ lines.push('');
253
+ lines.push(`### DataPoint Source Issues (${dataPointSourceIssues.length})`);
254
+ for (const issue of dataPointSourceIssues) {
255
+ lines.push(`- **${issue.label}** (${issue.source}): ${issue.violation.replace(/-/g, ' ')}`);
256
+ lines.push(` - Expected: ${issue.expectedSourceTypes.join(', ')}`);
257
+ if (issue.actualSourceTypes.length > 0) {
258
+ lines.push(` - Actual: ${issue.actualSourceTypes.join(', ')}`);
259
+ }
260
+ }
261
+ }
262
+ // Transform Issues
263
+ if (transformIssues.length > 0) {
264
+ lines.push('');
265
+ lines.push(`### Transform Issues (${transformIssues.length})`);
266
+ for (const issue of transformIssues) {
267
+ lines.push(`- **${issue.label}** (${issue.transformType}): ${issue.violation.replace(/-/g, ' ')}`);
268
+ }
269
+ }
270
+ // Component Reference Issues
271
+ if (componentReferenceIssues.length > 0) {
272
+ lines.push('');
273
+ lines.push(`### Component Reference Issues (${componentReferenceIssues.length})`);
274
+ for (const issue of componentReferenceIssues) {
275
+ lines.push(`- **${issue.label}**: ${issue.violation.replace(/-/g, ' ')}`);
276
+ lines.push(` - Invalid IDs: ${issue.invalidRefs.join(', ')}`);
277
+ }
278
+ }
279
+ // Table/DataPoint Type Mismatches
280
+ if (tableDataPointMismatches.length > 0) {
281
+ lines.push('');
282
+ lines.push(`### Type Mismatches (${tableDataPointMismatches.length})`);
283
+ for (const issue of tableDataPointMismatches) {
284
+ lines.push(`- **${issue.dataPointLabel}** (${issue.dataPointType}) ← **${issue.tableLabel}.${issue.columnName}** (${issue.columnType})`);
285
+ }
286
+ }
287
+ // Circular Dependencies
288
+ if (circularDependencies.length > 0) {
289
+ lines.push('');
290
+ lines.push(`### Circular Dependencies (${circularDependencies.length})`);
291
+ for (const issue of circularDependencies) {
292
+ lines.push(`- Cycle: ${issue.labels.join(' → ')}`);
293
+ }
294
+ }
295
+ return {
296
+ content: [{ type: 'text', text: lines.join('\n') }],
297
+ };
298
+ }
299
+ //# sourceMappingURL=validateProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateProject.js","sourceRoot":"","sources":["../../src/tools/validateProject.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flowspec-mcp",
3
- "version": "4.2.2",
3
+ "version": "5.0.0",
4
4
  "type": "module",
5
5
  "description": "MCP server for FlowSpec — exposes project specs to Claude Code",
6
6
  "bin": {
@@ -29,13 +29,13 @@
29
29
  "flowspec",
30
30
  "claude",
31
31
  "model-context-protocol",
32
- "data-architecture"
32
+ "data-architecture",
33
+ "json"
33
34
  ],
34
35
  "dependencies": {
35
36
  "@dagrejs/dagre": "^1.1.4",
36
37
  "@modelcontextprotocol/sdk": "1.12.1",
37
38
  "@neondatabase/serverless": "^1.0.2",
38
- "yaml": "^2.8.2",
39
39
  "zod": "^3.24.4"
40
40
  },
41
41
  "devDependencies": {