@mhalder/qdrant-mcp-server 2.0.0 → 2.1.1

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 (47) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/CONTRIBUTING.md +14 -2
  3. package/README.md +9 -8
  4. package/build/index.js +34 -832
  5. package/build/index.js.map +1 -1
  6. package/build/prompts/register.d.ts +10 -0
  7. package/build/prompts/register.d.ts.map +1 -0
  8. package/build/prompts/register.js +50 -0
  9. package/build/prompts/register.js.map +1 -0
  10. package/build/resources/index.d.ts +10 -0
  11. package/build/resources/index.d.ts.map +1 -0
  12. package/build/resources/index.js +60 -0
  13. package/build/resources/index.js.map +1 -0
  14. package/build/tools/code.d.ts +10 -0
  15. package/build/tools/code.d.ts.map +1 -0
  16. package/build/tools/code.js +122 -0
  17. package/build/tools/code.js.map +1 -0
  18. package/build/tools/collection.d.ts +12 -0
  19. package/build/tools/collection.d.ts.map +1 -0
  20. package/build/tools/collection.js +59 -0
  21. package/build/tools/collection.js.map +1 -0
  22. package/build/tools/document.d.ts +12 -0
  23. package/build/tools/document.d.ts.map +1 -0
  24. package/build/tools/document.js +84 -0
  25. package/build/tools/document.js.map +1 -0
  26. package/build/tools/index.d.ts +18 -0
  27. package/build/tools/index.d.ts.map +1 -0
  28. package/build/tools/index.js +30 -0
  29. package/build/tools/index.js.map +1 -0
  30. package/build/tools/schemas.d.ts +75 -0
  31. package/build/tools/schemas.d.ts.map +1 -0
  32. package/build/tools/schemas.js +114 -0
  33. package/build/tools/schemas.js.map +1 -0
  34. package/build/tools/search.d.ts +12 -0
  35. package/build/tools/search.d.ts.map +1 -0
  36. package/build/tools/search.js +79 -0
  37. package/build/tools/search.js.map +1 -0
  38. package/package.json +1 -1
  39. package/src/index.ts +38 -984
  40. package/src/prompts/register.ts +71 -0
  41. package/src/resources/index.ts +79 -0
  42. package/src/tools/code.ts +184 -0
  43. package/src/tools/collection.ts +100 -0
  44. package/src/tools/document.ts +113 -0
  45. package/src/tools/index.ts +48 -0
  46. package/src/tools/schemas.ts +130 -0
  47. package/src/tools/search.ts +122 -0
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Tool registration orchestrator
3
+ */
4
+ import { registerCodeTools } from "./code.js";
5
+ import { registerCollectionTools } from "./collection.js";
6
+ import { registerDocumentTools } from "./document.js";
7
+ import { registerSearchTools } from "./search.js";
8
+ /**
9
+ * Register all MCP tools on the server
10
+ */
11
+ export function registerAllTools(server, deps) {
12
+ registerCollectionTools(server, {
13
+ qdrant: deps.qdrant,
14
+ embeddings: deps.embeddings,
15
+ });
16
+ registerDocumentTools(server, {
17
+ qdrant: deps.qdrant,
18
+ embeddings: deps.embeddings,
19
+ });
20
+ registerSearchTools(server, {
21
+ qdrant: deps.qdrant,
22
+ embeddings: deps.embeddings,
23
+ });
24
+ registerCodeTools(server, {
25
+ codeIndexer: deps.codeIndexer,
26
+ });
27
+ }
28
+ // Re-export schemas for external use
29
+ export * from "./schemas.js";
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQlD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAiB,EACjB,IAAsB;IAEtB,uBAAuB,CAAC,MAAM,EAAE;QAC9B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAC;IAEH,qBAAqB,CAAC,MAAM,EAAE;QAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAC;IAEH,mBAAmB,CAAC,MAAM,EAAE;QAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAC;IAEH,iBAAiB,CAAC,MAAM,EAAE;QACxB,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC;AACL,CAAC;AAED,qCAAqC;AACrC,cAAc,cAAc,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Consolidated Zod schemas for all MCP tools
3
+ *
4
+ * Note: Schemas are exported as plain objects (not wrapped in z.object()) because
5
+ * McpServer.registerTool() expects schemas in this format. The SDK internally
6
+ * converts these to JSON Schema for the MCP protocol. Each property is a Zod
7
+ * field definition that gets composed into the final schema by the SDK.
8
+ */
9
+ import { z } from "zod";
10
+ export declare const CreateCollectionSchema: {
11
+ name: z.ZodString;
12
+ distance: z.ZodOptional<z.ZodEnum<["Cosine", "Euclid", "Dot"]>>;
13
+ enableHybrid: z.ZodOptional<z.ZodBoolean>;
14
+ };
15
+ export declare const DeleteCollectionSchema: {
16
+ name: z.ZodString;
17
+ };
18
+ export declare const GetCollectionInfoSchema: {
19
+ name: z.ZodString;
20
+ };
21
+ export declare const AddDocumentsSchema: {
22
+ collection: z.ZodString;
23
+ documents: z.ZodArray<z.ZodObject<{
24
+ id: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
25
+ text: z.ZodString;
26
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
27
+ }, "strip", z.ZodTypeAny, {
28
+ id: string | number;
29
+ text: string;
30
+ metadata?: Record<string, any> | undefined;
31
+ }, {
32
+ id: string | number;
33
+ text: string;
34
+ metadata?: Record<string, any> | undefined;
35
+ }>, "many">;
36
+ };
37
+ export declare const DeleteDocumentsSchema: {
38
+ collection: z.ZodString;
39
+ ids: z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodNumber]>, "many">;
40
+ };
41
+ export declare const SemanticSearchSchema: {
42
+ collection: z.ZodString;
43
+ query: z.ZodString;
44
+ limit: z.ZodOptional<z.ZodNumber>;
45
+ filter: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
46
+ };
47
+ export declare const HybridSearchSchema: {
48
+ collection: z.ZodString;
49
+ query: z.ZodString;
50
+ limit: z.ZodOptional<z.ZodNumber>;
51
+ filter: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
52
+ };
53
+ export declare const IndexCodebaseSchema: {
54
+ path: z.ZodString;
55
+ forceReindex: z.ZodOptional<z.ZodBoolean>;
56
+ extensions: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
57
+ ignorePatterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
58
+ };
59
+ export declare const SearchCodeSchema: {
60
+ path: z.ZodString;
61
+ query: z.ZodString;
62
+ limit: z.ZodOptional<z.ZodNumber>;
63
+ fileTypes: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
64
+ pathPattern: z.ZodOptional<z.ZodString>;
65
+ };
66
+ export declare const ReindexChangesSchema: {
67
+ path: z.ZodString;
68
+ };
69
+ export declare const GetIndexStatusSchema: {
70
+ path: z.ZodString;
71
+ };
72
+ export declare const ClearIndexSchema: {
73
+ path: z.ZodString;
74
+ };
75
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,sBAAsB;;;;CAUlC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;CAElC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;CAEnC,CAAC;AAGF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;CAgB9B,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;CAKjC,CAAC;AAGF,eAAO,MAAM,oBAAoB;;;;;CAQhC,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;CAQ9B,CAAC;AAGF,eAAO,MAAM,mBAAmB;;;;;CAkB/B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;CAiB5B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;CAEhC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;CAEhC,CAAC;AAEF,eAAO,MAAM,gBAAgB;;CAE5B,CAAC"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Consolidated Zod schemas for all MCP tools
3
+ *
4
+ * Note: Schemas are exported as plain objects (not wrapped in z.object()) because
5
+ * McpServer.registerTool() expects schemas in this format. The SDK internally
6
+ * converts these to JSON Schema for the MCP protocol. Each property is a Zod
7
+ * field definition that gets composed into the final schema by the SDK.
8
+ */
9
+ import { z } from "zod";
10
+ // Collection management schemas
11
+ export const CreateCollectionSchema = {
12
+ name: z.string().describe("Name of the collection"),
13
+ distance: z
14
+ .enum(["Cosine", "Euclid", "Dot"])
15
+ .optional()
16
+ .describe("Distance metric (default: Cosine)"),
17
+ enableHybrid: z
18
+ .boolean()
19
+ .optional()
20
+ .describe("Enable hybrid search with sparse vectors (default: false)"),
21
+ };
22
+ export const DeleteCollectionSchema = {
23
+ name: z.string().describe("Name of the collection to delete"),
24
+ };
25
+ export const GetCollectionInfoSchema = {
26
+ name: z.string().describe("Name of the collection"),
27
+ };
28
+ // Document operation schemas
29
+ export const AddDocumentsSchema = {
30
+ collection: z.string().describe("Name of the collection"),
31
+ documents: z
32
+ .array(z.object({
33
+ id: z
34
+ .union([z.string(), z.number()])
35
+ .describe("Unique identifier for the document"),
36
+ text: z.string().describe("Text content to embed and store"),
37
+ metadata: z
38
+ .record(z.any())
39
+ .optional()
40
+ .describe("Optional metadata to store with the document"),
41
+ }))
42
+ .describe("Array of documents to add"),
43
+ };
44
+ export const DeleteDocumentsSchema = {
45
+ collection: z.string().describe("Name of the collection"),
46
+ ids: z
47
+ .array(z.union([z.string(), z.number()]))
48
+ .describe("Array of document IDs to delete"),
49
+ };
50
+ // Search schemas
51
+ export const SemanticSearchSchema = {
52
+ collection: z.string().describe("Name of the collection to search"),
53
+ query: z.string().describe("Search query text"),
54
+ limit: z
55
+ .number()
56
+ .optional()
57
+ .describe("Maximum number of results (default: 5)"),
58
+ filter: z.record(z.any()).optional().describe("Optional metadata filter"),
59
+ };
60
+ export const HybridSearchSchema = {
61
+ collection: z.string().describe("Name of the collection to search"),
62
+ query: z.string().describe("Search query text"),
63
+ limit: z
64
+ .number()
65
+ .optional()
66
+ .describe("Maximum number of results (default: 5)"),
67
+ filter: z.record(z.any()).optional().describe("Optional metadata filter"),
68
+ };
69
+ // Code indexing schemas
70
+ export const IndexCodebaseSchema = {
71
+ path: z
72
+ .string()
73
+ .describe("Absolute or relative path to codebase root directory"),
74
+ forceReindex: z
75
+ .boolean()
76
+ .optional()
77
+ .describe("Force full re-index even if already indexed (default: false)"),
78
+ extensions: z
79
+ .array(z.string())
80
+ .optional()
81
+ .describe("Custom file extensions to index (e.g., ['.proto', '.graphql'])"),
82
+ ignorePatterns: z
83
+ .array(z.string())
84
+ .optional()
85
+ .describe("Additional patterns to ignore (e.g., ['**/test/**', '**/*.test.ts'])"),
86
+ };
87
+ export const SearchCodeSchema = {
88
+ path: z.string().describe("Path to codebase (must be indexed first)"),
89
+ query: z
90
+ .string()
91
+ .describe("Natural language search query (e.g., 'authentication logic')"),
92
+ limit: z
93
+ .number()
94
+ .optional()
95
+ .describe("Maximum number of results (default: 5, max: 100)"),
96
+ fileTypes: z
97
+ .array(z.string())
98
+ .optional()
99
+ .describe("Filter by file extensions (e.g., ['.ts', '.py'])"),
100
+ pathPattern: z
101
+ .string()
102
+ .optional()
103
+ .describe("Filter by path glob pattern (e.g., 'src/services/**')"),
104
+ };
105
+ export const ReindexChangesSchema = {
106
+ path: z.string().describe("Path to codebase"),
107
+ };
108
+ export const GetIndexStatusSchema = {
109
+ path: z.string().describe("Path to codebase"),
110
+ };
111
+ export const ClearIndexSchema = {
112
+ path: z.string().describe("Path to codebase"),
113
+ };
114
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Search tools registration
3
+ */
4
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import type { EmbeddingProvider } from "../embeddings/base.js";
6
+ import type { QdrantManager } from "../qdrant/client.js";
7
+ export interface SearchToolDependencies {
8
+ qdrant: QdrantManager;
9
+ embeddings: EmbeddingProvider;
10
+ }
11
+ export declare function registerSearchTools(server: McpServer, deps: SearchToolDependencies): void;
12
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,iBAAiB,CAAC;CAC/B;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,sBAAsB,GAC3B,IAAI,CAuGN"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Search tools registration
3
+ */
4
+ import { BM25SparseVectorGenerator } from "../embeddings/sparse.js";
5
+ import * as schemas from "./schemas.js";
6
+ export function registerSearchTools(server, deps) {
7
+ const { qdrant, embeddings } = deps;
8
+ // semantic_search
9
+ server.registerTool("semantic_search", {
10
+ title: "Semantic Search",
11
+ description: "Search for documents using natural language queries. Returns the most semantically similar documents.",
12
+ inputSchema: schemas.SemanticSearchSchema,
13
+ }, async ({ collection, query, limit, filter }) => {
14
+ // Check if collection exists
15
+ const exists = await qdrant.collectionExists(collection);
16
+ if (!exists) {
17
+ return {
18
+ content: [
19
+ {
20
+ type: "text",
21
+ text: `Error: Collection "${collection}" does not exist.`,
22
+ },
23
+ ],
24
+ isError: true,
25
+ };
26
+ }
27
+ // Generate embedding for query
28
+ const { embedding } = await embeddings.embed(query);
29
+ // Search
30
+ const results = await qdrant.search(collection, embedding, limit || 5, filter);
31
+ return {
32
+ content: [{ type: "text", text: JSON.stringify(results, null, 2) }],
33
+ };
34
+ });
35
+ // hybrid_search
36
+ server.registerTool("hybrid_search", {
37
+ title: "Hybrid Search",
38
+ description: "Perform hybrid search combining semantic vector search with keyword search using BM25. This provides better results by combining the strengths of both approaches. The collection must be created with enableHybrid set to true.",
39
+ inputSchema: schemas.HybridSearchSchema,
40
+ }, async ({ collection, query, limit, filter }) => {
41
+ // Check if collection exists
42
+ const exists = await qdrant.collectionExists(collection);
43
+ if (!exists) {
44
+ return {
45
+ content: [
46
+ {
47
+ type: "text",
48
+ text: `Error: Collection "${collection}" does not exist.`,
49
+ },
50
+ ],
51
+ isError: true,
52
+ };
53
+ }
54
+ // Check if collection has hybrid search enabled
55
+ const collectionInfo = await qdrant.getCollectionInfo(collection);
56
+ if (!collectionInfo.hybridEnabled) {
57
+ return {
58
+ content: [
59
+ {
60
+ type: "text",
61
+ text: `Error: Collection "${collection}" does not have hybrid search enabled. Create a new collection with enableHybrid set to true.`,
62
+ },
63
+ ],
64
+ isError: true,
65
+ };
66
+ }
67
+ // Generate dense embedding for query
68
+ const { embedding } = await embeddings.embed(query);
69
+ // Generate sparse vector for query
70
+ const sparseGenerator = new BM25SparseVectorGenerator();
71
+ const sparseVector = sparseGenerator.generate(query);
72
+ // Perform hybrid search
73
+ const results = await qdrant.hybridSearch(collection, embedding, sparseVector, limit || 5, filter);
74
+ return {
75
+ content: [{ type: "text", text: JSON.stringify(results, null, 2) }],
76
+ };
77
+ });
78
+ }
79
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mhalder/qdrant-mcp-server",
3
- "version": "2.0.0",
3
+ "version": "2.1.1",
4
4
  "description": "MCP server for semantic search using local Qdrant and Ollama (default) with support for OpenAI, Cohere, and Voyage AI",
5
5
  "type": "module",
6
6
  "bin": {