@mhalder/qdrant-mcp-server 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +87 -69
- package/CONTRIBUTING.md +81 -92
- package/README.md +99 -634
- package/biome.json +34 -0
- package/build/embeddings/sparse.d.ts +40 -0
- package/build/embeddings/sparse.d.ts.map +1 -0
- package/build/embeddings/sparse.js +105 -0
- package/build/embeddings/sparse.js.map +1 -0
- package/build/embeddings/sparse.test.d.ts +2 -0
- package/build/embeddings/sparse.test.d.ts.map +1 -0
- package/build/embeddings/sparse.test.js +69 -0
- package/build/embeddings/sparse.test.js.map +1 -0
- package/build/index.js +130 -30
- package/build/index.js.map +1 -1
- package/build/qdrant/client.d.ts +21 -2
- package/build/qdrant/client.d.ts.map +1 -1
- package/build/qdrant/client.js +131 -17
- package/build/qdrant/client.js.map +1 -1
- package/build/qdrant/client.test.js +429 -21
- package/build/qdrant/client.test.js.map +1 -1
- package/examples/README.md +78 -253
- package/examples/basic/README.md +19 -72
- package/examples/filters/README.md +55 -155
- package/examples/hybrid-search/README.md +199 -0
- package/examples/knowledge-base/README.md +36 -98
- package/examples/rate-limiting/README.md +81 -290
- package/package.json +1 -1
- package/src/embeddings/sparse.test.ts +87 -0
- package/src/embeddings/sparse.ts +127 -0
- package/src/index.ts +161 -57
- package/src/qdrant/client.test.ts +544 -56
- package/src/qdrant/client.ts +162 -22
- package/vitest.config.ts +3 -3
- package/docs/test_report.md +0 -259
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/qdrant/client.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/qdrant/client.ts"],"names":[],"mappings":"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"}
|
package/build/qdrant/client.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { QdrantClient } from "@qdrant/js-client-rest";
|
|
3
3
|
export class QdrantManager {
|
|
4
4
|
client;
|
|
5
|
-
constructor(url =
|
|
5
|
+
constructor(url = "http://localhost:6333") {
|
|
6
6
|
this.client = new QdrantClient({ url });
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
@@ -10,7 +10,7 @@ export class QdrantManager {
|
|
|
10
10
|
* Qdrant requires string IDs to be in UUID format.
|
|
11
11
|
*/
|
|
12
12
|
normalizeId(id) {
|
|
13
|
-
if (typeof id ===
|
|
13
|
+
if (typeof id === "number") {
|
|
14
14
|
return id;
|
|
15
15
|
}
|
|
16
16
|
// Check if already a valid UUID (8-4-4-4-12 format)
|
|
@@ -19,16 +19,33 @@ export class QdrantManager {
|
|
|
19
19
|
return id;
|
|
20
20
|
}
|
|
21
21
|
// Convert arbitrary string to deterministic UUID v5-like format
|
|
22
|
-
const hash = createHash(
|
|
22
|
+
const hash = createHash("sha256").update(id).digest("hex");
|
|
23
23
|
return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-${hash.slice(12, 16)}-${hash.slice(16, 20)}-${hash.slice(20, 32)}`;
|
|
24
24
|
}
|
|
25
|
-
async createCollection(name, vectorSize, distance =
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
async createCollection(name, vectorSize, distance = "Cosine", enableSparse = false) {
|
|
26
|
+
const config = {};
|
|
27
|
+
// When hybrid search is enabled, use named vectors
|
|
28
|
+
if (enableSparse) {
|
|
29
|
+
config.vectors = {
|
|
30
|
+
dense: {
|
|
31
|
+
size: vectorSize,
|
|
32
|
+
distance,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
config.sparse_vectors = {
|
|
36
|
+
text: {
|
|
37
|
+
modifier: "idf",
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// Standard unnamed vector configuration
|
|
43
|
+
config.vectors = {
|
|
28
44
|
size: vectorSize,
|
|
29
45
|
distance,
|
|
30
|
-
}
|
|
31
|
-
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
await this.client.createCollection(name, config);
|
|
32
49
|
}
|
|
33
50
|
async collectionExists(name) {
|
|
34
51
|
try {
|
|
@@ -48,16 +65,31 @@ export class QdrantManager {
|
|
|
48
65
|
const vectorConfig = info.config.params.vectors;
|
|
49
66
|
// Handle both named and unnamed vector configurations
|
|
50
67
|
let size = 0;
|
|
51
|
-
let distance =
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
68
|
+
let distance = "Cosine";
|
|
69
|
+
let hybridEnabled = false;
|
|
70
|
+
// Check if sparse vectors are configured
|
|
71
|
+
if (info.config.params.sparse_vectors) {
|
|
72
|
+
hybridEnabled = true;
|
|
73
|
+
}
|
|
74
|
+
if (typeof vectorConfig === "object" && vectorConfig !== null) {
|
|
75
|
+
// Check for unnamed vector config (has 'size' directly)
|
|
76
|
+
if ("size" in vectorConfig) {
|
|
77
|
+
size = typeof vectorConfig.size === "number" ? vectorConfig.size : 0;
|
|
78
|
+
distance = vectorConfig.distance;
|
|
79
|
+
}
|
|
80
|
+
else if ("dense" in vectorConfig) {
|
|
81
|
+
// Named vector config for hybrid search
|
|
82
|
+
const denseConfig = vectorConfig.dense;
|
|
83
|
+
size = typeof denseConfig.size === "number" ? denseConfig.size : 0;
|
|
84
|
+
distance = denseConfig.distance;
|
|
85
|
+
}
|
|
55
86
|
}
|
|
56
87
|
return {
|
|
57
88
|
name,
|
|
58
89
|
vectorSize: size,
|
|
59
90
|
pointsCount: info.points_count || 0,
|
|
60
91
|
distance,
|
|
92
|
+
hybridEnabled,
|
|
61
93
|
};
|
|
62
94
|
}
|
|
63
95
|
async deleteCollection(name) {
|
|
@@ -66,7 +98,7 @@ export class QdrantManager {
|
|
|
66
98
|
async addPoints(collectionName, points) {
|
|
67
99
|
try {
|
|
68
100
|
// Normalize all IDs to ensure string IDs are in UUID format
|
|
69
|
-
const normalizedPoints = points.map(point => ({
|
|
101
|
+
const normalizedPoints = points.map((point) => ({
|
|
70
102
|
...point,
|
|
71
103
|
id: this.normalizeId(point.id),
|
|
72
104
|
}));
|
|
@@ -101,8 +133,10 @@ export class QdrantManager {
|
|
|
101
133
|
};
|
|
102
134
|
}
|
|
103
135
|
}
|
|
136
|
+
// Check if collection uses named vectors (hybrid mode)
|
|
137
|
+
const collectionInfo = await this.getCollectionInfo(collectionName);
|
|
104
138
|
const results = await this.client.search(collectionName, {
|
|
105
|
-
vector,
|
|
139
|
+
vector: collectionInfo.hybridEnabled ? { name: "dense", vector } : vector,
|
|
106
140
|
limit,
|
|
107
141
|
filter: qdrantFilter,
|
|
108
142
|
});
|
|
@@ -132,11 +166,91 @@ export class QdrantManager {
|
|
|
132
166
|
}
|
|
133
167
|
async deletePoints(collectionName, ids) {
|
|
134
168
|
// Normalize IDs to ensure string IDs are in UUID format
|
|
135
|
-
const normalizedIds = ids.map(id => this.normalizeId(id));
|
|
169
|
+
const normalizedIds = ids.map((id) => this.normalizeId(id));
|
|
136
170
|
await this.client.delete(collectionName, {
|
|
137
171
|
wait: true,
|
|
138
172
|
points: normalizedIds,
|
|
139
173
|
});
|
|
140
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* Performs hybrid search combining semantic vector search with sparse vector (keyword) search
|
|
177
|
+
* using Reciprocal Rank Fusion (RRF) to combine results
|
|
178
|
+
*/
|
|
179
|
+
async hybridSearch(collectionName, denseVector, sparseVector, limit = 5, filter, _semanticWeight = 0.7) {
|
|
180
|
+
// Convert simple key-value filter to Qdrant filter format
|
|
181
|
+
let qdrantFilter;
|
|
182
|
+
if (filter && Object.keys(filter).length > 0) {
|
|
183
|
+
if (filter.must || filter.should || filter.must_not) {
|
|
184
|
+
qdrantFilter = filter;
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
qdrantFilter = {
|
|
188
|
+
must: Object.entries(filter).map(([key, value]) => ({
|
|
189
|
+
key,
|
|
190
|
+
match: { value },
|
|
191
|
+
})),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Calculate prefetch limits based on weights
|
|
196
|
+
// We fetch more results than needed to ensure good fusion results
|
|
197
|
+
const prefetchLimit = Math.max(20, limit * 4);
|
|
198
|
+
try {
|
|
199
|
+
const results = await this.client.query(collectionName, {
|
|
200
|
+
prefetch: [
|
|
201
|
+
{
|
|
202
|
+
query: denseVector,
|
|
203
|
+
using: "dense",
|
|
204
|
+
limit: prefetchLimit,
|
|
205
|
+
filter: qdrantFilter,
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
query: sparseVector,
|
|
209
|
+
using: "text",
|
|
210
|
+
limit: prefetchLimit,
|
|
211
|
+
filter: qdrantFilter,
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
query: {
|
|
215
|
+
fusion: "rrf",
|
|
216
|
+
},
|
|
217
|
+
limit: limit,
|
|
218
|
+
with_payload: true,
|
|
219
|
+
});
|
|
220
|
+
return results.points.map((result) => ({
|
|
221
|
+
id: result.id,
|
|
222
|
+
score: result.score,
|
|
223
|
+
payload: result.payload || undefined,
|
|
224
|
+
}));
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
const errorMessage = error?.data?.status?.error || error?.message || String(error);
|
|
228
|
+
throw new Error(`Hybrid search failed on collection "${collectionName}": ${errorMessage}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Adds points with both dense and sparse vectors for hybrid search
|
|
233
|
+
*/
|
|
234
|
+
async addPointsWithSparse(collectionName, points) {
|
|
235
|
+
try {
|
|
236
|
+
// Normalize all IDs to ensure string IDs are in UUID format
|
|
237
|
+
const normalizedPoints = points.map((point) => ({
|
|
238
|
+
id: this.normalizeId(point.id),
|
|
239
|
+
vector: {
|
|
240
|
+
dense: point.vector,
|
|
241
|
+
text: point.sparseVector,
|
|
242
|
+
},
|
|
243
|
+
payload: point.payload,
|
|
244
|
+
}));
|
|
245
|
+
await this.client.upsert(collectionName, {
|
|
246
|
+
wait: true,
|
|
247
|
+
points: normalizedPoints,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
const errorMessage = error?.data?.status?.error || error?.message || String(error);
|
|
252
|
+
throw new Error(`Failed to add points with sparse vectors to collection "${collectionName}": ${errorMessage}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
141
255
|
}
|
|
142
256
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/qdrant/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/qdrant/client.ts"],"names":[],"mappings":"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"}
|