trace-mcp 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.
@@ -0,0 +1,656 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import Database from 'better-sqlite3';
3
+ import { Result } from 'neverthrow';
4
+ import { z } from 'zod';
5
+
6
+ type TraceMcpError = {
7
+ code: 'PARSE_ERROR';
8
+ file: string;
9
+ partial: boolean;
10
+ message: string;
11
+ } | {
12
+ code: 'NOT_FOUND';
13
+ id: string;
14
+ candidates?: string[];
15
+ } | {
16
+ code: 'RESOLUTION_FAILED';
17
+ path: string;
18
+ message: string;
19
+ } | {
20
+ code: 'TIMEOUT';
21
+ operation: string;
22
+ ms: number;
23
+ } | {
24
+ code: 'SECURITY_VIOLATION';
25
+ detail: string;
26
+ } | {
27
+ code: 'PLUGIN_ERROR';
28
+ plugin: string;
29
+ message: string;
30
+ } | {
31
+ code: 'DB_ERROR';
32
+ message: string;
33
+ } | {
34
+ code: 'CONFIG_ERROR';
35
+ message: string;
36
+ } | {
37
+ code: 'VALIDATION_ERROR';
38
+ message: string;
39
+ details?: unknown;
40
+ };
41
+ type TraceMcpResult<T> = Result<T, TraceMcpError>;
42
+
43
+ interface NodeTypeDeclaration {
44
+ name: string;
45
+ }
46
+ interface EdgeTypeDeclaration {
47
+ name: string;
48
+ category: string;
49
+ directed?: boolean;
50
+ description?: string;
51
+ }
52
+ interface RawSymbol {
53
+ symbolId: string;
54
+ name: string;
55
+ kind: SymbolKind;
56
+ fqn?: string;
57
+ parentSymbolId?: string;
58
+ signature?: string;
59
+ byteStart: number;
60
+ byteEnd: number;
61
+ lineStart?: number;
62
+ lineEnd?: number;
63
+ metadata?: Record<string, unknown>;
64
+ }
65
+ type SymbolKind = 'class' | 'method' | 'function' | 'constant' | 'property' | 'interface' | 'trait' | 'enum' | 'type' | 'variable' | 'enum_case' | 'namespace' | 'decorator';
66
+ interface RawEdge {
67
+ sourceSymbolId?: string;
68
+ sourceNodeType?: string;
69
+ sourceRefId?: number;
70
+ targetSymbolId?: string;
71
+ targetNodeType?: string;
72
+ targetRefId?: number;
73
+ edgeType: string;
74
+ resolved?: boolean;
75
+ metadata?: Record<string, unknown>;
76
+ }
77
+ interface RawRoute {
78
+ method: string;
79
+ uri: string;
80
+ name?: string;
81
+ controllerSymbolId?: string;
82
+ handler?: string;
83
+ middleware?: string[];
84
+ fileId?: number;
85
+ line?: number;
86
+ metadata?: Record<string, unknown>;
87
+ }
88
+ interface RawComponent {
89
+ name: string;
90
+ kind: 'page' | 'component' | 'layout' | 'context' | 'provider' | 'hook';
91
+ props?: Record<string, unknown>;
92
+ emits?: string[];
93
+ slots?: string[];
94
+ composables?: string[];
95
+ framework: string;
96
+ }
97
+ interface RawMigration {
98
+ tableName: string;
99
+ operation: 'create' | 'alter' | 'drop';
100
+ columns?: Record<string, unknown>[];
101
+ indices?: Record<string, unknown>[];
102
+ timestamp?: string;
103
+ }
104
+ interface RawOrmModel {
105
+ name: string;
106
+ orm: 'mongoose' | 'sequelize' | 'sqlalchemy' | 'django' | 'prisma' | 'typeorm' | 'drizzle';
107
+ collectionOrTable?: string;
108
+ fields?: Record<string, unknown>[];
109
+ options?: Record<string, unknown>;
110
+ metadata?: Record<string, unknown>;
111
+ }
112
+ interface RawOrmAssociation {
113
+ sourceModelName: string;
114
+ targetModelName: string;
115
+ kind: string;
116
+ options?: Record<string, unknown>;
117
+ line?: number;
118
+ }
119
+ interface RawRnScreen {
120
+ name: string;
121
+ componentPath?: string;
122
+ navigatorType?: 'stack' | 'tab' | 'drawer' | 'native-stack';
123
+ options?: Record<string, unknown>;
124
+ deepLink?: string;
125
+ metadata?: Record<string, unknown>;
126
+ }
127
+ interface FileParseResult {
128
+ language?: string;
129
+ frameworkRole?: string;
130
+ status: 'ok' | 'partial' | 'error';
131
+ symbols: RawSymbol[];
132
+ edges?: RawEdge[];
133
+ routes?: RawRoute[];
134
+ components?: RawComponent[];
135
+ migrations?: RawMigration[];
136
+ ormModels?: RawOrmModel[];
137
+ ormAssociations?: RawOrmAssociation[];
138
+ rnScreens?: RawRnScreen[];
139
+ warnings?: string[];
140
+ metadata?: Record<string, unknown>;
141
+ }
142
+ interface PluginManifest {
143
+ name: string;
144
+ version: string;
145
+ priority: number;
146
+ dependencies?: string[];
147
+ }
148
+ interface ProjectContext {
149
+ rootPath: string;
150
+ composerJson?: Record<string, unknown>;
151
+ packageJson?: Record<string, unknown>;
152
+ pyprojectToml?: Record<string, unknown>;
153
+ requirementsTxt?: string[];
154
+ configFiles: string[];
155
+ }
156
+ interface LanguagePlugin {
157
+ manifest: PluginManifest;
158
+ supportedExtensions: string[];
159
+ extractSymbols(filePath: string, content: Buffer): TraceMcpResult<FileParseResult>;
160
+ }
161
+ interface FrameworkPlugin {
162
+ manifest: PluginManifest;
163
+ detect(ctx: ProjectContext): boolean;
164
+ registerSchema(): {
165
+ nodeTypes?: NodeTypeDeclaration[];
166
+ edgeTypes?: EdgeTypeDeclaration[];
167
+ };
168
+ extractNodes?(filePath: string, content: Buffer, language: string): TraceMcpResult<FileParseResult>;
169
+ resolveEdges?(ctx: ResolveContext): TraceMcpResult<RawEdge[]>;
170
+ configure?(config: Record<string, unknown>): void;
171
+ }
172
+ interface ResolveContext {
173
+ rootPath: string;
174
+ getAllFiles(): {
175
+ id: number;
176
+ path: string;
177
+ language: string | null;
178
+ }[];
179
+ getSymbolsByFile(fileId: number): {
180
+ id: number;
181
+ symbolId: string;
182
+ name: string;
183
+ kind: string;
184
+ fqn: string | null;
185
+ lineStart?: number | null;
186
+ lineEnd?: number | null;
187
+ metadata?: Record<string, unknown> | null;
188
+ }[];
189
+ getSymbolByFqn(fqn: string): {
190
+ id: number;
191
+ symbolId: string;
192
+ } | undefined;
193
+ getNodeId(nodeType: string, refId: number): number | undefined;
194
+ createNodeIfNeeded(nodeType: string, refId: number): number;
195
+ /** Read file content — uses Pass 1 cache when available, falls back to disk. */
196
+ readFile(relPath: string): string | undefined;
197
+ }
198
+
199
+ declare class Store {
200
+ readonly db: Database.Database;
201
+ constructor(db: Database.Database);
202
+ insertFile(path: string, language: string | null, contentHash: string | null, byteLength: number | null, workspace?: string | null): number;
203
+ getFile(path: string): FileRow | undefined;
204
+ getFileById(id: number): FileRow | undefined;
205
+ getAllFiles(): FileRow[];
206
+ updateFileWorkspace(fileId: number, workspace: string): void;
207
+ getFilesByWorkspace(workspace: string): FileRow[];
208
+ updateFileHash(fileId: number, hash: string, byteLength: number): void;
209
+ updateFileStatus(fileId: number, status: string, frameworkRole?: string): void;
210
+ deleteFile(fileId: number): void;
211
+ /** Delete routes, components, migrations, ORM models, and RN screens for a file (and their nodes). */
212
+ deleteEntitiesByFile(fileId: number): void;
213
+ insertSymbol(fileId: number, sym: RawSymbol): number;
214
+ insertSymbols(fileId: number, symbols: RawSymbol[]): number[];
215
+ deleteSymbolsByFile(fileId: number): void;
216
+ getSymbolsByFile(fileId: number): SymbolRow[];
217
+ getSymbolBySymbolId(symbolId: string): SymbolRow | undefined;
218
+ getSymbolByFqn(fqn: string): SymbolRow | undefined;
219
+ createNode(nodeType: string, refId: number): number;
220
+ getNodeId(nodeType: string, refId: number): number | undefined;
221
+ insertEdge(sourceNodeId: number, targetNodeId: number, edgeTypeName: string, resolved?: boolean, metadata?: Record<string, unknown>, isCrossWs?: boolean): TraceMcpResult<number>;
222
+ deleteEdgesForFileNodes(fileId: number): void;
223
+ traverseEdges(startNodeId: number, direction: 'outgoing' | 'incoming', depth: number): EdgeRow[];
224
+ insertRoute(route: RawRoute, fileId: number): number;
225
+ insertComponent(comp: RawComponent, fileId: number): number;
226
+ getComponentByFileId(fileId: number): ComponentRow | undefined;
227
+ getComponentByName(name: string): ComponentRow | undefined;
228
+ getAllComponents(): ComponentRow[];
229
+ /** Ensure an edge type exists in the database, inserting if missing. */
230
+ ensureEdgeType(name: string, category: string, description: string): void;
231
+ /** Get the edge type name by its id */
232
+ getEdgeTypeName(edgeTypeId: number): string | undefined;
233
+ /** Reverse-lookup: find which symbol/file a node refers to */
234
+ getNodeRef(nodeId: number): {
235
+ nodeType: string;
236
+ refId: number;
237
+ } | undefined;
238
+ insertMigration(mig: RawMigration, fileId: number): number;
239
+ getRouteByUriAndMethod(uri: string, method: string): RouteRow | undefined;
240
+ getAllRoutes(): RouteRow[];
241
+ findRouteByPattern(uri: string, method: string): RouteRow | undefined;
242
+ getMigrationsByTable(tableName: string): MigrationRow[];
243
+ getAllMigrations(): MigrationRow[];
244
+ getEdgesByType(edgeTypeName: string): EdgeRow[];
245
+ getOutgoingEdges(nodeId: number): (EdgeRow & {
246
+ edge_type_name: string;
247
+ })[];
248
+ getIncomingEdges(nodeId: number): (EdgeRow & {
249
+ edge_type_name: string;
250
+ })[];
251
+ insertOrmModel(model: RawOrmModel, fileId: number): number;
252
+ getOrmModelByName(name: string): OrmModelRow | undefined;
253
+ getOrmModelsByOrm(orm: string): OrmModelRow[];
254
+ getAllOrmModels(): OrmModelRow[];
255
+ insertOrmAssociation(sourceModelId: number, targetModelId: number | null, targetModelName: string, kind: string, options?: Record<string, unknown>, fileId?: number, line?: number): number;
256
+ getAllOrmAssociations(): OrmAssociationRow[];
257
+ getOrmAssociationsByModel(modelId: number): OrmAssociationRow[];
258
+ insertRnScreen(screen: RawRnScreen, fileId: number): number;
259
+ getRnScreenByName(name: string): RnScreenRow | undefined;
260
+ getAllRnScreens(): RnScreenRow[];
261
+ getSymbolById(id: number): SymbolRow | undefined;
262
+ getNodeByNodeId(nodeId: number): {
263
+ node_type: string;
264
+ ref_id: number;
265
+ } | undefined;
266
+ findImplementors(name: string): SymbolWithFilePath[];
267
+ getExportedSymbols(filePattern?: string): SymbolWithFilePath[];
268
+ getEdgeTypes(): EdgeTypeRow[];
269
+ /**
270
+ * Get all symbols that have heritage metadata (extends/implements).
271
+ * Used by the TypeScript heritage resolver in the pipeline.
272
+ */
273
+ getSymbolsWithHeritage(): (SymbolRow & {
274
+ file_path: string;
275
+ })[];
276
+ /**
277
+ * Find a symbol by name and optional kind.
278
+ * Returns the first match (prefers exact name match over substring).
279
+ */
280
+ getSymbolByName(name: string, kind?: string): SymbolRow | undefined;
281
+ /** Resolve multiple node IDs in one query. Returns Map<refId, nodeId>. */
282
+ getNodeIdsBatch(nodeType: string, refIds: number[]): Map<number, number>;
283
+ /** Resolve multiple node refs in one query. Returns Map<nodeId, {nodeType, refId}>. */
284
+ getNodeRefsBatch(nodeIds: number[]): Map<number, {
285
+ nodeType: string;
286
+ refId: number;
287
+ }>;
288
+ /** Batch-fetch symbols by internal IDs. Returns Map<id, SymbolRow>. */
289
+ getSymbolsByIds(ids: number[]): Map<number, SymbolRow>;
290
+ /** Batch-fetch files by internal IDs. Returns Map<id, FileRow>. */
291
+ getFilesByIds(ids: number[]): Map<number, FileRow>;
292
+ /**
293
+ * Fetch all edges where any of the given node IDs appear as source or target.
294
+ * Returns edges annotated with edge_type_name and the pivot node id (the one from the input set).
295
+ */
296
+ getEdgesForNodesBatch(nodeIds: number[]): Array<EdgeRow & {
297
+ edge_type_name: string;
298
+ pivot_node_id: number;
299
+ }>;
300
+ /** Find a class/interface symbol by name with optional framework_role filter. Single query with JOIN. */
301
+ findSymbolByRole(name: string, frameworkRole?: string): SymbolRow | undefined;
302
+ insertEnvVar(fileId: number, entry: {
303
+ key: string;
304
+ valueType: string;
305
+ valueFormat: string | null;
306
+ comment: string | null;
307
+ quoted: boolean;
308
+ line: number;
309
+ }): number;
310
+ deleteEnvVarsByFile(fileId: number): void;
311
+ getEnvVarsByFile(fileId: number): EnvVarRow[];
312
+ getAllEnvVars(): (EnvVarRow & {
313
+ file_path: string;
314
+ })[];
315
+ searchEnvVars(pattern: string): (EnvVarRow & {
316
+ file_path: string;
317
+ })[];
318
+ updateSymbolSummary(symbolId: number, summary: string): void;
319
+ getUnsummarizedSymbols(kinds: string[], limit: number): {
320
+ id: number;
321
+ name: string;
322
+ fqn: string | null;
323
+ kind: string;
324
+ signature: string | null;
325
+ file_path: string;
326
+ byte_start: number;
327
+ byte_end: number;
328
+ }[];
329
+ getStats(): IndexStats;
330
+ }
331
+ interface FileRow {
332
+ id: number;
333
+ path: string;
334
+ language: string | null;
335
+ framework_role: string | null;
336
+ status: string;
337
+ content_hash: string | null;
338
+ byte_length: number | null;
339
+ indexed_at: string;
340
+ metadata: string | null;
341
+ workspace: string | null;
342
+ }
343
+ interface SymbolRow {
344
+ id: number;
345
+ file_id: number;
346
+ symbol_id: string;
347
+ name: string;
348
+ kind: string;
349
+ fqn: string | null;
350
+ parent_id: number | null;
351
+ signature: string | null;
352
+ summary: string | null;
353
+ byte_start: number;
354
+ byte_end: number;
355
+ line_start: number | null;
356
+ line_end: number | null;
357
+ metadata: string | null;
358
+ }
359
+ interface EdgeRow {
360
+ id: number;
361
+ source_node_id: number;
362
+ target_node_id: number;
363
+ edge_type_id: number;
364
+ resolved: number;
365
+ metadata: string | null;
366
+ is_cross_ws: number;
367
+ }
368
+ interface RouteRow {
369
+ id: number;
370
+ method: string;
371
+ uri: string;
372
+ name: string | null;
373
+ handler: string | null;
374
+ controller_symbol_id: string | null;
375
+ middleware: string | null;
376
+ metadata: string | null;
377
+ file_id: number | null;
378
+ line: number | null;
379
+ }
380
+ interface MigrationRow {
381
+ id: number;
382
+ file_id: number;
383
+ table_name: string;
384
+ operation: string;
385
+ columns: string | null;
386
+ indices: string | null;
387
+ timestamp: string | null;
388
+ }
389
+ interface ComponentRow {
390
+ id: number;
391
+ file_id: number;
392
+ name: string;
393
+ kind: string;
394
+ props: string | null;
395
+ emits: string | null;
396
+ slots: string | null;
397
+ composables: string | null;
398
+ framework: string;
399
+ }
400
+ interface OrmModelRow {
401
+ id: number;
402
+ file_id: number;
403
+ name: string;
404
+ orm: string;
405
+ collection_or_table: string | null;
406
+ fields: string | null;
407
+ options: string | null;
408
+ metadata: string | null;
409
+ }
410
+ interface OrmAssociationRow {
411
+ id: number;
412
+ source_model_id: number;
413
+ target_model_id: number | null;
414
+ target_model_name: string | null;
415
+ kind: string;
416
+ options: string | null;
417
+ file_id: number | null;
418
+ line: number | null;
419
+ }
420
+ interface RnScreenRow {
421
+ id: number;
422
+ file_id: number;
423
+ name: string;
424
+ component_path: string | null;
425
+ navigator_type: string | null;
426
+ options: string | null;
427
+ deep_link: string | null;
428
+ metadata: string | null;
429
+ }
430
+ interface EnvVarRow {
431
+ id: number;
432
+ file_id: number;
433
+ key: string;
434
+ value_type: string;
435
+ value_format: string | null;
436
+ comment: string | null;
437
+ quoted: number;
438
+ line: number | null;
439
+ }
440
+ interface SymbolWithFilePath extends SymbolRow {
441
+ file_path: string;
442
+ }
443
+ interface EdgeTypeRow {
444
+ name: string;
445
+ category: string;
446
+ description: string;
447
+ }
448
+ interface IndexStats {
449
+ totalFiles: number;
450
+ totalSymbols: number;
451
+ totalEdges: number;
452
+ totalNodes: number;
453
+ totalRoutes: number;
454
+ totalComponents: number;
455
+ totalMigrations: number;
456
+ partialFiles: number;
457
+ errorFiles: number;
458
+ }
459
+
460
+ declare class PluginRegistry {
461
+ private languagePlugins;
462
+ private frameworkPlugins;
463
+ registerLanguagePlugin(plugin: LanguagePlugin): void;
464
+ registerFrameworkPlugin(plugin: FrameworkPlugin): void;
465
+ getLanguagePlugins(): LanguagePlugin[];
466
+ getActiveFrameworkPlugins(ctx: ProjectContext): TraceMcpResult<FrameworkPlugin[]>;
467
+ getAllFrameworkPlugins(): FrameworkPlugin[];
468
+ getLanguagePluginForFile(filePath: string): LanguagePlugin | undefined;
469
+ private sortByPriority;
470
+ private topologicalSort;
471
+ }
472
+
473
+ declare const TraceMcpConfigSchema: z.ZodObject<{
474
+ root: z.ZodDefault<z.ZodString>;
475
+ include: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
476
+ exclude: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
477
+ db: z.ZodDefault<z.ZodObject<{
478
+ path: z.ZodDefault<z.ZodString>;
479
+ }, "strip", z.ZodTypeAny, {
480
+ path: string;
481
+ }, {
482
+ path?: string | undefined;
483
+ }>>;
484
+ frameworks: z.ZodOptional<z.ZodObject<{
485
+ laravel: z.ZodOptional<z.ZodObject<{
486
+ artisan: z.ZodOptional<z.ZodObject<{
487
+ enabled: z.ZodDefault<z.ZodBoolean>;
488
+ timeout: z.ZodDefault<z.ZodNumber>;
489
+ }, "strip", z.ZodTypeAny, {
490
+ enabled: boolean;
491
+ timeout: number;
492
+ }, {
493
+ enabled?: boolean | undefined;
494
+ timeout?: number | undefined;
495
+ }>>;
496
+ graceful_degradation: z.ZodDefault<z.ZodBoolean>;
497
+ }, "strip", z.ZodTypeAny, {
498
+ graceful_degradation: boolean;
499
+ artisan?: {
500
+ enabled: boolean;
501
+ timeout: number;
502
+ } | undefined;
503
+ }, {
504
+ artisan?: {
505
+ enabled?: boolean | undefined;
506
+ timeout?: number | undefined;
507
+ } | undefined;
508
+ graceful_degradation?: boolean | undefined;
509
+ }>>;
510
+ }, "strip", z.ZodTypeAny, {
511
+ laravel?: {
512
+ graceful_degradation: boolean;
513
+ artisan?: {
514
+ enabled: boolean;
515
+ timeout: number;
516
+ } | undefined;
517
+ } | undefined;
518
+ }, {
519
+ laravel?: {
520
+ artisan?: {
521
+ enabled?: boolean | undefined;
522
+ timeout?: number | undefined;
523
+ } | undefined;
524
+ graceful_degradation?: boolean | undefined;
525
+ } | undefined;
526
+ }>>;
527
+ ai: z.ZodOptional<z.ZodObject<{
528
+ enabled: z.ZodDefault<z.ZodBoolean>;
529
+ provider: z.ZodDefault<z.ZodEnum<["ollama", "openai"]>>;
530
+ base_url: z.ZodOptional<z.ZodString>;
531
+ api_key: z.ZodOptional<z.ZodString>;
532
+ inference_model: z.ZodOptional<z.ZodString>;
533
+ fast_model: z.ZodOptional<z.ZodString>;
534
+ embedding_model: z.ZodOptional<z.ZodString>;
535
+ embedding_dimensions: z.ZodOptional<z.ZodNumber>;
536
+ summarize_on_index: z.ZodDefault<z.ZodBoolean>;
537
+ summarize_batch_size: z.ZodDefault<z.ZodNumber>;
538
+ summarize_kinds: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
539
+ reranker_model: z.ZodOptional<z.ZodString>;
540
+ }, "strip", z.ZodTypeAny, {
541
+ enabled: boolean;
542
+ provider: "ollama" | "openai";
543
+ summarize_on_index: boolean;
544
+ summarize_batch_size: number;
545
+ summarize_kinds: string[];
546
+ base_url?: string | undefined;
547
+ api_key?: string | undefined;
548
+ inference_model?: string | undefined;
549
+ fast_model?: string | undefined;
550
+ embedding_model?: string | undefined;
551
+ embedding_dimensions?: number | undefined;
552
+ reranker_model?: string | undefined;
553
+ }, {
554
+ enabled?: boolean | undefined;
555
+ provider?: "ollama" | "openai" | undefined;
556
+ base_url?: string | undefined;
557
+ api_key?: string | undefined;
558
+ inference_model?: string | undefined;
559
+ fast_model?: string | undefined;
560
+ embedding_model?: string | undefined;
561
+ embedding_dimensions?: number | undefined;
562
+ summarize_on_index?: boolean | undefined;
563
+ summarize_batch_size?: number | undefined;
564
+ summarize_kinds?: string[] | undefined;
565
+ reranker_model?: string | undefined;
566
+ }>>;
567
+ plugins: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
568
+ security: z.ZodOptional<z.ZodObject<{
569
+ secret_patterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
570
+ max_file_size_bytes: z.ZodOptional<z.ZodNumber>;
571
+ }, "strip", z.ZodTypeAny, {
572
+ secret_patterns?: string[] | undefined;
573
+ max_file_size_bytes?: number | undefined;
574
+ }, {
575
+ secret_patterns?: string[] | undefined;
576
+ max_file_size_bytes?: number | undefined;
577
+ }>>;
578
+ }, "strip", z.ZodTypeAny, {
579
+ root: string;
580
+ include: string[];
581
+ exclude: string[];
582
+ db: {
583
+ path: string;
584
+ };
585
+ plugins: string[];
586
+ frameworks?: {
587
+ laravel?: {
588
+ graceful_degradation: boolean;
589
+ artisan?: {
590
+ enabled: boolean;
591
+ timeout: number;
592
+ } | undefined;
593
+ } | undefined;
594
+ } | undefined;
595
+ ai?: {
596
+ enabled: boolean;
597
+ provider: "ollama" | "openai";
598
+ summarize_on_index: boolean;
599
+ summarize_batch_size: number;
600
+ summarize_kinds: string[];
601
+ base_url?: string | undefined;
602
+ api_key?: string | undefined;
603
+ inference_model?: string | undefined;
604
+ fast_model?: string | undefined;
605
+ embedding_model?: string | undefined;
606
+ embedding_dimensions?: number | undefined;
607
+ reranker_model?: string | undefined;
608
+ } | undefined;
609
+ security?: {
610
+ secret_patterns?: string[] | undefined;
611
+ max_file_size_bytes?: number | undefined;
612
+ } | undefined;
613
+ }, {
614
+ root?: string | undefined;
615
+ include?: string[] | undefined;
616
+ exclude?: string[] | undefined;
617
+ db?: {
618
+ path?: string | undefined;
619
+ } | undefined;
620
+ frameworks?: {
621
+ laravel?: {
622
+ artisan?: {
623
+ enabled?: boolean | undefined;
624
+ timeout?: number | undefined;
625
+ } | undefined;
626
+ graceful_degradation?: boolean | undefined;
627
+ } | undefined;
628
+ } | undefined;
629
+ ai?: {
630
+ enabled?: boolean | undefined;
631
+ provider?: "ollama" | "openai" | undefined;
632
+ base_url?: string | undefined;
633
+ api_key?: string | undefined;
634
+ inference_model?: string | undefined;
635
+ fast_model?: string | undefined;
636
+ embedding_model?: string | undefined;
637
+ embedding_dimensions?: number | undefined;
638
+ summarize_on_index?: boolean | undefined;
639
+ summarize_batch_size?: number | undefined;
640
+ summarize_kinds?: string[] | undefined;
641
+ reranker_model?: string | undefined;
642
+ } | undefined;
643
+ plugins?: string[] | undefined;
644
+ security?: {
645
+ secret_patterns?: string[] | undefined;
646
+ max_file_size_bytes?: number | undefined;
647
+ } | undefined;
648
+ }>;
649
+ type TraceMcpConfig = z.infer<typeof TraceMcpConfigSchema>;
650
+ declare function loadConfig(searchFrom?: string): Promise<TraceMcpResult<TraceMcpConfig>>;
651
+
652
+ declare function createServer(store: Store, registry: PluginRegistry, config: TraceMcpConfig, rootPath?: string): McpServer;
653
+
654
+ declare function initializeDatabase(dbPath: string): Database.Database;
655
+
656
+ export { type FrameworkPlugin, type LanguagePlugin, type PluginManifest, PluginRegistry, Store, type TraceMcpConfig, type TraceMcpError, type TraceMcpResult, createServer, initializeDatabase, loadConfig };