@hayhandsome/code-index-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.
- package/LICENSE +21 -0
- package/README.md +98 -0
- package/dist/cache/CacheManager.d.ts +19 -0
- package/dist/cache/CacheManager.js +51 -0
- package/dist/cache/CacheManager.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +13 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/loader.d.ts +4 -0
- package/dist/config/loader.js +159 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +41 -0
- package/dist/config/types.js +13 -0
- package/dist/config/types.js.map +1 -0
- package/dist/embedders/factory.d.ts +3 -0
- package/dist/embedders/factory.js +16 -0
- package/dist/embedders/factory.js.map +1 -0
- package/dist/embedders/ollama.d.ts +7 -0
- package/dist/embedders/ollama.js +41 -0
- package/dist/embedders/ollama.js.map +1 -0
- package/dist/embedders/openai.d.ts +8 -0
- package/dist/embedders/openai.js +39 -0
- package/dist/embedders/openai.js.map +1 -0
- package/dist/embedders/openaiCompatible.d.ts +8 -0
- package/dist/embedders/openaiCompatible.js +45 -0
- package/dist/embedders/openaiCompatible.js.map +1 -0
- package/dist/embedders/types.d.ts +6 -0
- package/dist/embedders/types.js +2 -0
- package/dist/embedders/types.js.map +1 -0
- package/dist/ignore/IgnoreManager.d.ts +10 -0
- package/dist/ignore/IgnoreManager.js +46 -0
- package/dist/ignore/IgnoreManager.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/SyncService.d.ts +23 -0
- package/dist/indexer/SyncService.js +179 -0
- package/dist/indexer/SyncService.js.map +1 -0
- package/dist/mcp/tools.d.ts +7 -0
- package/dist/mcp/tools.js +115 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/parser/CodeParser.d.ts +8 -0
- package/dist/parser/CodeParser.js +71 -0
- package/dist/parser/CodeParser.js.map +1 -0
- package/dist/parser/types.d.ts +13 -0
- package/dist/parser/types.js +2 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/scanner/fileScanner.d.ts +2 -0
- package/dist/scanner/fileScanner.js +42 -0
- package/dist/scanner/fileScanner.js.map +1 -0
- package/dist/scanner/supportedExtensions.d.ts +3 -0
- package/dist/scanner/supportedExtensions.js +48 -0
- package/dist/scanner/supportedExtensions.js.map +1 -0
- package/dist/search/SearchService.d.ts +7 -0
- package/dist/search/SearchService.js +23 -0
- package/dist/search/SearchService.js.map +1 -0
- package/dist/vector-store/QdrantStore.d.ts +15 -0
- package/dist/vector-store/QdrantStore.js +120 -0
- package/dist/vector-store/QdrantStore.js.map +1 -0
- package/dist/vector-store/types.d.ts +21 -0
- package/dist/vector-store/types.js +2 -0
- package/dist/vector-store/types.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export const scannerExtensions = [
|
|
2
|
+
".tla",
|
|
3
|
+
".js",
|
|
4
|
+
".jsx",
|
|
5
|
+
".ts",
|
|
6
|
+
".vue",
|
|
7
|
+
".tsx",
|
|
8
|
+
".py",
|
|
9
|
+
".rs",
|
|
10
|
+
".go",
|
|
11
|
+
".c",
|
|
12
|
+
".h",
|
|
13
|
+
".cpp",
|
|
14
|
+
".hpp",
|
|
15
|
+
".cs",
|
|
16
|
+
".rb",
|
|
17
|
+
".java",
|
|
18
|
+
".php",
|
|
19
|
+
".swift",
|
|
20
|
+
".sol",
|
|
21
|
+
".kt",
|
|
22
|
+
".kts",
|
|
23
|
+
".ex",
|
|
24
|
+
".exs",
|
|
25
|
+
".el",
|
|
26
|
+
".html",
|
|
27
|
+
".htm",
|
|
28
|
+
".md",
|
|
29
|
+
".markdown",
|
|
30
|
+
".json",
|
|
31
|
+
".css",
|
|
32
|
+
".rdl",
|
|
33
|
+
".ml",
|
|
34
|
+
".mli",
|
|
35
|
+
".lua",
|
|
36
|
+
".scala",
|
|
37
|
+
".toml",
|
|
38
|
+
".zig",
|
|
39
|
+
".elm",
|
|
40
|
+
".ejs",
|
|
41
|
+
".erb",
|
|
42
|
+
".vb",
|
|
43
|
+
];
|
|
44
|
+
export const fallbackExtensions = [".vb", ".scala", ".swift"];
|
|
45
|
+
export function shouldUseFallbackChunking(extension) {
|
|
46
|
+
return fallbackExtensions.includes(extension.toLowerCase());
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=supportedExtensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supportedExtensions.js","sourceRoot":"","sources":["../../src/scanner/supportedExtensions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAChC,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,OAAO;IACP,MAAM;IACN,KAAK;IACL,WAAW;IACX,OAAO;IACP,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;CACL,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;AAE7D,MAAM,UAAU,yBAAyB,CAAC,SAAiB;IAC1D,OAAO,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;AAC5D,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SyncService } from "../indexer/SyncService.js";
|
|
2
|
+
import { VectorSearchResult } from "../vector-store/types.js";
|
|
3
|
+
export declare class SearchService {
|
|
4
|
+
private readonly syncService;
|
|
5
|
+
constructor(syncService: SyncService);
|
|
6
|
+
search(workspacePath: string, query: string, directoryPrefix?: string): Promise<VectorSearchResult[]>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { loadConfig } from "../config/loader.js";
|
|
2
|
+
import { createEmbedderFromConfig } from "../embedders/factory.js";
|
|
3
|
+
import { QdrantStore } from "../vector-store/QdrantStore.js";
|
|
4
|
+
export class SearchService {
|
|
5
|
+
syncService;
|
|
6
|
+
constructor(syncService) {
|
|
7
|
+
this.syncService = syncService;
|
|
8
|
+
}
|
|
9
|
+
async search(workspacePath, query, directoryPrefix) {
|
|
10
|
+
await this.syncService.syncIncremental(workspacePath);
|
|
11
|
+
const { config, secrets } = await loadConfig(workspacePath, { validate: true });
|
|
12
|
+
const embedder = createEmbedderFromConfig(config, secrets);
|
|
13
|
+
const embeddings = await embedder.createEmbeddings([query]);
|
|
14
|
+
const vector = embeddings.embeddings[0];
|
|
15
|
+
if (!vector) {
|
|
16
|
+
throw new Error("Failed to generate query embedding");
|
|
17
|
+
}
|
|
18
|
+
const store = new QdrantStore(workspacePath, config.qdrantUrl, vector.length, secrets.qdrantApiKey);
|
|
19
|
+
await store.initialize();
|
|
20
|
+
return store.search(vector, config.searchMinScore, config.searchMaxResults, directoryPrefix);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=SearchService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchService.js","sourceRoot":"","sources":["../../src/search/SearchService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAElE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAG5D,MAAM,OAAO,aAAa;IACI;IAA7B,YAA6B,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAAG,CAAC;IAEzD,KAAK,CAAC,MAAM,CACX,aAAqB,EACrB,KAAa,EACb,eAAwB;QAExB,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,aAAa,CAAC,CAAA;QAErD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/E,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC1D,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;QAC3D,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;QACtD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;QACnG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;QACxB,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAA;IAC7F,CAAC;CACD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { VectorPoint, VectorSearchResult } from "./types.js";
|
|
2
|
+
export declare class QdrantStore {
|
|
3
|
+
private readonly client;
|
|
4
|
+
private readonly collectionName;
|
|
5
|
+
private readonly vectorSize;
|
|
6
|
+
constructor(workspacePath: string, qdrantUrl: string, vectorSize: number, apiKey?: string);
|
|
7
|
+
initialize(): Promise<boolean>;
|
|
8
|
+
upsert(points: VectorPoint[]): Promise<void>;
|
|
9
|
+
search(queryVector: number[], minScore: number, maxResults: number, directoryPrefix?: string): Promise<VectorSearchResult[]>;
|
|
10
|
+
deleteByPaths(paths: string[]): Promise<void>;
|
|
11
|
+
clear(): Promise<void>;
|
|
12
|
+
private createCollection;
|
|
13
|
+
private getCollectionInfo;
|
|
14
|
+
private extractVectorSize;
|
|
15
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { QdrantClient } from "@qdrant/js-client-rest";
|
|
2
|
+
import { createHash } from "crypto";
|
|
3
|
+
export class QdrantStore {
|
|
4
|
+
client;
|
|
5
|
+
collectionName;
|
|
6
|
+
vectorSize;
|
|
7
|
+
constructor(workspacePath, qdrantUrl, vectorSize, apiKey) {
|
|
8
|
+
this.client = new QdrantClient({
|
|
9
|
+
url: qdrantUrl,
|
|
10
|
+
apiKey,
|
|
11
|
+
headers: {
|
|
12
|
+
"User-Agent": "code-index-mcp",
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
this.vectorSize = vectorSize;
|
|
16
|
+
const hash = createHash("sha256").update(workspacePath).digest("hex");
|
|
17
|
+
this.collectionName = `ws-${hash.substring(0, 16)}`;
|
|
18
|
+
}
|
|
19
|
+
async initialize() {
|
|
20
|
+
const collectionInfo = await this.getCollectionInfo();
|
|
21
|
+
if (!collectionInfo) {
|
|
22
|
+
await this.createCollection();
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
const existingVectorSize = this.extractVectorSize(collectionInfo);
|
|
26
|
+
if (existingVectorSize !== this.vectorSize) {
|
|
27
|
+
await this.client.deleteCollection(this.collectionName);
|
|
28
|
+
await this.createCollection();
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
async upsert(points) {
|
|
34
|
+
if (points.length === 0) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
await this.client.upsert(this.collectionName, {
|
|
38
|
+
points,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async search(queryVector, minScore, maxResults, directoryPrefix) {
|
|
42
|
+
const result = await this.client.search(this.collectionName, {
|
|
43
|
+
vector: queryVector,
|
|
44
|
+
limit: maxResults,
|
|
45
|
+
score_threshold: minScore,
|
|
46
|
+
with_payload: true,
|
|
47
|
+
});
|
|
48
|
+
const mapped = (result ?? []).map((item) => {
|
|
49
|
+
const payload = (item.payload ?? {});
|
|
50
|
+
return {
|
|
51
|
+
filePath: payload.filePath,
|
|
52
|
+
startLine: payload.startLine,
|
|
53
|
+
endLine: payload.endLine,
|
|
54
|
+
snippet: payload.content,
|
|
55
|
+
score: item.score ?? 0,
|
|
56
|
+
payload,
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
if (!directoryPrefix) {
|
|
60
|
+
return mapped;
|
|
61
|
+
}
|
|
62
|
+
return mapped.filter((entry) => entry.filePath.startsWith(directoryPrefix));
|
|
63
|
+
}
|
|
64
|
+
async deleteByPaths(paths) {
|
|
65
|
+
if (paths.length === 0) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
await this.client.delete(this.collectionName, {
|
|
69
|
+
filter: {
|
|
70
|
+
must: [
|
|
71
|
+
{
|
|
72
|
+
key: "filePath",
|
|
73
|
+
match: {
|
|
74
|
+
any: paths,
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async clear() {
|
|
82
|
+
await this.client.deleteCollection(this.collectionName);
|
|
83
|
+
}
|
|
84
|
+
async createCollection() {
|
|
85
|
+
await this.client.createCollection(this.collectionName, {
|
|
86
|
+
vectors: {
|
|
87
|
+
size: this.vectorSize,
|
|
88
|
+
distance: "Cosine",
|
|
89
|
+
on_disk: true,
|
|
90
|
+
},
|
|
91
|
+
hnsw_config: {
|
|
92
|
+
m: 64,
|
|
93
|
+
ef_construct: 512,
|
|
94
|
+
on_disk: true,
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
async getCollectionInfo() {
|
|
99
|
+
try {
|
|
100
|
+
return await this.client.getCollection(this.collectionName);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
extractVectorSize(collectionInfo) {
|
|
107
|
+
const vectorsConfig = collectionInfo.config?.params?.vectors;
|
|
108
|
+
if (typeof vectorsConfig === "number") {
|
|
109
|
+
return vectorsConfig;
|
|
110
|
+
}
|
|
111
|
+
if (vectorsConfig &&
|
|
112
|
+
typeof vectorsConfig === "object" &&
|
|
113
|
+
"size" in vectorsConfig &&
|
|
114
|
+
typeof vectorsConfig.size === "number") {
|
|
115
|
+
return vectorsConfig.size;
|
|
116
|
+
}
|
|
117
|
+
return 0;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=QdrantStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QdrantStore.js","sourceRoot":"","sources":["../../src/vector-store/QdrantStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface VectorPayload extends Record<string, unknown> {
|
|
2
|
+
filePath: string;
|
|
3
|
+
startLine: number;
|
|
4
|
+
endLine: number;
|
|
5
|
+
content: string;
|
|
6
|
+
fileHash: string;
|
|
7
|
+
segmentHash: string;
|
|
8
|
+
}
|
|
9
|
+
export interface VectorPoint {
|
|
10
|
+
id: string;
|
|
11
|
+
vector: number[];
|
|
12
|
+
payload: VectorPayload;
|
|
13
|
+
}
|
|
14
|
+
export interface VectorSearchResult {
|
|
15
|
+
filePath: string;
|
|
16
|
+
startLine: number;
|
|
17
|
+
endLine: number;
|
|
18
|
+
snippet: string;
|
|
19
|
+
score: number;
|
|
20
|
+
payload: VectorPayload;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/vector-store/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hayhandsome/code-index-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for code indexing and semantic search",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"code-index-mcp": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"types": "dist/index.d.ts",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc -p tsconfig.json",
|
|
16
|
+
"prepublishOnly": "npm run build",
|
|
17
|
+
"start": "node dist/cli.js",
|
|
18
|
+
"test": "npm run build && node --test",
|
|
19
|
+
"smoke": "npm run build && node scripts/smoke-test.js"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=18"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
26
|
+
"@qdrant/js-client-rest": "^1.9.0",
|
|
27
|
+
"ignore": "^5.3.2"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/node": "^20.11.30",
|
|
31
|
+
"typescript": "^5.6.3"
|
|
32
|
+
}
|
|
33
|
+
}
|