@mhalder/qdrant-mcp-server 3.3.3 → 3.3.4
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/.github/workflows/ci.yml +0 -2
- package/.github/workflows/claude-code-review.yml +1 -1
- package/CHANGELOG.md +6 -0
- package/README.md +1 -1
- package/biome.json +3 -2
- package/build/code/chunker/tree-sitter-chunker.d.ts.map +1 -1
- package/build/code/chunker/tree-sitter-chunker.js +2 -12
- package/build/code/chunker/tree-sitter-chunker.js.map +1 -1
- package/build/code/indexer.d.ts.map +1 -1
- package/build/code/indexer.js +12 -18
- package/build/code/indexer.js.map +1 -1
- package/build/code/scanner.js +1 -1
- package/build/code/scanner.js.map +1 -1
- package/build/embeddings/cohere.d.ts +1 -1
- package/build/embeddings/cohere.d.ts.map +1 -1
- package/build/embeddings/cohere.js +2 -2
- package/build/embeddings/cohere.js.map +1 -1
- package/build/embeddings/cohere.test.js +1 -5
- package/build/embeddings/cohere.test.js.map +1 -1
- package/build/embeddings/factory.d.ts +1 -1
- package/build/embeddings/factory.d.ts.map +1 -1
- package/build/embeddings/factory.js +7 -9
- package/build/embeddings/factory.js.map +1 -1
- package/build/embeddings/factory.test.js +3 -3
- package/build/embeddings/factory.test.js.map +1 -1
- package/build/embeddings/ollama.d.ts +1 -1
- package/build/embeddings/ollama.d.ts.map +1 -1
- package/build/embeddings/ollama.js +6 -8
- package/build/embeddings/ollama.js.map +1 -1
- package/build/embeddings/ollama.test.js +2 -6
- package/build/embeddings/ollama.test.js.map +1 -1
- package/build/embeddings/openai.d.ts +1 -1
- package/build/embeddings/openai.d.ts.map +1 -1
- package/build/embeddings/openai.js +4 -7
- package/build/embeddings/openai.js.map +1 -1
- package/build/embeddings/openai.test.js +3 -12
- package/build/embeddings/openai.test.js.map +1 -1
- package/build/embeddings/sparse.test.js +12 -2
- package/build/embeddings/sparse.test.js.map +1 -1
- package/build/embeddings/voyage.d.ts +1 -1
- package/build/embeddings/voyage.d.ts.map +1 -1
- package/build/embeddings/voyage.js +2 -3
- package/build/embeddings/voyage.js.map +1 -1
- package/build/embeddings/voyage.test.js +2 -6
- package/build/embeddings/voyage.test.js.map +1 -1
- package/build/git/chunker.d.ts.map +1 -1
- package/build/git/chunker.js +2 -2
- package/build/git/chunker.js.map +1 -1
- package/build/git/chunker.test.js +1 -1
- package/build/git/chunker.test.js.map +1 -1
- package/build/git/extractor.d.ts.map +1 -1
- package/build/git/extractor.integration.test.js +9 -5
- package/build/git/extractor.integration.test.js.map +1 -1
- package/build/git/extractor.js +1 -1
- package/build/git/extractor.js.map +1 -1
- package/build/git/extractor.test.js +2 -2
- package/build/git/extractor.test.js.map +1 -1
- package/build/git/index.d.ts +4 -4
- package/build/git/index.d.ts.map +1 -1
- package/build/git/index.js +3 -3
- package/build/git/index.js.map +1 -1
- package/build/git/indexer.d.ts.map +1 -1
- package/build/git/indexer.js +9 -21
- package/build/git/indexer.js.map +1 -1
- package/build/git/indexer.test.js +4 -8
- package/build/git/indexer.test.js.map +1 -1
- package/build/git/sync/synchronizer.d.ts.map +1 -1
- package/build/git/sync/synchronizer.js.map +1 -1
- package/build/git/sync/synchronizer.test.js +4 -2
- package/build/git/sync/synchronizer.test.js.map +1 -1
- package/build/index.js +5 -9
- package/build/index.js.map +1 -1
- package/build/index.test.js +3 -3
- package/build/index.test.js.map +1 -1
- package/build/logger.d.ts.map +1 -1
- package/build/logger.js +1 -9
- package/build/logger.js.map +1 -1
- package/build/prompts/register.d.ts.map +1 -1
- package/build/prompts/register.js.map +1 -1
- package/build/qdrant/client.d.ts.map +1 -1
- package/build/qdrant/client.js.map +1 -1
- package/build/qdrant/client.test.js +10 -34
- package/build/qdrant/client.test.js.map +1 -1
- package/build/resources/index.d.ts +1 -1
- package/build/resources/index.d.ts.map +1 -1
- package/build/resources/index.js +1 -1
- package/build/resources/index.js.map +1 -1
- package/build/tools/code.d.ts.map +1 -1
- package/build/tools/code.js +3 -9
- package/build/tools/code.js.map +1 -1
- package/build/tools/collection.d.ts.map +1 -1
- package/build/tools/collection.js +1 -3
- package/build/tools/collection.js.map +1 -1
- package/build/tools/document.d.ts.map +1 -1
- package/build/tools/document.js +1 -1
- package/build/tools/document.js.map +1 -1
- package/build/tools/federated.d.ts.map +1 -1
- package/build/tools/federated.js +15 -6
- package/build/tools/federated.js.map +1 -1
- package/build/tools/federated.test.js +18 -22
- package/build/tools/federated.test.js.map +1 -1
- package/build/tools/git-history.d.ts.map +1 -1
- package/build/tools/git-history.js +3 -7
- package/build/tools/git-history.js.map +1 -1
- package/build/tools/index.d.ts.map +1 -1
- package/build/tools/index.js.map +1 -1
- package/build/tools/logging.d.ts.map +1 -1
- package/build/tools/logging.js +1 -3
- package/build/tools/logging.js.map +1 -1
- package/build/tools/logging.test.js +1 -1
- package/build/tools/logging.test.js.map +1 -1
- package/build/tools/schemas.d.ts.map +1 -1
- package/build/tools/schemas.js +17 -64
- package/build/tools/schemas.js.map +1 -1
- package/build/tools/search.d.ts.map +1 -1
- package/build/tools/search.js +1 -1
- package/build/tools/search.js.map +1 -1
- package/commitlint.config.js +12 -23
- package/package.json +1 -1
- package/scripts/verify-providers.js +12 -32
- package/src/code/chunker/tree-sitter-chunker.ts +9 -35
- package/src/code/indexer.ts +45 -107
- package/src/code/scanner.ts +1 -1
- package/src/embeddings/cohere.test.ts +17 -45
- package/src/embeddings/cohere.ts +10 -17
- package/src/embeddings/factory.test.ts +18 -18
- package/src/embeddings/factory.ts +18 -25
- package/src/embeddings/ollama.test.ts +38 -67
- package/src/embeddings/ollama.ts +15 -27
- package/src/embeddings/openai.test.ts +17 -53
- package/src/embeddings/openai.ts +11 -22
- package/src/embeddings/sparse.test.ts +12 -2
- package/src/embeddings/voyage.test.ts +39 -80
- package/src/embeddings/voyage.ts +9 -13
- package/src/git/chunker.test.ts +1 -1
- package/src/git/chunker.ts +6 -22
- package/src/git/extractor.integration.test.ts +12 -16
- package/src/git/extractor.test.ts +21 -35
- package/src/git/extractor.ts +14 -36
- package/src/git/index.ts +9 -10
- package/src/git/indexer.test.ts +29 -57
- package/src/git/indexer.ts +38 -86
- package/src/git/sync/synchronizer.test.ts +6 -9
- package/src/git/sync/synchronizer.ts +2 -5
- package/src/index.test.ts +7 -9
- package/src/index.ts +34 -80
- package/src/logger.ts +3 -14
- package/src/prompts/register.ts +3 -10
- package/src/qdrant/client.test.ts +63 -169
- package/src/qdrant/client.ts +19 -45
- package/src/resources/index.ts +4 -10
- package/src/tools/code.ts +43 -66
- package/src/tools/collection.ts +19 -38
- package/src/tools/document.ts +10 -19
- package/src/tools/federated.test.ts +34 -57
- package/src/tools/federated.ts +88 -108
- package/src/tools/git-history.ts +32 -60
- package/src/tools/index.ts +1 -4
- package/src/tools/logging.test.ts +10 -10
- package/src/tools/logging.ts +8 -18
- package/src/tools/schemas.ts +23 -78
- package/src/tools/search.ts +77 -94
- package/tests/code/chunker/tree-sitter-chunker.test.ts +6 -19
- package/tests/code/indexer.test.ts +100 -192
- package/tests/code/integration.test.ts +61 -117
- package/tests/code/scanner.test.ts +12 -39
- package/tests/code/sync/snapshot.test.ts +4 -14
- package/tests/code/sync/synchronizer.test.ts +10 -40
package/src/index.ts
CHANGED
|
@@ -8,7 +8,6 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
8
8
|
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
9
9
|
import Bottleneck from "bottleneck";
|
|
10
10
|
import express from "express";
|
|
11
|
-
import logger from "./logger.js";
|
|
12
11
|
import {
|
|
13
12
|
DEFAULT_BATCH_SIZE,
|
|
14
13
|
DEFAULT_CHUNK_OVERLAP,
|
|
@@ -19,9 +18,10 @@ import {
|
|
|
19
18
|
} from "./code/config.js";
|
|
20
19
|
import { CodeIndexer } from "./code/indexer.js";
|
|
21
20
|
import type { CodeConfig } from "./code/types.js";
|
|
21
|
+
import { EmbeddingProviderFactory } from "./embeddings/factory.js";
|
|
22
22
|
import { DEFAULT_GIT_CONFIG, GitHistoryIndexer } from "./git/index.js";
|
|
23
23
|
import type { GitConfig } from "./git/types.js";
|
|
24
|
-
import
|
|
24
|
+
import logger from "./logger.js";
|
|
25
25
|
import { loadPromptsConfig, type PromptsConfig } from "./prompts/index.js";
|
|
26
26
|
import { registerAllPrompts } from "./prompts/register.js";
|
|
27
27
|
import { QdrantManager } from "./qdrant/client.js";
|
|
@@ -30,27 +30,22 @@ import { registerAllTools } from "./tools/index.js";
|
|
|
30
30
|
|
|
31
31
|
// Read package.json for version
|
|
32
32
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
33
|
-
const pkg = JSON.parse(
|
|
34
|
-
readFileSync(join(__dirname, "../package.json"), "utf-8"),
|
|
35
|
-
);
|
|
33
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf-8"));
|
|
36
34
|
|
|
37
35
|
// Validate environment variables
|
|
38
36
|
const QDRANT_URL = process.env.QDRANT_URL || "http://localhost:6333";
|
|
39
37
|
const QDRANT_API_KEY = process.env.QDRANT_API_KEY;
|
|
40
|
-
const EMBEDDING_PROVIDER = (
|
|
41
|
-
process.env.EMBEDDING_PROVIDER || "ollama"
|
|
42
|
-
).toLowerCase();
|
|
38
|
+
const EMBEDDING_PROVIDER = (process.env.EMBEDDING_PROVIDER || "ollama").toLowerCase();
|
|
43
39
|
const TRANSPORT_MODE = (process.env.TRANSPORT_MODE || "stdio").toLowerCase();
|
|
44
40
|
const HTTP_PORT = parseInt(process.env.HTTP_PORT || "3000", 10);
|
|
45
|
-
const PROMPTS_CONFIG_FILE =
|
|
46
|
-
process.env.PROMPTS_CONFIG_FILE || join(__dirname, "../prompts.json");
|
|
41
|
+
const PROMPTS_CONFIG_FILE = process.env.PROMPTS_CONFIG_FILE || join(__dirname, "../prompts.json");
|
|
47
42
|
|
|
48
43
|
// Validate HTTP_PORT when HTTP mode is selected
|
|
49
44
|
if (TRANSPORT_MODE === "http") {
|
|
50
45
|
if (Number.isNaN(HTTP_PORT) || HTTP_PORT < 1 || HTTP_PORT > 65535) {
|
|
51
46
|
logger.fatal(
|
|
52
47
|
{ port: process.env.HTTP_PORT },
|
|
53
|
-
"Invalid HTTP_PORT. Must be a number between 1 and 65535"
|
|
48
|
+
"Invalid HTTP_PORT. Must be a number between 1 and 65535"
|
|
54
49
|
);
|
|
55
50
|
process.exit(1);
|
|
56
51
|
}
|
|
@@ -77,7 +72,7 @@ if (EMBEDDING_PROVIDER !== "ollama") {
|
|
|
77
72
|
default:
|
|
78
73
|
logger.fatal(
|
|
79
74
|
{ provider: EMBEDDING_PROVIDER },
|
|
80
|
-
"Unknown embedding provider. Supported providers: openai, cohere, voyage, ollama"
|
|
75
|
+
"Unknown embedding provider. Supported providers: openai, cohere, voyage, ollama"
|
|
81
76
|
);
|
|
82
77
|
process.exit(1);
|
|
83
78
|
}
|
|
@@ -85,7 +80,7 @@ if (EMBEDDING_PROVIDER !== "ollama") {
|
|
|
85
80
|
if (!apiKey) {
|
|
86
81
|
logger.fatal(
|
|
87
82
|
{ provider: EMBEDDING_PROVIDER, requiredKey: requiredKeyName },
|
|
88
|
-
`${requiredKeyName} is required for ${EMBEDDING_PROVIDER} provider
|
|
83
|
+
`${requiredKeyName} is required for ${EMBEDDING_PROVIDER} provider`
|
|
89
84
|
);
|
|
90
85
|
process.exit(1);
|
|
91
86
|
}
|
|
@@ -95,8 +90,7 @@ if (EMBEDDING_PROVIDER !== "ollama") {
|
|
|
95
90
|
async function checkOllamaAvailability() {
|
|
96
91
|
if (EMBEDDING_PROVIDER === "ollama") {
|
|
97
92
|
const baseUrl = process.env.EMBEDDING_BASE_URL || "http://localhost:11434";
|
|
98
|
-
const isLocalhost =
|
|
99
|
-
baseUrl.includes("localhost") || baseUrl.includes("127.0.0.1");
|
|
93
|
+
const isLocalhost = baseUrl.includes("localhost") || baseUrl.includes("127.0.0.1");
|
|
100
94
|
|
|
101
95
|
try {
|
|
102
96
|
const response = await fetch(`${baseUrl}/api/version`);
|
|
@@ -109,7 +103,7 @@ async function checkOllamaAvailability() {
|
|
|
109
103
|
const { models } = await tagsResponse.json();
|
|
110
104
|
const modelName = process.env.EMBEDDING_MODEL || "nomic-embed-text";
|
|
111
105
|
const modelExists = models.some(
|
|
112
|
-
(m: any) => m.name === modelName || m.name.startsWith(`${modelName}:`)
|
|
106
|
+
(m: any) => m.name === modelName || m.name.startsWith(`${modelName}:`)
|
|
113
107
|
);
|
|
114
108
|
|
|
115
109
|
if (!modelExists) {
|
|
@@ -132,9 +126,7 @@ async function checkOllamaAvailability() {
|
|
|
132
126
|
}
|
|
133
127
|
} catch (error) {
|
|
134
128
|
const errorMessage =
|
|
135
|
-
error instanceof Error
|
|
136
|
-
? error.message
|
|
137
|
-
: `Ollama is not running at ${baseUrl}`;
|
|
129
|
+
error instanceof Error ? error.message : `Ollama is not running at ${baseUrl}`;
|
|
138
130
|
|
|
139
131
|
let helpText = "";
|
|
140
132
|
if (isLocalhost) {
|
|
@@ -170,30 +162,18 @@ logger.info(
|
|
|
170
162
|
model: embeddings.getModel(),
|
|
171
163
|
dimensions: embeddings.getDimensions(),
|
|
172
164
|
},
|
|
173
|
-
"Embedding provider initialized"
|
|
165
|
+
"Embedding provider initialized"
|
|
174
166
|
);
|
|
175
167
|
|
|
176
168
|
// Initialize code indexer
|
|
177
169
|
const codeConfig: CodeConfig = {
|
|
178
|
-
chunkSize: parseInt(
|
|
179
|
-
|
|
180
|
-
10,
|
|
181
|
-
),
|
|
182
|
-
chunkOverlap: parseInt(
|
|
183
|
-
process.env.CODE_CHUNK_OVERLAP || String(DEFAULT_CHUNK_OVERLAP),
|
|
184
|
-
10,
|
|
185
|
-
),
|
|
170
|
+
chunkSize: parseInt(process.env.CODE_CHUNK_SIZE || String(DEFAULT_CHUNK_SIZE), 10),
|
|
171
|
+
chunkOverlap: parseInt(process.env.CODE_CHUNK_OVERLAP || String(DEFAULT_CHUNK_OVERLAP), 10),
|
|
186
172
|
enableASTChunking: process.env.CODE_ENABLE_AST !== "false",
|
|
187
173
|
supportedExtensions: DEFAULT_CODE_EXTENSIONS,
|
|
188
174
|
ignorePatterns: DEFAULT_IGNORE_PATTERNS,
|
|
189
|
-
batchSize: parseInt(
|
|
190
|
-
|
|
191
|
-
10,
|
|
192
|
-
),
|
|
193
|
-
defaultSearchLimit: parseInt(
|
|
194
|
-
process.env.CODE_SEARCH_LIMIT || String(DEFAULT_SEARCH_LIMIT),
|
|
195
|
-
10,
|
|
196
|
-
),
|
|
175
|
+
batchSize: parseInt(process.env.CODE_BATCH_SIZE || String(DEFAULT_BATCH_SIZE), 10),
|
|
176
|
+
defaultSearchLimit: parseInt(process.env.CODE_SEARCH_LIMIT || String(DEFAULT_SEARCH_LIMIT), 10),
|
|
197
177
|
enableHybridSearch: process.env.CODE_ENABLE_HYBRID === "true",
|
|
198
178
|
};
|
|
199
179
|
|
|
@@ -202,37 +182,26 @@ logger.debug({ codeConfig }, "Code indexer configured");
|
|
|
202
182
|
|
|
203
183
|
// Initialize git history indexer
|
|
204
184
|
const gitConfig: GitConfig = {
|
|
205
|
-
maxCommits: parseInt(
|
|
206
|
-
process.env.GIT_MAX_COMMITS || String(DEFAULT_GIT_CONFIG.maxCommits),
|
|
207
|
-
10,
|
|
208
|
-
),
|
|
185
|
+
maxCommits: parseInt(process.env.GIT_MAX_COMMITS || String(DEFAULT_GIT_CONFIG.maxCommits), 10),
|
|
209
186
|
includeFileList: process.env.GIT_INCLUDE_FILES !== "false",
|
|
210
187
|
includeDiff: process.env.GIT_INCLUDE_DIFF !== "false",
|
|
211
188
|
maxDiffSize: parseInt(
|
|
212
189
|
process.env.GIT_MAX_DIFF_SIZE || String(DEFAULT_GIT_CONFIG.maxDiffSize),
|
|
213
|
-
10
|
|
214
|
-
),
|
|
215
|
-
gitTimeout: parseInt(
|
|
216
|
-
process.env.GIT_TIMEOUT || String(DEFAULT_GIT_CONFIG.gitTimeout),
|
|
217
|
-
10,
|
|
190
|
+
10
|
|
218
191
|
),
|
|
192
|
+
gitTimeout: parseInt(process.env.GIT_TIMEOUT || String(DEFAULT_GIT_CONFIG.gitTimeout), 10),
|
|
219
193
|
maxChunkSize: parseInt(
|
|
220
194
|
process.env.GIT_MAX_CHUNK_SIZE || String(DEFAULT_GIT_CONFIG.maxChunkSize),
|
|
221
|
-
10
|
|
222
|
-
),
|
|
223
|
-
batchSize: parseInt(
|
|
224
|
-
process.env.GIT_BATCH_SIZE || String(DEFAULT_GIT_CONFIG.batchSize),
|
|
225
|
-
10,
|
|
195
|
+
10
|
|
226
196
|
),
|
|
197
|
+
batchSize: parseInt(process.env.GIT_BATCH_SIZE || String(DEFAULT_GIT_CONFIG.batchSize), 10),
|
|
227
198
|
batchRetryAttempts: parseInt(
|
|
228
|
-
process.env.GIT_BATCH_RETRY_ATTEMPTS ||
|
|
229
|
-
|
|
230
|
-
10,
|
|
199
|
+
process.env.GIT_BATCH_RETRY_ATTEMPTS || String(DEFAULT_GIT_CONFIG.batchRetryAttempts),
|
|
200
|
+
10
|
|
231
201
|
),
|
|
232
202
|
defaultSearchLimit: parseInt(
|
|
233
|
-
process.env.GIT_SEARCH_LIMIT ||
|
|
234
|
-
|
|
235
|
-
10,
|
|
203
|
+
process.env.GIT_SEARCH_LIMIT || String(DEFAULT_GIT_CONFIG.defaultSearchLimit),
|
|
204
|
+
10
|
|
236
205
|
),
|
|
237
206
|
enableHybridSearch: process.env.GIT_ENABLE_HYBRID !== "false",
|
|
238
207
|
};
|
|
@@ -247,13 +216,10 @@ if (existsSync(PROMPTS_CONFIG_FILE)) {
|
|
|
247
216
|
promptsConfig = loadPromptsConfig(PROMPTS_CONFIG_FILE);
|
|
248
217
|
logger.info(
|
|
249
218
|
{ count: promptsConfig.prompts.length, file: PROMPTS_CONFIG_FILE },
|
|
250
|
-
"Loaded prompts config"
|
|
219
|
+
"Loaded prompts config"
|
|
251
220
|
);
|
|
252
221
|
} catch (error) {
|
|
253
|
-
logger.fatal(
|
|
254
|
-
{ file: PROMPTS_CONFIG_FILE, err: error },
|
|
255
|
-
"Failed to load prompts configuration",
|
|
256
|
-
);
|
|
222
|
+
logger.fatal({ file: PROMPTS_CONFIG_FILE, err: error }, "Failed to load prompts configuration");
|
|
257
223
|
process.exit(1);
|
|
258
224
|
}
|
|
259
225
|
}
|
|
@@ -303,17 +269,14 @@ const RATE_LIMIT_MAX_REQUESTS = 100; // Max requests per window
|
|
|
303
269
|
const RATE_LIMIT_WINDOW_MS = 15 * 60 * 1000; // 15 minutes
|
|
304
270
|
const RATE_LIMIT_MAX_CONCURRENT = 10; // Max concurrent requests per IP
|
|
305
271
|
const RATE_LIMITER_CLEANUP_INTERVAL_MS = 60 * 60 * 1000; // 1 hour
|
|
306
|
-
const REQUEST_TIMEOUT_MS = parseInt(
|
|
307
|
-
process.env.HTTP_REQUEST_TIMEOUT_MS || "300000",
|
|
308
|
-
10,
|
|
309
|
-
);
|
|
272
|
+
const REQUEST_TIMEOUT_MS = parseInt(process.env.HTTP_REQUEST_TIMEOUT_MS || "300000", 10);
|
|
310
273
|
const SHUTDOWN_GRACE_PERIOD_MS = 10 * 1000; // 10 seconds
|
|
311
274
|
|
|
312
275
|
// Validate REQUEST_TIMEOUT_MS
|
|
313
276
|
if (Number.isNaN(REQUEST_TIMEOUT_MS) || REQUEST_TIMEOUT_MS <= 0) {
|
|
314
277
|
logger.fatal(
|
|
315
278
|
{ value: process.env.HTTP_REQUEST_TIMEOUT_MS },
|
|
316
|
-
"Invalid HTTP_REQUEST_TIMEOUT_MS. Must be a positive integer"
|
|
279
|
+
"Invalid HTTP_REQUEST_TIMEOUT_MS. Must be a positive integer"
|
|
317
280
|
);
|
|
318
281
|
process.exit(1);
|
|
319
282
|
}
|
|
@@ -341,7 +304,7 @@ async function startHttpServer() {
|
|
|
341
304
|
res: express.Response,
|
|
342
305
|
code: number,
|
|
343
306
|
message: string,
|
|
344
|
-
httpStatus: number = 500
|
|
307
|
+
httpStatus: number = 500
|
|
345
308
|
) => {
|
|
346
309
|
if (!res.headersSent) {
|
|
347
310
|
res.status(httpStatus).json({
|
|
@@ -372,10 +335,7 @@ async function startHttpServer() {
|
|
|
372
335
|
});
|
|
373
336
|
|
|
374
337
|
if (keysToDelete.length > 0) {
|
|
375
|
-
logger.debug(
|
|
376
|
-
{ count: keysToDelete.length },
|
|
377
|
-
"Cleaned up inactive rate limiters",
|
|
378
|
-
);
|
|
338
|
+
logger.debug({ count: keysToDelete.length }, "Cleaned up inactive rate limiters");
|
|
379
339
|
}
|
|
380
340
|
}, RATE_LIMITER_CLEANUP_INTERVAL_MS);
|
|
381
341
|
|
|
@@ -383,7 +343,7 @@ async function startHttpServer() {
|
|
|
383
343
|
const rateLimitMiddleware = async (
|
|
384
344
|
req: express.Request,
|
|
385
345
|
res: express.Response,
|
|
386
|
-
next: express.NextFunction
|
|
346
|
+
next: express.NextFunction
|
|
387
347
|
) => {
|
|
388
348
|
const clientIp = req.ip || req.socket.remoteAddress || "unknown";
|
|
389
349
|
|
|
@@ -400,10 +360,7 @@ async function startHttpServer() {
|
|
|
400
360
|
if (error instanceof Bottleneck.BottleneckError) {
|
|
401
361
|
logger.warn({ clientIp }, "Rate limit exceeded");
|
|
402
362
|
} else {
|
|
403
|
-
logger.error(
|
|
404
|
-
{ clientIp, err: error },
|
|
405
|
-
"Unexpected rate limiting error",
|
|
406
|
-
);
|
|
363
|
+
logger.error({ clientIp, err: error }, "Unexpected rate limiting error");
|
|
407
364
|
}
|
|
408
365
|
sendErrorResponse(res, -32000, "Too many requests", 429);
|
|
409
366
|
}
|
|
@@ -522,10 +479,7 @@ async function main() {
|
|
|
522
479
|
} else if (TRANSPORT_MODE === "stdio") {
|
|
523
480
|
await startStdioServer();
|
|
524
481
|
} else {
|
|
525
|
-
logger.fatal(
|
|
526
|
-
{ mode: TRANSPORT_MODE },
|
|
527
|
-
"Invalid TRANSPORT_MODE. Supported modes: stdio, http",
|
|
528
|
-
);
|
|
482
|
+
logger.fatal({ mode: TRANSPORT_MODE }, "Invalid TRANSPORT_MODE. Supported modes: stdio, http");
|
|
529
483
|
process.exit(1);
|
|
530
484
|
}
|
|
531
485
|
}
|
package/src/logger.ts
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
import pino from "pino";
|
|
2
2
|
|
|
3
|
-
const VALID_LEVELS = [
|
|
4
|
-
"fatal",
|
|
5
|
-
"error",
|
|
6
|
-
"warn",
|
|
7
|
-
"info",
|
|
8
|
-
"debug",
|
|
9
|
-
"trace",
|
|
10
|
-
"silent",
|
|
11
|
-
];
|
|
3
|
+
const VALID_LEVELS = ["fatal", "error", "warn", "info", "debug", "trace", "silent"];
|
|
12
4
|
|
|
13
5
|
function resolveLogLevel(): string {
|
|
14
6
|
const level = process.env.LOG_LEVEL?.toLowerCase();
|
|
@@ -20,14 +12,11 @@ function resolveLogLevel(): string {
|
|
|
20
12
|
|
|
21
13
|
// Write warning directly to stderr since logger isn't initialized yet
|
|
22
14
|
process.stderr.write(
|
|
23
|
-
`WARNING: Invalid LOG_LEVEL "${process.env.LOG_LEVEL}". Valid levels: ${VALID_LEVELS.join(", ")}. Falling back to "info".\n
|
|
15
|
+
`WARNING: Invalid LOG_LEVEL "${process.env.LOG_LEVEL}". Valid levels: ${VALID_LEVELS.join(", ")}. Falling back to "info".\n`
|
|
24
16
|
);
|
|
25
17
|
return "info";
|
|
26
18
|
}
|
|
27
19
|
|
|
28
|
-
const logger = pino(
|
|
29
|
-
{ level: resolveLogLevel(), name: "qdrant-mcp" },
|
|
30
|
-
pino.destination(2),
|
|
31
|
-
);
|
|
20
|
+
const logger = pino({ level: resolveLogLevel(), name: "qdrant-mcp" }, pino.destination(2));
|
|
32
21
|
|
|
33
22
|
export default logger;
|
package/src/prompts/register.ts
CHANGED
|
@@ -24,10 +24,7 @@ function buildArgsSchema(args: PromptArgument[]): Record<string, z.ZodTypeAny> {
|
|
|
24
24
|
/**
|
|
25
25
|
* Register all prompts from configuration on the server
|
|
26
26
|
*/
|
|
27
|
-
export function registerAllPrompts(
|
|
28
|
-
server: McpServer,
|
|
29
|
-
config: PromptsConfig | null,
|
|
30
|
-
): void {
|
|
27
|
+
export function registerAllPrompts(server: McpServer, config: PromptsConfig | null): void {
|
|
31
28
|
if (!config) {
|
|
32
29
|
return; // No prompts = no prompts capability
|
|
33
30
|
}
|
|
@@ -48,11 +45,7 @@ export function registerAllPrompts(
|
|
|
48
45
|
validateArguments(argsRecord, prompt.arguments);
|
|
49
46
|
|
|
50
47
|
// Render template
|
|
51
|
-
const rendered = renderTemplate(
|
|
52
|
-
prompt.template,
|
|
53
|
-
argsRecord,
|
|
54
|
-
prompt.arguments,
|
|
55
|
-
);
|
|
48
|
+
const rendered = renderTemplate(prompt.template, argsRecord, prompt.arguments);
|
|
56
49
|
|
|
57
50
|
return {
|
|
58
51
|
messages: [
|
|
@@ -65,7 +58,7 @@ export function registerAllPrompts(
|
|
|
65
58
|
},
|
|
66
59
|
],
|
|
67
60
|
};
|
|
68
|
-
}
|
|
61
|
+
}
|
|
69
62
|
);
|
|
70
63
|
}
|
|
71
64
|
}
|