@graph-ir/mcp-server 0.2.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,146 @@
1
+ /**
2
+ * validate_notation MCP tool
3
+ *
4
+ * Validate a Graph-IR against notation rules.
5
+ */
6
+ import { getSymbolRegistry } from './list-symbols.js';
7
+ import { getNotationRegistry } from './list-notations.js';
8
+ /**
9
+ * Validate a Graph-IR against notation rules.
10
+ */
11
+ export async function validateNotation(params) {
12
+ const errors = [];
13
+ const warnings = [];
14
+ // Parse the IR
15
+ let ir;
16
+ try {
17
+ ir = JSON.parse(params.ir);
18
+ }
19
+ catch (e) {
20
+ return {
21
+ valid: false,
22
+ notation: null,
23
+ errors: [
24
+ {
25
+ code: 'UNKNOWN_NOTATION',
26
+ message: `Failed to parse IR: ${e instanceof Error ? e.message : 'Invalid JSON'}`,
27
+ path: '',
28
+ },
29
+ ],
30
+ warnings: [],
31
+ };
32
+ }
33
+ // Determine notation to validate against
34
+ const notationId = params.notation || ir.metadata?.notation;
35
+ if (!notationId) {
36
+ return {
37
+ valid: true,
38
+ notation: null,
39
+ errors: [],
40
+ warnings: [
41
+ {
42
+ code: 'UNKNOWN_NOTATION',
43
+ message: 'No notation specified in IR metadata or parameters. Skipping notation validation.',
44
+ path: 'metadata.notation',
45
+ },
46
+ ],
47
+ };
48
+ }
49
+ const notationRegistry = getNotationRegistry();
50
+ const symbolRegistry = getSymbolRegistry();
51
+ // Check if notation exists
52
+ const notation = notationRegistry.get(notationId);
53
+ if (!notation) {
54
+ return {
55
+ valid: false,
56
+ notation: notationId,
57
+ errors: [
58
+ {
59
+ code: 'UNKNOWN_NOTATION',
60
+ message: `Unknown notation: ${notationId}`,
61
+ path: 'metadata.notation',
62
+ },
63
+ ],
64
+ warnings: [],
65
+ };
66
+ }
67
+ // Validate each node's symbol
68
+ const validSymbolIds = new Set(notation.symbols);
69
+ for (let i = 0; i < ir.nodes.length; i++) {
70
+ const node = ir.nodes[i];
71
+ if (node.symbol) {
72
+ // Check if symbol is valid for this notation
73
+ if (!validSymbolIds.has(node.symbol)) {
74
+ errors.push({
75
+ code: 'UNKNOWN_SYMBOL',
76
+ message: `Symbol '${node.symbol}' is not valid for notation '${notationId}'`,
77
+ path: `nodes[${i}].symbol`,
78
+ nodeId: node.id,
79
+ });
80
+ }
81
+ // Check if variant is valid
82
+ if (node.variant) {
83
+ const symbolDef = symbolRegistry.get(node.symbol);
84
+ if (symbolDef && symbolDef.variants) {
85
+ if (!symbolDef.variants[node.variant]) {
86
+ errors.push({
87
+ code: 'INVALID_VARIANT',
88
+ message: `Variant '${node.variant}' is not valid for symbol '${node.symbol}'`,
89
+ path: `nodes[${i}].variant`,
90
+ nodeId: node.id,
91
+ });
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
97
+ // Validate connections
98
+ if (notation.connectionRules && notation.connectionRules.length > 0) {
99
+ // Build node symbol map
100
+ const nodeSymbols = new Map();
101
+ for (const node of ir.nodes) {
102
+ if (node.symbol) {
103
+ nodeSymbols.set(node.id, node.symbol);
104
+ }
105
+ }
106
+ // Validate each edge
107
+ for (let i = 0; i < ir.edges.length; i++) {
108
+ const edge = ir.edges[i];
109
+ const sourceSymbol = nodeSymbols.get(edge.source);
110
+ const targetSymbol = nodeSymbols.get(edge.target);
111
+ if (sourceSymbol && targetSymbol) {
112
+ const result = notationRegistry.validateConnection(notationId, sourceSymbol, targetSymbol);
113
+ if (!result.valid) {
114
+ errors.push({
115
+ code: 'INVALID_CONNECTION',
116
+ message: result.message || `Invalid connection from ${sourceSymbol} to ${targetSymbol}`,
117
+ path: `edges[${i}]`,
118
+ edgeId: edge.id,
119
+ });
120
+ }
121
+ }
122
+ }
123
+ }
124
+ // Check required symbols
125
+ if (notation.validation?.requiredSymbols) {
126
+ const presentSymbols = new Set(ir.nodes.map((n) => n.symbol).filter(Boolean));
127
+ for (const requiredSymbol of notation.validation.requiredSymbols) {
128
+ if (!presentSymbols.has(requiredSymbol)) {
129
+ errors.push({
130
+ code: 'MISSING_REQUIRED_SYMBOL',
131
+ message: `Required symbol '${requiredSymbol}' not found in graph`,
132
+ path: 'nodes',
133
+ });
134
+ }
135
+ }
136
+ }
137
+ // Determine validity
138
+ const isValid = errors.length === 0 && (!params.strict || warnings.length === 0);
139
+ return {
140
+ valid: isValid,
141
+ notation: notationId,
142
+ errors,
143
+ warnings,
144
+ };
145
+ }
146
+ //# sourceMappingURL=validate-notation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-notation.js","sourceRoot":"","sources":["../../src/tools/validate-notation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Graph-IR Validation Tool
3
+ *
4
+ * Validates Graph-IR JSON against schema and semantic rules.
5
+ * Uses @graph-ir/core for validation logic.
6
+ */
7
+ import { type ValidationResult } from '@graph-ir/core';
8
+ export type { ValidationResult, ValidationError } from '@graph-ir/core';
9
+ /**
10
+ * Validate Graph-IR JSON
11
+ *
12
+ * @param irJson - JSON string to validate
13
+ * @param strict - Treat warnings as errors
14
+ * @returns Validation result with errors, warnings, and stats
15
+ */
16
+ export declare function validateIR(irJson: string, strict?: boolean): Promise<ValidationResult>;
17
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/tools/validate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,KAAK,gBAAgB,EAEtB,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAExE;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAG3B"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Graph-IR Validation Tool
3
+ *
4
+ * Validates Graph-IR JSON against schema and semantic rules.
5
+ * Uses @graph-ir/core for validation logic.
6
+ */
7
+ import { validateIRFromString, } from '@graph-ir/core';
8
+ /**
9
+ * Validate Graph-IR JSON
10
+ *
11
+ * @param irJson - JSON string to validate
12
+ * @param strict - Treat warnings as errors
13
+ * @returns Validation result with errors, warnings, and stats
14
+ */
15
+ export async function validateIR(irJson, strict = false) {
16
+ const options = { strict };
17
+ return validateIRFromString(irJson, options);
18
+ }
19
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/tools/validate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,GAGrB,MAAM,gBAAgB,CAAC;AAKxB;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,SAAkB,KAAK;IAEvB,MAAM,OAAO,GAAsB,EAAE,MAAM,EAAE,CAAC;IAC9C,OAAO,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Graph-IR Visualization Tool
3
+ *
4
+ * Generates ASCII art representations of Graph-IR.
5
+ */
6
+ export interface VisualizationResult {
7
+ success: boolean;
8
+ visualization: string;
9
+ errors: string[];
10
+ }
11
+ /**
12
+ * Generate ASCII visualization of Graph-IR
13
+ */
14
+ export declare function visualizeIR(irJson: string, style?: string): Promise<VisualizationResult>;
15
+ //# sourceMappingURL=visualize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visualize.d.ts","sourceRoot":"","sources":["../../src/tools/visualize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAgBD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAc,GACpB,OAAO,CAAC,mBAAmB,CAAC,CAyC9B"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Graph-IR Visualization Tool
3
+ *
4
+ * Generates ASCII art representations of Graph-IR.
5
+ */
6
+ /**
7
+ * Generate ASCII visualization of Graph-IR
8
+ */
9
+ export async function visualizeIR(irJson, style = 'box') {
10
+ // Parse JSON
11
+ let ir;
12
+ try {
13
+ ir = JSON.parse(irJson);
14
+ }
15
+ catch (e) {
16
+ return {
17
+ success: false,
18
+ visualization: '',
19
+ errors: [`Invalid JSON: ${e instanceof Error ? e.message : 'Parse error'}`],
20
+ };
21
+ }
22
+ if (!ir.nodes || !ir.edges) {
23
+ return {
24
+ success: false,
25
+ visualization: '',
26
+ errors: ['Invalid Graph-IR structure'],
27
+ };
28
+ }
29
+ let visualization;
30
+ switch (style) {
31
+ case 'compact':
32
+ visualization = renderCompact(ir);
33
+ break;
34
+ case 'tree':
35
+ visualization = renderTree(ir);
36
+ break;
37
+ case 'box':
38
+ default:
39
+ visualization = renderBox(ir);
40
+ break;
41
+ }
42
+ return {
43
+ success: true,
44
+ visualization,
45
+ errors: [],
46
+ };
47
+ }
48
+ function renderBox(ir) {
49
+ const lines = [];
50
+ const nodeMap = new Map(ir.nodes.map(n => [n.id, n]));
51
+ // Group edges by source
52
+ const edgesBySource = new Map();
53
+ for (const edge of ir.edges) {
54
+ const edges = edgesBySource.get(edge.source) || [];
55
+ edges.push(edge);
56
+ edgesBySource.set(edge.source, edges);
57
+ }
58
+ // Render each node
59
+ lines.push('Graph-IR Visualization');
60
+ lines.push('='.repeat(40));
61
+ lines.push('');
62
+ for (const node of ir.nodes) {
63
+ const label = node.label || node.id;
64
+ const type = node.type;
65
+ // Box top
66
+ const width = Math.max(label.length, type.length) + 4;
67
+ lines.push('┌' + '─'.repeat(width) + '┐');
68
+ lines.push('│ ' + label.padEnd(width - 2) + ' │');
69
+ lines.push('│ ' + `(${type})`.padEnd(width - 2) + ' │');
70
+ lines.push('└' + '─'.repeat(width) + '┘');
71
+ // Render outgoing edges
72
+ const outgoingEdges = edgesBySource.get(node.id) || [];
73
+ for (const edge of outgoingEdges) {
74
+ const targetNode = nodeMap.get(edge.target);
75
+ const targetLabel = targetNode?.label || edge.target;
76
+ const edgeLabel = edge.label ? ` [${edge.label}]` : '';
77
+ lines.push(` │`);
78
+ lines.push(` └──${edgeLabel}──> ${targetLabel}`);
79
+ }
80
+ lines.push('');
81
+ }
82
+ // Summary
83
+ lines.push('─'.repeat(40));
84
+ lines.push(`Nodes: ${ir.nodes.length}, Edges: ${ir.edges.length}`);
85
+ return lines.join('\n');
86
+ }
87
+ function renderCompact(ir) {
88
+ const lines = [];
89
+ const nodeMap = new Map(ir.nodes.map(n => [n.id, n]));
90
+ lines.push('Nodes:');
91
+ for (const node of ir.nodes) {
92
+ const label = node.label || node.id;
93
+ lines.push(` [${node.id}] ${label} (${node.type})`);
94
+ }
95
+ lines.push('');
96
+ lines.push('Edges:');
97
+ for (const edge of ir.edges) {
98
+ const sourceNode = nodeMap.get(edge.source);
99
+ const targetNode = nodeMap.get(edge.target);
100
+ const sourceLabel = sourceNode?.label || edge.source;
101
+ const targetLabel = targetNode?.label || edge.target;
102
+ const edgeLabel = edge.label ? ` [${edge.label}]` : '';
103
+ lines.push(` ${sourceLabel} ->${edgeLabel} ${targetLabel}`);
104
+ }
105
+ return lines.join('\n');
106
+ }
107
+ function renderTree(ir) {
108
+ const lines = [];
109
+ // Find root nodes (nodes with no incoming edges)
110
+ const hasIncoming = new Set(ir.edges.map(e => e.target));
111
+ const roots = ir.nodes.filter(n => !hasIncoming.has(n.id));
112
+ // Build adjacency list
113
+ const children = new Map();
114
+ for (const edge of ir.edges) {
115
+ const kids = children.get(edge.source) || [];
116
+ kids.push(edge.target);
117
+ children.set(edge.source, kids);
118
+ }
119
+ const nodeMap = new Map(ir.nodes.map(n => [n.id, n]));
120
+ // Render tree from each root
121
+ function renderNode(nodeId, prefix, isLast) {
122
+ const node = nodeMap.get(nodeId);
123
+ if (!node)
124
+ return;
125
+ const label = node.label || node.id;
126
+ const connector = isLast ? '└── ' : '├── ';
127
+ lines.push(prefix + connector + label);
128
+ const childPrefix = prefix + (isLast ? ' ' : '│ ');
129
+ const kids = children.get(nodeId) || [];
130
+ kids.forEach((kidId, index) => {
131
+ renderNode(kidId, childPrefix, index === kids.length - 1);
132
+ });
133
+ }
134
+ if (roots.length === 0) {
135
+ // No clear roots - just list all
136
+ lines.push('(No root nodes found - graph may have cycles)');
137
+ lines.push('');
138
+ return renderCompact(ir);
139
+ }
140
+ roots.forEach((root, index) => {
141
+ if (index > 0)
142
+ lines.push('');
143
+ lines.push(root.label || root.id);
144
+ const kids = children.get(root.id) || [];
145
+ kids.forEach((kidId, kidIndex) => {
146
+ renderNode(kidId, '', kidIndex === kids.length - 1);
147
+ });
148
+ });
149
+ return lines.join('\n');
150
+ }
151
+ //# sourceMappingURL=visualize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visualize.js","sourceRoot":"","sources":["../../src/tools/visualize.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@graph-ir/mcp-server",
3
+ "version": "0.2.0",
4
+ "description": "MCP server for Graph-IR validation, generation, and layout",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "graph-ir-mcp": "dist/index.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc --watch",
14
+ "start": "node dist/index.js",
15
+ "test": "vitest",
16
+ "lint": "eslint src/",
17
+ "prepack": "npm run build"
18
+ },
19
+ "keywords": [
20
+ "mcp",
21
+ "graph-ir",
22
+ "validation",
23
+ "layout",
24
+ "elk"
25
+ ],
26
+ "author": "",
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "@graph-ir/core": "0.2.0",
30
+ "@modelcontextprotocol/sdk": "1.30.0",
31
+ "elkjs": "0.12.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/node": "24.10.1",
35
+ "typescript": "6.0.3",
36
+ "vitest": "5.0.0"
37
+ },
38
+ "engines": {
39
+ "node": ">=24.19.0"
40
+ },
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "git+https://github.com/coreyt/graph-ir-tools.git",
44
+ "directory": "packages/mcp-server"
45
+ },
46
+ "files": [
47
+ "dist",
48
+ "README.md",
49
+ "LICENSE"
50
+ ],
51
+ "publishConfig": {
52
+ "access": "public"
53
+ }
54
+ }