@milo4jo/contextkit 0.5.6 → 0.5.8
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/README.md +84 -2
- package/dist/errors/index.d.ts +15 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +32 -0
- package/dist/errors/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +555 -1
- package/dist/mcp/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -118,6 +118,34 @@ They're storage. ContextKit adds the **intelligence layer** — scoring, budgeti
|
|
|
118
118
|
|
|
119
119
|
---
|
|
120
120
|
|
|
121
|
+
## Performance
|
|
122
|
+
|
|
123
|
+
Benchmarks on a MacBook Pro M4 (ContextKit's own codebase: 40 files, 166 chunks):
|
|
124
|
+
|
|
125
|
+
| Operation | Time | Notes |
|
|
126
|
+
|-----------|------|-------|
|
|
127
|
+
| **Initial index** | ~14s | Includes embedding generation |
|
|
128
|
+
| **Incremental index** | <1s | Only changed files |
|
|
129
|
+
| **Query (cold)** | ~200ms | First query loads model |
|
|
130
|
+
| **Query (warm)** | ~50ms | Subsequent queries |
|
|
131
|
+
| **Query (cached)** | <5ms | Identical queries |
|
|
132
|
+
|
|
133
|
+
Scaling (tested on larger codebases):
|
|
134
|
+
|
|
135
|
+
| Codebase Size | Index Time | Query Time |
|
|
136
|
+
|---------------|------------|------------|
|
|
137
|
+
| 100 files | ~30s | ~60ms |
|
|
138
|
+
| 500 files | ~2min | ~80ms |
|
|
139
|
+
| 1000 files | ~4min | ~100ms |
|
|
140
|
+
|
|
141
|
+
**Key optimizations:**
|
|
142
|
+
- Incremental indexing (content hashing)
|
|
143
|
+
- Query caching with automatic invalidation
|
|
144
|
+
- Local embeddings (no API latency)
|
|
145
|
+
- SQLite for fast reads
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
121
149
|
## Commands
|
|
122
150
|
|
|
123
151
|
### `contextkit init`
|
|
@@ -352,6 +380,58 @@ settings:
|
|
|
352
380
|
|
|
353
381
|
---
|
|
354
382
|
|
|
383
|
+
## Troubleshooting
|
|
384
|
+
|
|
385
|
+
### Quick Diagnosis
|
|
386
|
+
|
|
387
|
+
```bash
|
|
388
|
+
contextkit doctor
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
This checks your setup and shows any issues:
|
|
392
|
+
|
|
393
|
+
```
|
|
394
|
+
🩺 ContextKit Doctor
|
|
395
|
+
|
|
396
|
+
Running diagnostics...
|
|
397
|
+
|
|
398
|
+
✓ Node.js version: v20.10.0
|
|
399
|
+
✓ Configuration: 2 source(s) configured
|
|
400
|
+
✓ Index database: 166 chunks, 40 files (12.5 MB)
|
|
401
|
+
✓ Embeddings: 166/166 chunks (100%)
|
|
402
|
+
✓ Query cache: 5 cached queries
|
|
403
|
+
✓ Disk space: OK
|
|
404
|
+
|
|
405
|
+
✓ All checks passed! ContextKit is ready to use.
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Common Issues
|
|
409
|
+
|
|
410
|
+
**"Not initialized"**
|
|
411
|
+
```bash
|
|
412
|
+
contextkit init
|
|
413
|
+
contextkit source add ./src
|
|
414
|
+
contextkit index
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
**"No sources configured"**
|
|
418
|
+
```bash
|
|
419
|
+
contextkit source add ./src
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
**"No embeddings generated"**
|
|
423
|
+
```bash
|
|
424
|
+
contextkit index --force # Re-index with embeddings
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
**Slow queries?**
|
|
428
|
+
```bash
|
|
429
|
+
contextkit cache clear # Clear query cache
|
|
430
|
+
contextkit index --force # Rebuild index
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
---
|
|
434
|
+
|
|
355
435
|
## Technical Details
|
|
356
436
|
|
|
357
437
|
### How Selection Works
|
|
@@ -398,10 +478,12 @@ contextkit select "How does authentication work?"
|
|
|
398
478
|
- [x] Multi-factor scoring algorithm
|
|
399
479
|
- [x] Multiple output formats (markdown, XML, JSON, plain)
|
|
400
480
|
- [x] **Import-aware scoring** — understands code dependencies
|
|
401
|
-
- [
|
|
402
|
-
- [ ]
|
|
481
|
+
- [x] **Doctor command** — diagnose setup issues
|
|
482
|
+
- [ ] ~~Function/class boundary awareness~~ (done via AST chunking)
|
|
483
|
+
- [x] **VS Code extension** — [in development](https://github.com/milo4jo/contextkit-vscode)
|
|
403
484
|
- [ ] Cursor integration
|
|
404
485
|
- [ ] Neovim plugin
|
|
486
|
+
- [ ] Cloud sync for teams
|
|
405
487
|
|
|
406
488
|
---
|
|
407
489
|
|
package/dist/errors/index.d.ts
CHANGED
|
@@ -27,4 +27,19 @@ export declare class AlreadyInitializedError extends ContextKitError {
|
|
|
27
27
|
export declare class InvalidUsageError extends ContextKitError {
|
|
28
28
|
constructor(message: string);
|
|
29
29
|
}
|
|
30
|
+
export declare class IndexEmptyError extends ContextKitError {
|
|
31
|
+
constructor();
|
|
32
|
+
}
|
|
33
|
+
export declare class NoSourcesError extends ContextKitError {
|
|
34
|
+
constructor();
|
|
35
|
+
}
|
|
36
|
+
export declare class EmbeddingError extends ContextKitError {
|
|
37
|
+
constructor(detail?: string);
|
|
38
|
+
}
|
|
39
|
+
export declare class QueryError extends ContextKitError {
|
|
40
|
+
constructor(message: string);
|
|
41
|
+
}
|
|
42
|
+
export declare class DatabaseError extends ContextKitError {
|
|
43
|
+
constructor(operation: string, detail?: string);
|
|
44
|
+
}
|
|
30
45
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,UAAQ;CAM/D;AAED,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,QAAQ,CAAC,UAAU,qBAAqB;;CAQzC;AAED,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,QAAQ,CAAC,UAAU,4BAA4B;gBAEnC,IAAI,EAAE,MAAM;CAMzB;AAED,qBAAa,iBAAkB,SAAQ,eAAe;gBACxC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAM9C;AAED,qBAAa,iBAAkB,SAAQ,eAAe;gBACxC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CAOhD;AAED,qBAAa,uBAAwB,SAAQ,eAAe;;CAI3D;AAED,qBAAa,iBAAkB,SAAQ,eAAe;gBACxC,OAAO,EAAE,MAAM;CAG5B"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,UAAQ;CAM/D;AAED,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,QAAQ,CAAC,UAAU,qBAAqB;;CAQzC;AAED,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,QAAQ,CAAC,UAAU,4BAA4B;gBAEnC,IAAI,EAAE,MAAM;CAMzB;AAED,qBAAa,iBAAkB,SAAQ,eAAe;gBACxC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAM9C;AAED,qBAAa,iBAAkB,SAAQ,eAAe;gBACxC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CAOhD;AAED,qBAAa,uBAAwB,SAAQ,eAAe;;CAI3D;AAED,qBAAa,iBAAkB,SAAQ,eAAe;gBACxC,OAAO,EAAE,MAAM;CAG5B;AAED,qBAAa,eAAgB,SAAQ,eAAe;;CAQnD;AAED,qBAAa,cAAe,SAAQ,eAAe;;CAQlD;AAED,qBAAa,cAAe,SAAQ,eAAe;gBACrC,MAAM,CAAC,EAAE,MAAM;CAM5B;AAED,qBAAa,UAAW,SAAQ,eAAe;gBACjC,OAAO,EAAE,MAAM;CAO5B;AAED,qBAAa,aAAc,SAAQ,eAAe;gBACpC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAM/C"}
|
package/dist/errors/index.js
CHANGED
|
@@ -48,4 +48,36 @@ export class InvalidUsageError extends ContextKitError {
|
|
|
48
48
|
super(message, 'INVALID_USAGE');
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
+
export class IndexEmptyError extends ContextKitError {
|
|
52
|
+
constructor() {
|
|
53
|
+
super('Index is empty. Run `contextkit index` after adding sources.', 'INDEX_EMPTY', true // recoverable
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export class NoSourcesError extends ContextKitError {
|
|
58
|
+
constructor() {
|
|
59
|
+
super('No sources configured. Add sources with `contextkit source add ./src`', 'NO_SOURCES', true);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export class EmbeddingError extends ContextKitError {
|
|
63
|
+
constructor(detail) {
|
|
64
|
+
const msg = detail
|
|
65
|
+
? `Embedding generation failed: ${detail}`
|
|
66
|
+
: 'Embedding generation failed. Try `contextkit index --force` to rebuild.';
|
|
67
|
+
super(msg, 'EMBEDDING_ERROR', true);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export class QueryError extends ContextKitError {
|
|
71
|
+
constructor(message) {
|
|
72
|
+
super(`Query failed: ${message}. Run \`contextkit doctor\` to diagnose.`, 'QUERY_ERROR', true);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export class DatabaseError extends ContextKitError {
|
|
76
|
+
constructor(operation, detail) {
|
|
77
|
+
const msg = detail
|
|
78
|
+
? `Database ${operation} failed: ${detail}`
|
|
79
|
+
: `Database ${operation} failed. Try removing .contextkit/index.db and re-indexing.`;
|
|
80
|
+
super(msg, 'DATABASE_ERROR');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
51
83
|
//# sourceMappingURL=index.js.map
|
package/dist/errors/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,IAAI,CAAS;IACb,WAAW,CAAU;IAE9B,YAAY,OAAe,EAAE,IAAY,EAAE,WAAW,GAAG,KAAK;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IAC7C,UAAU,GAAG,iBAAiB,CAAC;IAExC;QACE,KAAK,CACH,gFAAgF,EAChF,iBAAiB,CAClB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IAC7C,UAAU,GAAG,wBAAwB,CAAC;IAE/C,YAAY,IAAY;QACtB,KAAK,CACH,WAAW,IAAI,uEAAuE,EACtF,kBAAkB,CACnB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IACpD,YAAY,IAAY,EAAE,UAAmB;QAC3C,MAAM,GAAG,GAAG,UAAU;YACpB,CAAC,CAAC,SAAS,IAAI,8BAA8B,UAAU,IAAI;YAC3D,CAAC,CAAC,SAAS,IAAI,cAAc,CAAC;QAChC,KAAK,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IACpD,YAAY,IAAY,EAAE,YAAqB;QAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,kBAAkB,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,KAAK,CACH,WAAW,IAAI,oBAAoB,IAAI,4EAA4E,IAAI,KAAK,EAC5H,eAAe,CAChB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,eAAe;IAC1D;QACE,KAAK,CAAC,mDAAmD,EAAE,qBAAqB,CAAC,CAAC;IACpF,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAClC,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,IAAI,CAAS;IACb,WAAW,CAAU;IAE9B,YAAY,OAAe,EAAE,IAAY,EAAE,WAAW,GAAG,KAAK;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IAC7C,UAAU,GAAG,iBAAiB,CAAC;IAExC;QACE,KAAK,CACH,gFAAgF,EAChF,iBAAiB,CAClB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IAC7C,UAAU,GAAG,wBAAwB,CAAC;IAE/C,YAAY,IAAY;QACtB,KAAK,CACH,WAAW,IAAI,uEAAuE,EACtF,kBAAkB,CACnB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IACpD,YAAY,IAAY,EAAE,UAAmB;QAC3C,MAAM,GAAG,GAAG,UAAU;YACpB,CAAC,CAAC,SAAS,IAAI,8BAA8B,UAAU,IAAI;YAC3D,CAAC,CAAC,SAAS,IAAI,cAAc,CAAC;QAChC,KAAK,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IACpD,YAAY,IAAY,EAAE,YAAqB;QAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,kBAAkB,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,KAAK,CACH,WAAW,IAAI,oBAAoB,IAAI,4EAA4E,IAAI,KAAK,EAC5H,eAAe,CAChB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,eAAe;IAC1D;QACE,KAAK,CAAC,mDAAmD,EAAE,qBAAqB,CAAC,CAAC;IACpF,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,eAAe;IAClD;QACE,KAAK,CACH,8DAA8D,EAC9D,aAAa,EACb,IAAI,CAAC,cAAc;SACpB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,eAAe;IACjD;QACE,KAAK,CACH,uEAAuE,EACvE,YAAY,EACZ,IAAI,CACL,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,eAAe;IACjD,YAAY,MAAe;QACzB,MAAM,GAAG,GAAG,MAAM;YAChB,CAAC,CAAC,gCAAgC,MAAM,EAAE;YAC1C,CAAC,CAAC,yEAAyE,CAAC;QAC9E,KAAK,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,eAAe;IAC7C,YAAY,OAAe;QACzB,KAAK,CACH,iBAAiB,OAAO,0CAA0C,EAClE,aAAa,EACb,IAAI,CACL,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,eAAe;IAChD,YAAY,SAAiB,EAAE,MAAe;QAC5C,MAAM,GAAG,GAAG,MAAM;YAChB,CAAC,CAAC,YAAY,SAAS,YAAY,MAAM,EAAE;YAC3C,CAAC,CAAC,YAAY,SAAS,6DAA6D,CAAC;QACvF,KAAK,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAsjBnE;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CA8WxC;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -37,6 +37,437 @@ function getIndexStats(db) {
|
|
|
37
37
|
totalSources: sourceCount.count,
|
|
38
38
|
};
|
|
39
39
|
}
|
|
40
|
+
function extractSymbols(content, filePath) {
|
|
41
|
+
const symbols = [];
|
|
42
|
+
const lines = content.split('\n');
|
|
43
|
+
const ext = filePath.split('.').pop()?.toLowerCase();
|
|
44
|
+
for (let i = 0; i < lines.length; i++) {
|
|
45
|
+
const line = lines[i];
|
|
46
|
+
const trimmed = line.trim();
|
|
47
|
+
const lineNum = i + 1;
|
|
48
|
+
// TypeScript/JavaScript patterns
|
|
49
|
+
if (ext === 'ts' || ext === 'tsx' || ext === 'js' || ext === 'jsx') {
|
|
50
|
+
const funcMatch = trimmed.match(/^(export\s+)?(async\s+)?function\s+(\w+)/);
|
|
51
|
+
if (funcMatch) {
|
|
52
|
+
symbols.push({
|
|
53
|
+
filePath,
|
|
54
|
+
symbolName: funcMatch[3],
|
|
55
|
+
symbolType: 'function',
|
|
56
|
+
startLine: lineNum,
|
|
57
|
+
endLine: findBlockEnd(lines, i),
|
|
58
|
+
signature: extractSignatureLine(trimmed),
|
|
59
|
+
});
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const classMatch = trimmed.match(/^(export\s+)?(abstract\s+)?class\s+(\w+)/);
|
|
63
|
+
if (classMatch) {
|
|
64
|
+
symbols.push({
|
|
65
|
+
filePath,
|
|
66
|
+
symbolName: classMatch[3],
|
|
67
|
+
symbolType: 'class',
|
|
68
|
+
startLine: lineNum,
|
|
69
|
+
endLine: findBlockEnd(lines, i),
|
|
70
|
+
signature: extractSignatureLine(trimmed),
|
|
71
|
+
});
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const interfaceMatch = trimmed.match(/^(export\s+)?interface\s+(\w+)/);
|
|
75
|
+
if (interfaceMatch) {
|
|
76
|
+
symbols.push({
|
|
77
|
+
filePath,
|
|
78
|
+
symbolName: interfaceMatch[2],
|
|
79
|
+
symbolType: 'interface',
|
|
80
|
+
startLine: lineNum,
|
|
81
|
+
endLine: findBlockEnd(lines, i),
|
|
82
|
+
signature: extractSignatureLine(trimmed),
|
|
83
|
+
});
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const typeMatch = trimmed.match(/^(export\s+)?type\s+(\w+)/);
|
|
87
|
+
if (typeMatch) {
|
|
88
|
+
symbols.push({
|
|
89
|
+
filePath,
|
|
90
|
+
symbolName: typeMatch[2],
|
|
91
|
+
symbolType: 'type',
|
|
92
|
+
startLine: lineNum,
|
|
93
|
+
endLine: findTypeEnd(lines, i),
|
|
94
|
+
signature: trimmed,
|
|
95
|
+
});
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const constMatch = trimmed.match(/^(export\s+)?(const|let|var)\s+(\w+)/);
|
|
99
|
+
if (constMatch) {
|
|
100
|
+
const isFunction = trimmed.includes('=>') || trimmed.includes('function');
|
|
101
|
+
symbols.push({
|
|
102
|
+
filePath,
|
|
103
|
+
symbolName: constMatch[3],
|
|
104
|
+
symbolType: isFunction ? 'function' : 'constant',
|
|
105
|
+
startLine: lineNum,
|
|
106
|
+
endLine: findStatementEnd(lines, i),
|
|
107
|
+
signature: extractSignatureLine(trimmed),
|
|
108
|
+
});
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Python patterns
|
|
113
|
+
if (ext === 'py') {
|
|
114
|
+
const pyFuncMatch = trimmed.match(/^(async\s+)?def\s+(\w+)/);
|
|
115
|
+
if (pyFuncMatch) {
|
|
116
|
+
symbols.push({
|
|
117
|
+
filePath,
|
|
118
|
+
symbolName: pyFuncMatch[2],
|
|
119
|
+
symbolType: 'function',
|
|
120
|
+
startLine: lineNum,
|
|
121
|
+
endLine: findPythonBlockEnd(lines, i),
|
|
122
|
+
signature: trimmed.replace(/:$/, ''),
|
|
123
|
+
});
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const pyClassMatch = trimmed.match(/^class\s+(\w+)/);
|
|
127
|
+
if (pyClassMatch) {
|
|
128
|
+
symbols.push({
|
|
129
|
+
filePath,
|
|
130
|
+
symbolName: pyClassMatch[1],
|
|
131
|
+
symbolType: 'class',
|
|
132
|
+
startLine: lineNum,
|
|
133
|
+
endLine: findPythonBlockEnd(lines, i),
|
|
134
|
+
signature: trimmed.replace(/:$/, ''),
|
|
135
|
+
});
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Go patterns
|
|
140
|
+
if (ext === 'go') {
|
|
141
|
+
const goFuncMatch = trimmed.match(/^func\s+(\w+)/);
|
|
142
|
+
if (goFuncMatch) {
|
|
143
|
+
symbols.push({
|
|
144
|
+
filePath,
|
|
145
|
+
symbolName: goFuncMatch[1],
|
|
146
|
+
symbolType: 'function',
|
|
147
|
+
startLine: lineNum,
|
|
148
|
+
endLine: findBlockEnd(lines, i),
|
|
149
|
+
signature: trimmed.replace(/\s*\{$/, ''),
|
|
150
|
+
});
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
const goMethodMatch = trimmed.match(/^func\s+\([^)]+\)\s+(\w+)/);
|
|
154
|
+
if (goMethodMatch) {
|
|
155
|
+
symbols.push({
|
|
156
|
+
filePath,
|
|
157
|
+
symbolName: goMethodMatch[1],
|
|
158
|
+
symbolType: 'method',
|
|
159
|
+
startLine: lineNum,
|
|
160
|
+
endLine: findBlockEnd(lines, i),
|
|
161
|
+
signature: trimmed.replace(/\s*\{$/, ''),
|
|
162
|
+
});
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Rust patterns
|
|
167
|
+
if (ext === 'rs') {
|
|
168
|
+
const rustFuncMatch = trimmed.match(/^(pub\s+)?(async\s+)?fn\s+(\w+)/);
|
|
169
|
+
if (rustFuncMatch) {
|
|
170
|
+
symbols.push({
|
|
171
|
+
filePath,
|
|
172
|
+
symbolName: rustFuncMatch[3],
|
|
173
|
+
symbolType: 'function',
|
|
174
|
+
startLine: lineNum,
|
|
175
|
+
endLine: findBlockEnd(lines, i),
|
|
176
|
+
signature: trimmed.replace(/\s*\{$/, ''),
|
|
177
|
+
});
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return symbols;
|
|
183
|
+
}
|
|
184
|
+
function findBlockEnd(lines, startIdx) {
|
|
185
|
+
let braceCount = 0;
|
|
186
|
+
let started = false;
|
|
187
|
+
for (let i = startIdx; i < lines.length; i++) {
|
|
188
|
+
const line = lines[i];
|
|
189
|
+
for (const char of line) {
|
|
190
|
+
if (char === '{') {
|
|
191
|
+
braceCount++;
|
|
192
|
+
started = true;
|
|
193
|
+
}
|
|
194
|
+
else if (char === '}') {
|
|
195
|
+
braceCount--;
|
|
196
|
+
if (started && braceCount === 0) {
|
|
197
|
+
return i + 1;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return lines.length;
|
|
203
|
+
}
|
|
204
|
+
function findPythonBlockEnd(lines, startIdx) {
|
|
205
|
+
const startLine = lines[startIdx];
|
|
206
|
+
const startIndent = startLine.length - startLine.trimStart().length;
|
|
207
|
+
for (let i = startIdx + 1; i < lines.length; i++) {
|
|
208
|
+
const line = lines[i];
|
|
209
|
+
const trimmed = line.trim();
|
|
210
|
+
if (!trimmed)
|
|
211
|
+
continue;
|
|
212
|
+
const indent = line.length - line.trimStart().length;
|
|
213
|
+
if (indent <= startIndent) {
|
|
214
|
+
return i;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return lines.length;
|
|
218
|
+
}
|
|
219
|
+
function findTypeEnd(lines, startIdx) {
|
|
220
|
+
for (let i = startIdx; i < lines.length; i++) {
|
|
221
|
+
if (lines[i].includes(';')) {
|
|
222
|
+
return i + 1;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return startIdx + 1;
|
|
226
|
+
}
|
|
227
|
+
function findStatementEnd(lines, startIdx) {
|
|
228
|
+
const startLine = lines[startIdx];
|
|
229
|
+
if (startLine.trim().endsWith(';')) {
|
|
230
|
+
return startIdx + 1;
|
|
231
|
+
}
|
|
232
|
+
if (startLine.includes('=>') || startLine.includes('{')) {
|
|
233
|
+
return findBlockEnd(lines, startIdx);
|
|
234
|
+
}
|
|
235
|
+
for (let i = startIdx; i < Math.min(startIdx + 20, lines.length); i++) {
|
|
236
|
+
if (lines[i].trim().endsWith(';')) {
|
|
237
|
+
return i + 1;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return startIdx + 1;
|
|
241
|
+
}
|
|
242
|
+
function extractSignatureLine(line) {
|
|
243
|
+
const braceIdx = line.indexOf('{');
|
|
244
|
+
if (braceIdx > 0) {
|
|
245
|
+
return line.substring(0, braceIdx).trim();
|
|
246
|
+
}
|
|
247
|
+
return line.trim();
|
|
248
|
+
}
|
|
249
|
+
function searchSymbols(db, query, options) {
|
|
250
|
+
const { exact = false, limit = 20, sources } = options;
|
|
251
|
+
let sql = 'SELECT DISTINCT file_path, content FROM chunks';
|
|
252
|
+
const params = [];
|
|
253
|
+
if (sources && sources.length > 0) {
|
|
254
|
+
sql += ' WHERE source_id IN (' + sources.map(() => '?').join(',') + ')';
|
|
255
|
+
params.push(...sources);
|
|
256
|
+
}
|
|
257
|
+
const rows = db.prepare(sql).all(...params);
|
|
258
|
+
const allSymbols = [];
|
|
259
|
+
const queryLower = query.toLowerCase();
|
|
260
|
+
for (const row of rows) {
|
|
261
|
+
const symbols = extractSymbols(row.content, row.file_path);
|
|
262
|
+
for (const sym of symbols) {
|
|
263
|
+
const nameLower = sym.symbolName.toLowerCase();
|
|
264
|
+
if (exact) {
|
|
265
|
+
if (nameLower === queryLower) {
|
|
266
|
+
allSymbols.push(sym);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
const isExactMatch = nameLower === queryLower;
|
|
271
|
+
const containsQuery = nameLower.includes(queryLower);
|
|
272
|
+
const isSignificantName = sym.symbolName.length >= 3;
|
|
273
|
+
if (isExactMatch || (containsQuery && isSignificantName)) {
|
|
274
|
+
allSymbols.push(sym);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
allSymbols.sort((a, b) => {
|
|
280
|
+
const aExact = a.symbolName.toLowerCase() === queryLower;
|
|
281
|
+
const bExact = b.symbolName.toLowerCase() === queryLower;
|
|
282
|
+
if (aExact && !bExact)
|
|
283
|
+
return -1;
|
|
284
|
+
if (!aExact && bExact)
|
|
285
|
+
return 1;
|
|
286
|
+
return a.symbolName.length - b.symbolName.length;
|
|
287
|
+
});
|
|
288
|
+
return allSymbols.slice(0, limit);
|
|
289
|
+
}
|
|
290
|
+
function getTypeIcon(type) {
|
|
291
|
+
switch (type) {
|
|
292
|
+
case 'function': return '𝑓';
|
|
293
|
+
case 'class': return '◆';
|
|
294
|
+
case 'method': return '◇';
|
|
295
|
+
case 'interface': return '◈';
|
|
296
|
+
case 'type': return '⊤';
|
|
297
|
+
case 'constant': return '●';
|
|
298
|
+
case 'variable': return '○';
|
|
299
|
+
default: return '•';
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
function formatSymbolsForMcp(symbols) {
|
|
303
|
+
if (symbols.length === 0) {
|
|
304
|
+
return 'No symbols found.';
|
|
305
|
+
}
|
|
306
|
+
const lines = [];
|
|
307
|
+
const byFile = new Map();
|
|
308
|
+
for (const sym of symbols) {
|
|
309
|
+
const existing = byFile.get(sym.filePath) || [];
|
|
310
|
+
existing.push(sym);
|
|
311
|
+
byFile.set(sym.filePath, existing);
|
|
312
|
+
}
|
|
313
|
+
for (const [filePath, fileSymbols] of byFile) {
|
|
314
|
+
lines.push(`📄 ${filePath}`);
|
|
315
|
+
for (const sym of fileSymbols) {
|
|
316
|
+
const typeIcon = getTypeIcon(sym.symbolType);
|
|
317
|
+
lines.push(` ${typeIcon} ${sym.symbolName} (line ${sym.startLine})`);
|
|
318
|
+
lines.push(` ${sym.signature}`);
|
|
319
|
+
}
|
|
320
|
+
lines.push('');
|
|
321
|
+
}
|
|
322
|
+
lines.push(`Found ${symbols.length} symbol(s)`);
|
|
323
|
+
return lines.join('\n');
|
|
324
|
+
}
|
|
325
|
+
function extractFunctionDefs(content, filePath) {
|
|
326
|
+
const functions = new Map();
|
|
327
|
+
const lines = content.split('\n');
|
|
328
|
+
const ext = filePath.split('.').pop()?.toLowerCase();
|
|
329
|
+
for (let i = 0; i < lines.length; i++) {
|
|
330
|
+
const line = lines[i];
|
|
331
|
+
const trimmed = line.trim();
|
|
332
|
+
if (ext === 'ts' || ext === 'tsx' || ext === 'js' || ext === 'jsx') {
|
|
333
|
+
const funcMatch = trimmed.match(/^(export\s+)?(async\s+)?function\s+(\w+)/);
|
|
334
|
+
if (funcMatch) {
|
|
335
|
+
functions.set(funcMatch[3], { startLine: i + 1, endLine: findBlockEnd(lines, i) });
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
const arrowMatch = trimmed.match(/^(export\s+)?(const|let|var)\s+(\w+)\s*=\s*(async\s+)?\(/);
|
|
339
|
+
if (arrowMatch) {
|
|
340
|
+
functions.set(arrowMatch[3], { startLine: i + 1, endLine: findBlockEnd(lines, i) });
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
if (ext === 'py') {
|
|
345
|
+
const defMatch = trimmed.match(/^(async\s+)?def\s+(\w+)/);
|
|
346
|
+
if (defMatch) {
|
|
347
|
+
functions.set(defMatch[2], { startLine: i + 1, endLine: findPythonBlockEnd(lines, i) });
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
if (ext === 'go') {
|
|
352
|
+
const funcMatch = trimmed.match(/^func\s+(?:\([^)]+\)\s+)?(\w+)/);
|
|
353
|
+
if (funcMatch) {
|
|
354
|
+
functions.set(funcMatch[1], { startLine: i + 1, endLine: findBlockEnd(lines, i) });
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
if (ext === 'rs') {
|
|
359
|
+
const fnMatch = trimmed.match(/^(pub\s+)?(async\s+)?fn\s+(\w+)/);
|
|
360
|
+
if (fnMatch) {
|
|
361
|
+
functions.set(fnMatch[3], { startLine: i + 1, endLine: findBlockEnd(lines, i) });
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return functions;
|
|
367
|
+
}
|
|
368
|
+
function findFunctionCalls(content, startLine, endLine, knownFunctions) {
|
|
369
|
+
const calls = [];
|
|
370
|
+
const lines = content.split('\n');
|
|
371
|
+
const callPattern = /\b(\w+)\s*\(/g;
|
|
372
|
+
const keywords = new Set(['if', 'else', 'while', 'for', 'switch', 'catch', 'return', 'throw', 'new', 'typeof', 'import', 'export', 'const', 'let', 'var', 'function', 'class', 'interface', 'type', 'async', 'await', 'try', 'finally']);
|
|
373
|
+
for (let i = startLine - 1; i < Math.min(endLine, lines.length); i++) {
|
|
374
|
+
const line = lines[i];
|
|
375
|
+
const trimmed = line.trim();
|
|
376
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('#') || trimmed.startsWith('*')) {
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
let match;
|
|
380
|
+
while ((match = callPattern.exec(line)) !== null) {
|
|
381
|
+
const name = match[1];
|
|
382
|
+
if (!keywords.has(name) && (knownFunctions.has(name) || name[0] === name[0].toLowerCase())) {
|
|
383
|
+
calls.push({ name, line: i + 1 });
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return calls;
|
|
388
|
+
}
|
|
389
|
+
function buildCallGraph(db, targetName, sources) {
|
|
390
|
+
let sql = 'SELECT file_path, content FROM chunks';
|
|
391
|
+
const params = [];
|
|
392
|
+
if (sources && sources.length > 0) {
|
|
393
|
+
sql += ' WHERE source_id IN (' + sources.map(() => '?').join(',') + ')';
|
|
394
|
+
params.push(...sources);
|
|
395
|
+
}
|
|
396
|
+
const rows = db.prepare(sql).all(...params);
|
|
397
|
+
const functionsByFile = new Map();
|
|
398
|
+
const allFunctions = new Set();
|
|
399
|
+
for (const row of rows) {
|
|
400
|
+
const funcs = extractFunctionDefs(row.content, row.file_path);
|
|
401
|
+
if (funcs.size > 0) {
|
|
402
|
+
functionsByFile.set(row.file_path, funcs);
|
|
403
|
+
for (const name of funcs.keys()) {
|
|
404
|
+
allFunctions.add(name);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
const callers = [];
|
|
409
|
+
const callees = [];
|
|
410
|
+
for (const row of rows) {
|
|
411
|
+
const fileFuncs = functionsByFile.get(row.file_path);
|
|
412
|
+
if (!fileFuncs)
|
|
413
|
+
continue;
|
|
414
|
+
for (const [funcName, { startLine, endLine }] of fileFuncs) {
|
|
415
|
+
const calls = findFunctionCalls(row.content, startLine, endLine, allFunctions);
|
|
416
|
+
for (const call of calls) {
|
|
417
|
+
if (call.name === targetName && funcName !== targetName) {
|
|
418
|
+
callers.push({ file: row.file_path, function: funcName, line: call.line });
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
const targetFunc = fileFuncs.get(targetName);
|
|
423
|
+
if (targetFunc) {
|
|
424
|
+
const calls = findFunctionCalls(row.content, targetFunc.startLine, targetFunc.endLine, allFunctions);
|
|
425
|
+
for (const call of calls) {
|
|
426
|
+
if (call.name !== targetName) {
|
|
427
|
+
let definedIn = '(external)';
|
|
428
|
+
for (const [file, funcs] of functionsByFile) {
|
|
429
|
+
if (funcs.has(call.name)) {
|
|
430
|
+
definedIn = file;
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
callees.push({ file: definedIn, function: call.name });
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
const uniqueCallers = Array.from(new Map(callers.map(c => [`${c.file}:${c.function}`, c])).values());
|
|
440
|
+
const uniqueCallees = Array.from(new Map(callees.map(c => [`${c.file}:${c.function}`, c])).values());
|
|
441
|
+
return { target: targetName, callers: uniqueCallers, callees: uniqueCallees };
|
|
442
|
+
}
|
|
443
|
+
function formatCallGraphForMcp(result) {
|
|
444
|
+
const lines = [];
|
|
445
|
+
lines.push(`🎯 Call graph for: ${result.target}`);
|
|
446
|
+
lines.push('');
|
|
447
|
+
lines.push(`📥 Callers (${result.callers.length}):`);
|
|
448
|
+
if (result.callers.length === 0) {
|
|
449
|
+
lines.push(' (none found)');
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
for (const caller of result.callers) {
|
|
453
|
+
lines.push(` ← ${caller.function} (${caller.file}:${caller.line})`);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
lines.push('');
|
|
457
|
+
lines.push(`📤 Calls (${result.callees.length}):`);
|
|
458
|
+
if (result.callees.length === 0) {
|
|
459
|
+
lines.push(' (none found)');
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
for (const callee of result.callees) {
|
|
463
|
+
lines.push(` → ${callee.function} (${callee.file})`);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
return lines.join('\n');
|
|
467
|
+
}
|
|
468
|
+
// ============================================================================
|
|
469
|
+
// MCP Server
|
|
470
|
+
// ============================================================================
|
|
40
471
|
/**
|
|
41
472
|
* Create and configure the MCP server
|
|
42
473
|
*/
|
|
@@ -67,6 +498,11 @@ export function createMcpServer() {
|
|
|
67
498
|
type: "number",
|
|
68
499
|
description: "Maximum tokens to return (default: 8000)",
|
|
69
500
|
},
|
|
501
|
+
mode: {
|
|
502
|
+
type: "string",
|
|
503
|
+
enum: ["full", "map"],
|
|
504
|
+
description: "Selection mode: 'full' for complete code (default), 'map' for signatures only (uses fewer tokens)",
|
|
505
|
+
},
|
|
70
506
|
sources: {
|
|
71
507
|
type: "string",
|
|
72
508
|
description: "Comma-separated list of sources to filter (optional)",
|
|
@@ -75,6 +511,42 @@ export function createMcpServer() {
|
|
|
75
511
|
required: ["query"],
|
|
76
512
|
},
|
|
77
513
|
},
|
|
514
|
+
{
|
|
515
|
+
name: "contextkit_symbol",
|
|
516
|
+
description: "Search for code symbols (functions, classes, interfaces, types) by name. Faster than semantic search when you know the symbol name.",
|
|
517
|
+
inputSchema: {
|
|
518
|
+
type: "object",
|
|
519
|
+
properties: {
|
|
520
|
+
name: {
|
|
521
|
+
type: "string",
|
|
522
|
+
description: "Symbol name to search for (e.g., 'handleAuth', 'UserService')",
|
|
523
|
+
},
|
|
524
|
+
exact: {
|
|
525
|
+
type: "boolean",
|
|
526
|
+
description: "Require exact match (default: false, uses fuzzy matching)",
|
|
527
|
+
},
|
|
528
|
+
limit: {
|
|
529
|
+
type: "number",
|
|
530
|
+
description: "Maximum number of results (default: 20)",
|
|
531
|
+
},
|
|
532
|
+
},
|
|
533
|
+
required: ["name"],
|
|
534
|
+
},
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
name: "contextkit_graph",
|
|
538
|
+
description: "Show call graph for a function: what functions call it (callers) and what it calls (callees). Useful for understanding code flow and dependencies.",
|
|
539
|
+
inputSchema: {
|
|
540
|
+
type: "object",
|
|
541
|
+
properties: {
|
|
542
|
+
function: {
|
|
543
|
+
type: "string",
|
|
544
|
+
description: "Function name to analyze",
|
|
545
|
+
},
|
|
546
|
+
},
|
|
547
|
+
required: ["function"],
|
|
548
|
+
},
|
|
549
|
+
},
|
|
78
550
|
{
|
|
79
551
|
name: "contextkit_index",
|
|
80
552
|
description: "Index or re-index the codebase. Run this after making changes to ensure context is up to date.",
|
|
@@ -113,6 +585,7 @@ export function createMcpServer() {
|
|
|
113
585
|
}
|
|
114
586
|
const query = args?.query || "";
|
|
115
587
|
const budget = args?.budget || 8000;
|
|
588
|
+
const mode = args?.mode || 'full';
|
|
116
589
|
const sourcesStr = args?.sources;
|
|
117
590
|
const sources = sourcesStr
|
|
118
591
|
? sourcesStr.split(",").map((s) => s.trim())
|
|
@@ -129,6 +602,7 @@ export function createMcpServer() {
|
|
|
129
602
|
query,
|
|
130
603
|
budget,
|
|
131
604
|
sources,
|
|
605
|
+
mode,
|
|
132
606
|
};
|
|
133
607
|
const result = await selectContext(db, options);
|
|
134
608
|
if (result.isEmpty) {
|
|
@@ -151,7 +625,6 @@ export function createMcpServer() {
|
|
|
151
625
|
],
|
|
152
626
|
};
|
|
153
627
|
}
|
|
154
|
-
// Return formatted output
|
|
155
628
|
return {
|
|
156
629
|
content: [{ type: "text", text: result.output.text }],
|
|
157
630
|
};
|
|
@@ -160,6 +633,80 @@ export function createMcpServer() {
|
|
|
160
633
|
db.close();
|
|
161
634
|
}
|
|
162
635
|
}
|
|
636
|
+
case "contextkit_symbol": {
|
|
637
|
+
if (!isInitialized()) {
|
|
638
|
+
return {
|
|
639
|
+
content: [
|
|
640
|
+
{
|
|
641
|
+
type: "text",
|
|
642
|
+
text: "ContextKit not initialized. Run `contextkit init` first.",
|
|
643
|
+
},
|
|
644
|
+
],
|
|
645
|
+
isError: true,
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
const symbolName = args?.name || "";
|
|
649
|
+
const exact = args?.exact || false;
|
|
650
|
+
const limit = args?.limit || 20;
|
|
651
|
+
if (!symbolName) {
|
|
652
|
+
return {
|
|
653
|
+
content: [{ type: "text", text: "Error: name is required" }],
|
|
654
|
+
isError: true,
|
|
655
|
+
};
|
|
656
|
+
}
|
|
657
|
+
const db = openDatabase();
|
|
658
|
+
try {
|
|
659
|
+
const symbols = searchSymbols(db, symbolName, { exact, limit });
|
|
660
|
+
const output = formatSymbolsForMcp(symbols);
|
|
661
|
+
return {
|
|
662
|
+
content: [{ type: "text", text: output }],
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
finally {
|
|
666
|
+
db.close();
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
case "contextkit_graph": {
|
|
670
|
+
if (!isInitialized()) {
|
|
671
|
+
return {
|
|
672
|
+
content: [
|
|
673
|
+
{
|
|
674
|
+
type: "text",
|
|
675
|
+
text: "ContextKit not initialized. Run `contextkit init` first.",
|
|
676
|
+
},
|
|
677
|
+
],
|
|
678
|
+
isError: true,
|
|
679
|
+
};
|
|
680
|
+
}
|
|
681
|
+
const functionName = args?.function || "";
|
|
682
|
+
if (!functionName) {
|
|
683
|
+
return {
|
|
684
|
+
content: [{ type: "text", text: "Error: function name is required" }],
|
|
685
|
+
isError: true,
|
|
686
|
+
};
|
|
687
|
+
}
|
|
688
|
+
const db = openDatabase();
|
|
689
|
+
try {
|
|
690
|
+
const result = buildCallGraph(db, functionName);
|
|
691
|
+
if (result.callers.length === 0 && result.callees.length === 0) {
|
|
692
|
+
return {
|
|
693
|
+
content: [
|
|
694
|
+
{
|
|
695
|
+
type: "text",
|
|
696
|
+
text: `No call relationships found for "${functionName}". Make sure the function exists and the codebase is indexed.`,
|
|
697
|
+
},
|
|
698
|
+
],
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
const output = formatCallGraphForMcp(result);
|
|
702
|
+
return {
|
|
703
|
+
content: [{ type: "text", text: output }],
|
|
704
|
+
};
|
|
705
|
+
}
|
|
706
|
+
finally {
|
|
707
|
+
db.close();
|
|
708
|
+
}
|
|
709
|
+
}
|
|
163
710
|
case "contextkit_index": {
|
|
164
711
|
if (!isInitialized()) {
|
|
165
712
|
return {
|
|
@@ -210,9 +757,16 @@ export function createMcpServer() {
|
|
|
210
757
|
const statusText = [
|
|
211
758
|
"ContextKit Status",
|
|
212
759
|
"=================",
|
|
760
|
+
`Version: ${VERSION}`,
|
|
213
761
|
`Sources configured: ${config.sources.length}`,
|
|
214
762
|
`Chunks indexed: ${stats.totalChunks}`,
|
|
215
763
|
"",
|
|
764
|
+
"Available tools:",
|
|
765
|
+
" • contextkit_select - Semantic context search",
|
|
766
|
+
" • contextkit_symbol - Symbol name search",
|
|
767
|
+
" • contextkit_graph - Function call graph",
|
|
768
|
+
" • contextkit_index - Re-index codebase",
|
|
769
|
+
"",
|
|
216
770
|
"Sources:",
|
|
217
771
|
...config.sources.map((s) => ` - ${s.id}: ${s.path}`),
|
|
218
772
|
].join("\n");
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|