@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.
- package/LICENSE +21 -0
- package/README.md +105 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +257 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/generate.d.ts +33 -0
- package/dist/tools/generate.d.ts.map +1 -0
- package/dist/tools/generate.js +160 -0
- package/dist/tools/generate.js.map +1 -0
- package/dist/tools/layout.d.ts +100 -0
- package/dist/tools/layout.d.ts.map +1 -0
- package/dist/tools/layout.js +262 -0
- package/dist/tools/layout.js.map +1 -0
- package/dist/tools/list-notations.d.ts +24 -0
- package/dist/tools/list-notations.d.ts.map +1 -0
- package/dist/tools/list-notations.js +34 -0
- package/dist/tools/list-notations.js.map +1 -0
- package/dist/tools/list-symbols.d.ts +30 -0
- package/dist/tools/list-symbols.d.ts.map +1 -0
- package/dist/tools/list-symbols.js +48 -0
- package/dist/tools/list-symbols.js.map +1 -0
- package/dist/tools/validate-notation.d.ts +23 -0
- package/dist/tools/validate-notation.d.ts.map +1 -0
- package/dist/tools/validate-notation.js +146 -0
- package/dist/tools/validate-notation.js.map +1 -0
- package/dist/tools/validate.d.ts +17 -0
- package/dist/tools/validate.d.ts.map +1 -0
- package/dist/tools/validate.js +19 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/tools/visualize.d.ts +15 -0
- package/dist/tools/visualize.d.ts.map +1 -0
- package/dist/tools/visualize.js +151 -0
- package/dist/tools/visualize.js.map +1 -0
- package/package.json +54 -0
|
@@ -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
|
+
}
|