dbgraph 0.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.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +347 -0
  3. package/dist/bin/dbgraph.d.ts +8 -0
  4. package/dist/bin/dbgraph.d.ts.map +1 -0
  5. package/dist/bin/dbgraph.js +382 -0
  6. package/dist/bin/dbgraph.js.map +1 -0
  7. package/dist/config.d.ts +25 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +158 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/context/formatter.d.ts +94 -0
  12. package/dist/context/formatter.d.ts.map +1 -0
  13. package/dist/context/formatter.js +288 -0
  14. package/dist/context/formatter.js.map +1 -0
  15. package/dist/context/index.d.ts +77 -0
  16. package/dist/context/index.d.ts.map +1 -0
  17. package/dist/context/index.js +458 -0
  18. package/dist/context/index.js.map +1 -0
  19. package/dist/db/index.d.ts +26 -0
  20. package/dist/db/index.d.ts.map +1 -0
  21. package/dist/db/index.js +127 -0
  22. package/dist/db/index.js.map +1 -0
  23. package/dist/db/migrations.d.ts +8 -0
  24. package/dist/db/migrations.d.ts.map +1 -0
  25. package/dist/db/migrations.js +39 -0
  26. package/dist/db/migrations.js.map +1 -0
  27. package/dist/db/queries.d.ts +46 -0
  28. package/dist/db/queries.d.ts.map +1 -0
  29. package/dist/db/queries.js +436 -0
  30. package/dist/db/queries.js.map +1 -0
  31. package/dist/db/schema.sql +113 -0
  32. package/dist/db/sqlite-adapter.d.ts +30 -0
  33. package/dist/db/sqlite-adapter.d.ts.map +1 -0
  34. package/dist/db/sqlite-adapter.js +78 -0
  35. package/dist/db/sqlite-adapter.js.map +1 -0
  36. package/dist/directory.d.ts +37 -0
  37. package/dist/directory.d.ts.map +1 -0
  38. package/dist/directory.js +160 -0
  39. package/dist/directory.js.map +1 -0
  40. package/dist/errors.d.ts +46 -0
  41. package/dist/errors.d.ts.map +1 -0
  42. package/dist/errors.js +90 -0
  43. package/dist/errors.js.map +1 -0
  44. package/dist/graph/traversal.d.ts +157 -0
  45. package/dist/graph/traversal.d.ts.map +1 -0
  46. package/dist/graph/traversal.js +531 -0
  47. package/dist/graph/traversal.js.map +1 -0
  48. package/dist/index.d.ts +183 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +435 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/introspect/base.d.ts +62 -0
  53. package/dist/introspect/base.d.ts.map +1 -0
  54. package/dist/introspect/base.js +107 -0
  55. package/dist/introspect/base.js.map +1 -0
  56. package/dist/introspect/connection.d.ts +30 -0
  57. package/dist/introspect/connection.d.ts.map +1 -0
  58. package/dist/introspect/connection.js +232 -0
  59. package/dist/introspect/connection.js.map +1 -0
  60. package/dist/introspect/index.d.ts +23 -0
  61. package/dist/introspect/index.d.ts.map +1 -0
  62. package/dist/introspect/index.js +46 -0
  63. package/dist/introspect/index.js.map +1 -0
  64. package/dist/introspect/mysql.d.ts +64 -0
  65. package/dist/introspect/mysql.d.ts.map +1 -0
  66. package/dist/introspect/mysql.js +360 -0
  67. package/dist/introspect/mysql.js.map +1 -0
  68. package/dist/introspect/postgres.d.ts +55 -0
  69. package/dist/introspect/postgres.d.ts.map +1 -0
  70. package/dist/introspect/postgres.js +372 -0
  71. package/dist/introspect/postgres.js.map +1 -0
  72. package/dist/introspect/sqlite.d.ts +33 -0
  73. package/dist/introspect/sqlite.d.ts.map +1 -0
  74. package/dist/introspect/sqlite.js +207 -0
  75. package/dist/introspect/sqlite.js.map +1 -0
  76. package/dist/mcp/engine.d.ts +92 -0
  77. package/dist/mcp/engine.d.ts.map +1 -0
  78. package/dist/mcp/engine.js +261 -0
  79. package/dist/mcp/engine.js.map +1 -0
  80. package/dist/mcp/index.d.ts +33 -0
  81. package/dist/mcp/index.d.ts.map +1 -0
  82. package/dist/mcp/index.js +119 -0
  83. package/dist/mcp/index.js.map +1 -0
  84. package/dist/mcp/server-instructions.d.ts +9 -0
  85. package/dist/mcp/server-instructions.d.ts.map +1 -0
  86. package/dist/mcp/server-instructions.js +71 -0
  87. package/dist/mcp/server-instructions.js.map +1 -0
  88. package/dist/mcp/session.d.ts +35 -0
  89. package/dist/mcp/session.d.ts.map +1 -0
  90. package/dist/mcp/session.js +140 -0
  91. package/dist/mcp/session.js.map +1 -0
  92. package/dist/mcp/tools.d.ts +99 -0
  93. package/dist/mcp/tools.d.ts.map +1 -0
  94. package/dist/mcp/tools.js +499 -0
  95. package/dist/mcp/tools.js.map +1 -0
  96. package/dist/mcp/transport.d.ts +78 -0
  97. package/dist/mcp/transport.d.ts.map +1 -0
  98. package/dist/mcp/transport.js +182 -0
  99. package/dist/mcp/transport.js.map +1 -0
  100. package/dist/search/query-parser.d.ts +66 -0
  101. package/dist/search/query-parser.d.ts.map +1 -0
  102. package/dist/search/query-parser.js +163 -0
  103. package/dist/search/query-parser.js.map +1 -0
  104. package/dist/search/query-utils.d.ts +78 -0
  105. package/dist/search/query-utils.d.ts.map +1 -0
  106. package/dist/search/query-utils.js +203 -0
  107. package/dist/search/query-utils.js.map +1 -0
  108. package/dist/types.d.ts +279 -0
  109. package/dist/types.d.ts.map +1 -0
  110. package/dist/types.js +47 -0
  111. package/dist/types.js.map +1 -0
  112. package/dist/utils.d.ts +40 -0
  113. package/dist/utils.d.ts.map +1 -0
  114. package/dist/utils.js +190 -0
  115. package/dist/utils.js.map +1 -0
  116. package/package.json +54 -0
@@ -0,0 +1,499 @@
1
+ "use strict";
2
+ /**
3
+ * MCP Tool Definitions & Handlers
4
+ *
5
+ * Defines the tools exposed by the DBGraph MCP server and implements their
6
+ * execution against a DBGraph knowledge graph instance.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.DBGraphToolHandler = void 0;
10
+ const formatter_1 = require("../context/formatter");
11
+ // =============================================================================
12
+ // Constants
13
+ // =============================================================================
14
+ /** Maximum output length to prevent context bloat (characters) */
15
+ const MAX_OUTPUT_LENGTH = 15_000;
16
+ /** Node kinds filterable in dbgraph_search */
17
+ const SEARCH_NODE_KINDS = ['table', 'column', 'view', 'index', 'constraint'];
18
+ // =============================================================================
19
+ // Tool Definitions
20
+ // =============================================================================
21
+ const tools = [
22
+ {
23
+ name: 'dbgraph_search',
24
+ description: 'Search database schema objects by name. Returns matching tables, columns, views, indexes, and constraints with relevance scores. Use this FIRST to find schema objects before calling dbgraph_context.',
25
+ inputSchema: {
26
+ type: 'object',
27
+ properties: {
28
+ query: {
29
+ type: 'string',
30
+ description: 'Name or partial name to search for (e.g., "orders", "user", "total_amount")',
31
+ },
32
+ kind: {
33
+ type: 'string',
34
+ description: 'Filter results to a specific schema object kind',
35
+ enum: [...SEARCH_NODE_KINDS],
36
+ },
37
+ limit: {
38
+ type: 'number',
39
+ description: 'Maximum number of results to return (default: 20)',
40
+ default: 20,
41
+ },
42
+ },
43
+ required: ['query'],
44
+ },
45
+ },
46
+ {
47
+ name: 'dbgraph_context',
48
+ description: 'PRIMARY TOOL — Get the full schema context for a table or view. Returns columns with types, nullability, defaults, primary keys, foreign keys, indexes, comments, and a list of tables that reference this one. Call this BEFORE writing SQL against a table.',
49
+ inputSchema: {
50
+ type: 'object',
51
+ properties: {
52
+ name: {
53
+ type: 'string',
54
+ description: 'Table or view name — can be a simple name ("orders"), qualified name ("public.orders"), or fully qualified ("ecommerce.public.orders")',
55
+ },
56
+ },
57
+ required: ['name'],
58
+ },
59
+ },
60
+ {
61
+ name: 'dbgraph_trace',
62
+ description: 'Trace foreign key relationships between two tables. Returns the join path (sequence of tables and FK columns) from source to target, or explains why no path exists. Use this to discover how to JOIN tables correctly.',
63
+ inputSchema: {
64
+ type: 'object',
65
+ properties: {
66
+ from: {
67
+ type: 'string',
68
+ description: 'Starting table name (simple or qualified, e.g., "orders" or "public.orders")',
69
+ },
70
+ to: {
71
+ type: 'string',
72
+ description: 'Target table name (simple or qualified, e.g., "users" or "public.users")',
73
+ },
74
+ },
75
+ required: ['from', 'to'],
76
+ },
77
+ },
78
+ {
79
+ name: 'dbgraph_explore',
80
+ description: 'Get schema context for several related tables or views in a single call. Provide multiple names separated by spaces. More efficient than calling dbgraph_context repeatedly.',
81
+ inputSchema: {
82
+ type: 'object',
83
+ properties: {
84
+ objects: {
85
+ type: 'string',
86
+ description: 'Space-separated list of table or view names to explore (e.g., "orders users order_items")',
87
+ },
88
+ },
89
+ required: ['objects'],
90
+ },
91
+ },
92
+ {
93
+ name: 'dbgraph_sources',
94
+ description: 'List all configured database sources. Returns a table of database aliases with engine type, host, object count, and last index time. Use this to discover what databases are available.',
95
+ inputSchema: {
96
+ type: 'object',
97
+ properties: {},
98
+ },
99
+ },
100
+ {
101
+ name: 'dbgraph_status',
102
+ description: 'Show knowledge graph statistics: total nodes, edges, database count, and breakdown by kind (tables, columns, views, indexes, foreign keys, etc.). Use this to verify the graph is healthy and complete.',
103
+ inputSchema: {
104
+ type: 'object',
105
+ properties: {},
106
+ },
107
+ },
108
+ ];
109
+ // =============================================================================
110
+ // Tool Handler
111
+ // =============================================================================
112
+ /**
113
+ * Executes dbgraph MCP tools against a DBGraph instance.
114
+ *
115
+ * The handler does NOT own the DBGraph lifecycle — the caller (MCPEngine)
116
+ * provides a getter so the handler always uses the current (possibly
117
+ * lazily-initialized) instance.
118
+ */
119
+ class DBGraphToolHandler {
120
+ getDBGraph;
121
+ formatter = new formatter_1.SchemaFormatter();
122
+ constructor(getDBGraph) {
123
+ this.getDBGraph = getDBGraph;
124
+ }
125
+ /**
126
+ * Return the tool definitions, optionally enriched with dynamic context
127
+ * (e.g. stats) from the live graph.
128
+ */
129
+ getTools() {
130
+ return tools;
131
+ }
132
+ /**
133
+ * Execute a tool by name.
134
+ */
135
+ async execute(name, args) {
136
+ try {
137
+ switch (name) {
138
+ case 'dbgraph_search':
139
+ return await this.handleSearch(args);
140
+ case 'dbgraph_context':
141
+ return await this.handleContext(args);
142
+ case 'dbgraph_trace':
143
+ return await this.handleTrace(args);
144
+ case 'dbgraph_explore':
145
+ return await this.handleExplore(args);
146
+ case 'dbgraph_sources':
147
+ return await this.handleSources();
148
+ case 'dbgraph_status':
149
+ return await this.handleStatus();
150
+ default:
151
+ return errorResult(`Unknown tool: ${name}`);
152
+ }
153
+ }
154
+ catch (err) {
155
+ return errorResult(`Tool execution failed: ${err instanceof Error ? err.message : String(err)}`);
156
+ }
157
+ }
158
+ // ---------------------------------------------------------------------------
159
+ // Handlers
160
+ // ---------------------------------------------------------------------------
161
+ /**
162
+ * dbgraph_search — Search schema objects by name. Delegates to
163
+ * QueryBuilder.searchNodes with optional kind filter and limit, then
164
+ * formats via SchemaFormatter.
165
+ */
166
+ async handleSearch(args) {
167
+ const query = validateString(args.query, 'query');
168
+ if (isErrorResult(query))
169
+ return query;
170
+ const kind = args.kind;
171
+ const rawLimit = Number(args.limit) || 20;
172
+ // Validate kind if provided
173
+ if (kind !== undefined && !SEARCH_NODE_KINDS.includes(kind)) {
174
+ return errorResult(`Invalid kind "${kind}". Valid values: ${SEARCH_NODE_KINDS.join(', ')}`);
175
+ }
176
+ const dbgraph = this.getDBGraph();
177
+ const results = dbgraph.getQueryBuilder().searchNodes(query, {
178
+ kinds: kind ? [kind] : undefined,
179
+ limit: Math.min(Math.max(rawLimit, 1), 100),
180
+ });
181
+ if (results.length === 0) {
182
+ return textResult(`No results found for "${query}"`);
183
+ }
184
+ const formatted = this.formatter.formatSearchResults(results);
185
+ return textResult(truncateOutput(formatted));
186
+ }
187
+ /**
188
+ * dbgraph_context — Get full schema context for a table or view.
189
+ *
190
+ * Resolves the name (simple, qualified, or fully qualified) via
191
+ * ContextBuilder.buildContext, which searches the graph and returns a
192
+ * complete markdown description.
193
+ */
194
+ async handleContext(args) {
195
+ const name = validateString(args.name, 'name');
196
+ if (isErrorResult(name))
197
+ return name;
198
+ const dbgraph = this.getDBGraph();
199
+ const markdown = await dbgraph.getContextBuilder().buildContext(name);
200
+ return textResult(truncateOutput(markdown));
201
+ }
202
+ /**
203
+ * dbgraph_trace — Trace FK join path between two tables.
204
+ *
205
+ * Resolves both names to nodes, then runs GraphTraverser.findPath over
206
+ * 'references', 'foreign_key', and 'contains' edges. Formats the
207
+ * resulting path as a readable join chain.
208
+ */
209
+ async handleTrace(args) {
210
+ const from = validateString(args.from, 'from');
211
+ if (isErrorResult(from))
212
+ return from;
213
+ const to = validateString(args.to, 'to');
214
+ if (isErrorResult(to))
215
+ return to;
216
+ const dbgraph = this.getDBGraph();
217
+ // Resolve start table
218
+ const fromNodes = this.resolveTableNodes(from, dbgraph);
219
+ if (fromNodes.length === 0) {
220
+ return textResult(`Table "${from}" not found in any indexed database.`);
221
+ }
222
+ // Resolve target table
223
+ const toNodes = this.resolveTableNodes(to, dbgraph);
224
+ if (toNodes.length === 0) {
225
+ return textResult(`Table "${to}" not found in any indexed database.`);
226
+ }
227
+ // Try each candidate pair — pick the first valid path
228
+ const edgeKinds = ['references', 'foreign_key', 'contains'];
229
+ const MAX_HOPS = 10;
230
+ let path = null;
231
+ let notFoundReason = '';
232
+ for (const f of fromNodes.slice(0, 3)) {
233
+ for (const t of toNodes.slice(0, 3)) {
234
+ const p = dbgraph.getTraverser().findPath(f.id, t.id, edgeKinds);
235
+ if (!p || p.length <= 1) {
236
+ if (!notFoundReason) {
237
+ notFoundReason = 'No foreign key join path exists between these tables. They may belong to different databases or schemas with no FK relationship.';
238
+ }
239
+ continue;
240
+ }
241
+ if (p.length <= MAX_HOPS) {
242
+ path = p;
243
+ break;
244
+ }
245
+ // Path exists but is very long — use it as fallback
246
+ if (!path || p.length < path.length)
247
+ path = p;
248
+ }
249
+ if (path && path.length <= MAX_HOPS)
250
+ break;
251
+ }
252
+ if (!path) {
253
+ return textResult(notFoundReason);
254
+ }
255
+ // Format the path as readable markdown
256
+ const lines = [];
257
+ lines.push(`## FK Trace: ${from} → ${to}`);
258
+ lines.push('');
259
+ lines.push(`${path.length - 1} hop(s):`);
260
+ lines.push('');
261
+ // Each step in path has { node, edge } — edge is null for the start node.
262
+ // For subsequent steps, edge is the connecting edge from previous → current.
263
+ for (let i = 0; i < path.length; i++) {
264
+ const step = path[i];
265
+ const edge = step.edge;
266
+ const node = step.node;
267
+ const label = i === 0 ? '**Start**' : `**Step ${i}**`;
268
+ const kindIcon = node.kind === 'table'
269
+ ? '📋'
270
+ : node.kind === 'view'
271
+ ? '👁️'
272
+ : '📎';
273
+ lines.push(`${label}: ${kindIcon} \`${node.qualifiedName}\` (${node.kind})`);
274
+ if (edge) {
275
+ const edgeDesc = describeEdge(edge);
276
+ lines.push(` └─ via ${edgeDesc}`);
277
+ }
278
+ lines.push('');
279
+ }
280
+ return textResult(truncateOutput(lines.join('\n')));
281
+ }
282
+ /**
283
+ * dbgraph_explore — Fetch schema context for multiple objects in one call.
284
+ *
285
+ * Splits the space-separated names, finds each table/view node, and calls
286
+ * ContextBuilder.getTableSchema for each. Assembles a single markdown
287
+ * document.
288
+ */
289
+ async handleExplore(args) {
290
+ const raw = validateString(args.objects, 'objects');
291
+ if (isErrorResult(raw))
292
+ return raw;
293
+ const names = raw
294
+ .split(/\s+/)
295
+ .map((s) => s.trim())
296
+ .filter((s) => s.length > 0);
297
+ if (names.length === 0) {
298
+ return errorResult('Provide at least one table or view name');
299
+ }
300
+ const dbgraph = this.getDBGraph();
301
+ const parts = [];
302
+ let errors = 0;
303
+ for (const name of names) {
304
+ const nodes = this.resolveTableNodes(name, dbgraph);
305
+ if (nodes.length === 0) {
306
+ parts.push(`**${name}** — *not found*`);
307
+ errors++;
308
+ continue;
309
+ }
310
+ // Pick the first match for each name
311
+ const node = nodes[0];
312
+ try {
313
+ const schema = await dbgraph.getContextBuilder().getTableSchema(node.id);
314
+ parts.push(this.formatter.formatTableSchema(schema));
315
+ }
316
+ catch (err) {
317
+ parts.push(`**${name}** — *error: ${err instanceof Error ? err.message : 'unknown'}*`);
318
+ errors++;
319
+ }
320
+ }
321
+ if (parts.length === 0) {
322
+ return textResult('None of the specified objects were found.');
323
+ }
324
+ const summary = errors > 0
325
+ ? `\n\n---\n*${errors} object(s) not found or errored.*\n`
326
+ : '';
327
+ return textResult(truncateOutput(parts.join('\n---\n\n') + summary));
328
+ }
329
+ /**
330
+ * dbgraph_sources — List all database sources.
331
+ */
332
+ async handleSources() {
333
+ const dbgraph = this.getDBGraph();
334
+ const sources = dbgraph.getQueryBuilder().getAllDbSources();
335
+ const stats = dbgraph.getQueryBuilder().getStats();
336
+ if (sources.length === 0) {
337
+ return textResult('*No database sources configured. Run `dbgraph init` first.*');
338
+ }
339
+ const formatted = this.formatter.formatDatabaseOverview(sources, stats);
340
+ return textResult(truncateOutput(formatted));
341
+ }
342
+ /**
343
+ * dbgraph_status — Show graph statistics.
344
+ */
345
+ async handleStatus() {
346
+ const dbgraph = this.getDBGraph();
347
+ const stats = dbgraph.getQueryBuilder().getStats();
348
+ const lines = [];
349
+ lines.push('## DBGraph Status');
350
+ lines.push('');
351
+ if (stats.nodeCount === 0) {
352
+ lines.push('*The knowledge graph is empty. Run `dbgraph index` to introspect your databases.*');
353
+ lines.push('');
354
+ return textResult(lines.join('\n'));
355
+ }
356
+ lines.push('| Metric | Value |');
357
+ lines.push('|--------|-------|');
358
+ lines.push(`| Total nodes | ${stats.nodeCount.toLocaleString()} |`);
359
+ lines.push(`| Total edges | ${stats.edgeCount.toLocaleString()} |`);
360
+ lines.push(`| Databases | ${stats.dbCount.toLocaleString()} |`);
361
+ if (stats.lastUpdated) {
362
+ const date = new Date(stats.lastUpdated).toISOString();
363
+ lines.push(`| Last indexed | ${date} |`);
364
+ }
365
+ if (stats.dbSizeBytes > 0) {
366
+ const size = stats.dbSizeBytes > 1_048_576
367
+ ? `${(stats.dbSizeBytes / 1_048_576).toFixed(1)} MB`
368
+ : `${(stats.dbSizeBytes / 1024).toFixed(1)} KB`;
369
+ lines.push(`| Database size | ${size} |`);
370
+ }
371
+ lines.push('');
372
+ // Node breakdown by kind
373
+ const kindLabels = {
374
+ table: 'Tables',
375
+ view: 'Views',
376
+ column: 'Columns',
377
+ index: 'Indexes',
378
+ foreign_key: 'Foreign Keys',
379
+ constraint: 'Constraints',
380
+ trigger: 'Triggers',
381
+ stored_procedure: 'Stored Procedures',
382
+ function: 'Functions',
383
+ sequence: 'Sequences',
384
+ schema: 'Schemas',
385
+ database: 'Databases',
386
+ server: 'Servers',
387
+ };
388
+ lines.push('**Nodes by kind:**');
389
+ lines.push('');
390
+ for (const [kind, count] of Object.entries(stats.nodesByKind)) {
391
+ if (count > 0) {
392
+ const label = kindLabels[kind] ?? kind;
393
+ lines.push(`- ${label}: ${count.toLocaleString()}`);
394
+ }
395
+ }
396
+ if (Object.keys(stats.edgesByKind).length > 0) {
397
+ lines.push('');
398
+ lines.push('**Edges by kind:**');
399
+ lines.push('');
400
+ for (const [kind, count] of Object.entries(stats.edgesByKind)) {
401
+ if (count > 0) {
402
+ lines.push(`- ${kind}: ${count.toLocaleString()}`);
403
+ }
404
+ }
405
+ }
406
+ lines.push('');
407
+ lines.push(`Project root: \`${dbgraph.getProjectRoot()}\``);
408
+ return textResult(lines.join('\n'));
409
+ }
410
+ // ---------------------------------------------------------------------------
411
+ // Helpers
412
+ // ---------------------------------------------------------------------------
413
+ /**
414
+ * Resolve a table or view name to graph nodes.
415
+ *
416
+ * Attempts, in order:
417
+ * 1. Exact node ID lookup
418
+ * 2. Qualified name lookup
419
+ * 3. FTS5 search for table/view kind
420
+ */
421
+ resolveTableNodes(name, dbgraph) {
422
+ // 1. Try as node ID
423
+ const byId = dbgraph.getQueryBuilder().getNodeById(name);
424
+ if (byId && (byId.kind === 'table' || byId.kind === 'view')) {
425
+ return [byId];
426
+ }
427
+ // 2. Try as qualified name
428
+ const byQualified = dbgraph.getQueryBuilder().getNodesByQualifiedName(name);
429
+ const tableLike = byQualified.filter((n) => n.kind === 'table' || n.kind === 'view');
430
+ if (tableLike.length > 0)
431
+ return tableLike;
432
+ // 3. FTS5 fallback
433
+ const results = dbgraph.getQueryBuilder().searchNodes(name, {
434
+ kinds: ['table', 'view'],
435
+ limit: 10,
436
+ });
437
+ return results.map((r) => r.node);
438
+ }
439
+ }
440
+ exports.DBGraphToolHandler = DBGraphToolHandler;
441
+ // =============================================================================
442
+ // Utility Functions
443
+ // =============================================================================
444
+ /** Create a successful text result */
445
+ function textResult(text) {
446
+ return { content: [{ type: 'text', text }] };
447
+ }
448
+ /** Create an error result */
449
+ function errorResult(message) {
450
+ return { content: [{ type: 'text', text: message }], isError: true };
451
+ }
452
+ /** Check if a result from validateString is an error */
453
+ function isErrorResult(value) {
454
+ return typeof value !== 'string';
455
+ }
456
+ /**
457
+ * Validate that a value is a non-empty string within length bounds.
458
+ * Returns the string if valid, or a ToolResult with the error.
459
+ */
460
+ function validateString(value, name, maxLength = 10_000) {
461
+ if (typeof value !== 'string' || value.length === 0) {
462
+ return errorResult(`${name} must be a non-empty string`);
463
+ }
464
+ if (value.length > maxLength) {
465
+ return errorResult(`${name} exceeds maximum length of ${maxLength} characters (got ${value.length})`);
466
+ }
467
+ return value;
468
+ }
469
+ /**
470
+ * Truncate output to the maximum allowed length.
471
+ */
472
+ function truncateOutput(text, maxLength = MAX_OUTPUT_LENGTH) {
473
+ if (text.length <= maxLength)
474
+ return text;
475
+ const truncated = text.slice(0, maxLength);
476
+ return `${truncated}\n\n_… (output truncated at ${maxLength.toLocaleString()} characters)_`;
477
+ }
478
+ /**
479
+ * Build a human-readable description of an edge for the trace output.
480
+ */
481
+ function describeEdge(edge) {
482
+ switch (edge.kind) {
483
+ case 'references':
484
+ return `FK reference \`${edge.metadata?.constraintName ?? '(columns)'}\``;
485
+ case 'foreign_key':
486
+ return `foreign key constraint \`${edge.metadata?.constraintName ?? edge.kind}\``;
487
+ case 'contains':
488
+ return 'containment';
489
+ case 'primary_key':
490
+ return 'primary key';
491
+ case 'indexed_by':
492
+ return 'index';
493
+ case 'depends_on':
494
+ return 'dependency';
495
+ default:
496
+ return edge.kind;
497
+ }
498
+ }
499
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * MCP Transport Layer
3
+ *
4
+ * JSON-RPC over stdin/stdout for direct mode (MCP stdio transport).
5
+ * JSON-RPC over Unix sockets / named pipes for daemon mode.
6
+ */
7
+ import * as net from 'net';
8
+ export interface JsonRpcRequest {
9
+ jsonrpc: '2.0';
10
+ id: number | string;
11
+ method: string;
12
+ params?: unknown;
13
+ }
14
+ export interface JsonRpcNotification {
15
+ jsonrpc: '2.0';
16
+ method: string;
17
+ params?: unknown;
18
+ }
19
+ export interface JsonRpcSuccess {
20
+ jsonrpc: '2.0';
21
+ id: number | string;
22
+ result: unknown;
23
+ }
24
+ export interface JsonRpcError {
25
+ jsonrpc: '2.0';
26
+ id: number | string;
27
+ error: {
28
+ code: number;
29
+ message: string;
30
+ data?: unknown;
31
+ };
32
+ }
33
+ export type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification;
34
+ export type JsonRpcResponse = JsonRpcSuccess | JsonRpcError;
35
+ export declare enum ErrorCodes {
36
+ ParseError = -32700,
37
+ InvalidRequest = -32600,
38
+ MethodNotFound = -32601,
39
+ InvalidParams = -32602,
40
+ InternalError = -32603
41
+ }
42
+ export interface JsonRpcTransport {
43
+ start(handler: (message: JsonRpcMessage) => void): void;
44
+ sendResult(id: number | string, result: unknown): void;
45
+ sendError(id: number | string, code: number, message: string, data?: unknown): void;
46
+ sendNotification(method: string, params?: unknown): void;
47
+ stop(): void;
48
+ }
49
+ export declare class StdioTransport implements JsonRpcTransport {
50
+ private handler;
51
+ private buffer;
52
+ private stopped;
53
+ start(handler: (message: JsonRpcMessage) => void): void;
54
+ private onData;
55
+ private onEnd;
56
+ sendResult(id: number | string, result: unknown): void;
57
+ sendError(id: number | string, code: number, message: string, data?: unknown): void;
58
+ sendNotification(method: string, params?: unknown): void;
59
+ stop(): void;
60
+ private write;
61
+ }
62
+ export declare class SocketTransport implements JsonRpcTransport {
63
+ private socket;
64
+ private handler;
65
+ private buffer;
66
+ private stopped;
67
+ constructor(socket: net.Socket);
68
+ start(handler: (message: JsonRpcMessage) => void): void;
69
+ private onData;
70
+ private onClose;
71
+ sendResult(id: number | string, result: unknown): void;
72
+ sendError(id: number | string, code: number, message: string, data?: unknown): void;
73
+ sendNotification(method: string, params?: unknown): void;
74
+ stop(): void;
75
+ }
76
+ export declare function getDaemonSocketPath(projectRoot: string): string;
77
+ export declare function getDaemonPidPath(projectRoot: string): string;
78
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/mcp/transport.ts"],"names":[],"mappings":"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"}