@elastic.io/mcp 1.0.0-beta
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 +191 -0
- package/README.md +173 -0
- package/README.npm.md +173 -0
- package/dist/api/client.d.ts +12 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +129 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/jsonapi.d.ts +21 -0
- package/dist/api/jsonapi.d.ts.map +1 -0
- package/dist/api/jsonapi.js +32 -0
- package/dist/api/jsonapi.js.map +1 -0
- package/dist/api/logger.d.ts +8 -0
- package/dist/api/logger.d.ts.map +1 -0
- package/dist/api/logger.js +43 -0
- package/dist/api/logger.js.map +1 -0
- package/dist/api/samples.d.ts +15 -0
- package/dist/api/samples.d.ts.map +1 -0
- package/dist/api/samples.js +465 -0
- package/dist/api/samples.js.map +1 -0
- package/dist/api/verification.d.ts +6 -0
- package/dist/api/verification.d.ts.map +1 -0
- package/dist/api/verification.js +71 -0
- package/dist/api/verification.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +9 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +44 -0
- package/dist/config.js.map +1 -0
- package/dist/embeddings/factory.d.ts +7 -0
- package/dist/embeddings/factory.d.ts.map +1 -0
- package/dist/embeddings/factory.js +25 -0
- package/dist/embeddings/factory.js.map +1 -0
- package/dist/embeddings/google.d.ts +19 -0
- package/dist/embeddings/google.d.ts.map +1 -0
- package/dist/embeddings/google.js +132 -0
- package/dist/embeddings/google.js.map +1 -0
- package/dist/embeddings/types.d.ts +27 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +2 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +227 -0
- package/dist/index.js.map +1 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +10 -0
- package/dist/paths.js.map +1 -0
- package/dist/server.d.ts +29 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +385 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.d.ts +3 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +338 -0
- package/dist/setup.js.map +1 -0
- package/dist/tools/confirmation.d.ts +37 -0
- package/dist/tools/confirmation.d.ts.map +1 -0
- package/dist/tools/confirmation.js +120 -0
- package/dist/tools/confirmation.js.map +1 -0
- package/dist/tools/constants.d.ts +28 -0
- package/dist/tools/constants.d.ts.map +1 -0
- package/dist/tools/constants.js +92 -0
- package/dist/tools/constants.js.map +1 -0
- package/dist/tools/definitions.d.ts +3 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +915 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/flow-build.d.ts +18 -0
- package/dist/tools/flow-build.d.ts.map +1 -0
- package/dist/tools/flow-build.js +295 -0
- package/dist/tools/flow-build.js.map +1 -0
- package/dist/tools/flow-evidence.d.ts +62 -0
- package/dist/tools/flow-evidence.d.ts.map +1 -0
- package/dist/tools/flow-evidence.js +128 -0
- package/dist/tools/flow-evidence.js.map +1 -0
- package/dist/tools/flow-state-machine.d.ts +69 -0
- package/dist/tools/flow-state-machine.d.ts.map +1 -0
- package/dist/tools/flow-state-machine.js +292 -0
- package/dist/tools/flow-state-machine.js.map +1 -0
- package/dist/tools/handlers/auth.d.ts +3 -0
- package/dist/tools/handlers/auth.d.ts.map +1 -0
- package/dist/tools/handlers/auth.js +410 -0
- package/dist/tools/handlers/auth.js.map +1 -0
- package/dist/tools/handlers/component.d.ts +3 -0
- package/dist/tools/handlers/component.d.ts.map +1 -0
- package/dist/tools/handlers/component.js +165 -0
- package/dist/tools/handlers/component.js.map +1 -0
- package/dist/tools/handlers/data-sample.d.ts +3 -0
- package/dist/tools/handlers/data-sample.d.ts.map +1 -0
- package/dist/tools/handlers/data-sample.js +83 -0
- package/dist/tools/handlers/data-sample.js.map +1 -0
- package/dist/tools/handlers/dynamic.d.ts +3 -0
- package/dist/tools/handlers/dynamic.d.ts.map +1 -0
- package/dist/tools/handlers/dynamic.js +139 -0
- package/dist/tools/handlers/dynamic.js.map +1 -0
- package/dist/tools/handlers/flow.d.ts +9 -0
- package/dist/tools/handlers/flow.d.ts.map +1 -0
- package/dist/tools/handlers/flow.js +427 -0
- package/dist/tools/handlers/flow.js.map +1 -0
- package/dist/tools/handlers/log.d.ts +3 -0
- package/dist/tools/handlers/log.d.ts.map +1 -0
- package/dist/tools/handlers/log.js +92 -0
- package/dist/tools/handlers/log.js.map +1 -0
- package/dist/tools/handlers/organization.d.ts +3 -0
- package/dist/tools/handlers/organization.d.ts.map +1 -0
- package/dist/tools/handlers/organization.js +39 -0
- package/dist/tools/handlers/organization.js.map +1 -0
- package/dist/tools/handlers/raw.d.ts +3 -0
- package/dist/tools/handlers/raw.d.ts.map +1 -0
- package/dist/tools/handlers/raw.js +80 -0
- package/dist/tools/handlers/raw.js.map +1 -0
- package/dist/tools/handlers/search.d.ts +3 -0
- package/dist/tools/handlers/search.d.ts.map +1 -0
- package/dist/tools/handlers/search.js +105 -0
- package/dist/tools/handlers/search.js.map +1 -0
- package/dist/tools/handlers/session.d.ts +3 -0
- package/dist/tools/handlers/session.d.ts.map +1 -0
- package/dist/tools/handlers/session.js +22 -0
- package/dist/tools/handlers/session.js.map +1 -0
- package/dist/tools/handlers.d.ts +12 -0
- package/dist/tools/handlers.d.ts.map +1 -0
- package/dist/tools/handlers.js +202 -0
- package/dist/tools/handlers.js.map +1 -0
- package/dist/tools/helpers.d.ts +44 -0
- package/dist/tools/helpers.d.ts.map +1 -0
- package/dist/tools/helpers.js +195 -0
- package/dist/tools/helpers.js.map +1 -0
- package/dist/tools/types.d.ts +39 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/validation.d.ts +35 -0
- package/dist/tools/validation.d.ts.map +1 -0
- package/dist/tools/validation.js +800 -0
- package/dist/tools/validation.js.map +1 -0
- package/dist/types/index.d.ts +47 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/vectorstore/factory.d.ts +7 -0
- package/dist/vectorstore/factory.d.ts.map +1 -0
- package/dist/vectorstore/factory.js +25 -0
- package/dist/vectorstore/factory.js.map +1 -0
- package/dist/vectorstore/qdrant.d.ts +11 -0
- package/dist/vectorstore/qdrant.d.ts.map +1 -0
- package/dist/vectorstore/qdrant.js +107 -0
- package/dist/vectorstore/qdrant.js.map +1 -0
- package/dist/vectorstore/types.d.ts +28 -0
- package/dist/vectorstore/types.d.ts.map +1 -0
- package/dist/vectorstore/types.js +2 -0
- package/dist/vectorstore/types.js.map +1 -0
- package/package.json +66 -0
- package/resources/docs/flow-building-guide.md +581 -0
- package/resources/docs/rest-api-pagination.md +58 -0
- package/resources/docs/standardized-components-guide.md +66 -0
- package/resources/docs/system-instructions.md +207 -0
- package/resources/flow-examples/batch-flow-1-collect.json +51 -0
- package/resources/flow-examples/batch-flow-2-process.json +70 -0
- package/resources/flow-examples/code-component-transform.json +65 -0
- package/resources/flow-examples/code-component-trigger.json +52 -0
- package/resources/flow-examples/code-component-with-credentials-trigger.json +53 -0
- package/resources/flow-examples/code-component-with-credentials.json +67 -0
- package/resources/flow-examples/filter-step.json +63 -0
- package/resources/flow-examples/polling-sync-trigger.json +50 -0
- package/resources/flow-examples/router-branching.json +94 -0
- package/resources/flow-examples/splitter-re-assemble.json +72 -0
- package/resources/flow-examples/splitter-split.json +68 -0
- package/resources/flow-examples/timer-query-action-sync.json +68 -0
- package/resources/flow-examples/webhook-async-sync.json +49 -0
- package/resources/flow-examples/webhook-request-reply.json +63 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import dotenv from 'dotenv';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
dotenv.config({ path: path.resolve(__dirname, '../.env') });
|
|
6
|
+
function getEnv(key, fallbackKeys = [], defaultValue) {
|
|
7
|
+
if (process.env[key] !== undefined) {
|
|
8
|
+
return process.env[key];
|
|
9
|
+
}
|
|
10
|
+
for (const fallback of fallbackKeys) {
|
|
11
|
+
if (process.env[fallback] !== undefined) {
|
|
12
|
+
return process.env[fallback];
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
if (defaultValue !== undefined) {
|
|
16
|
+
return defaultValue;
|
|
17
|
+
}
|
|
18
|
+
throw new Error(`Configuration Error: Missing required environment variable '${key}'${fallbackKeys.length > 0 ? ` (tried fallbacks: ${fallbackKeys.join(', ')})` : ''}`);
|
|
19
|
+
}
|
|
20
|
+
function getOptionalEnv(key, fallbackKeys = [], defaultValue) {
|
|
21
|
+
if (process.env[key] !== undefined) {
|
|
22
|
+
return process.env[key];
|
|
23
|
+
}
|
|
24
|
+
for (const fallback of fallbackKeys) {
|
|
25
|
+
if (process.env[fallback] !== undefined) {
|
|
26
|
+
return process.env[fallback];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return defaultValue;
|
|
30
|
+
}
|
|
31
|
+
export const config = {
|
|
32
|
+
embeddingProvider: getEnv('EMBEDDING_PROVIDER', [], 'google'),
|
|
33
|
+
embeddingProviderApiKey: getOptionalEnv('EMBEDDING_PROVIDER_API_KEY') ?? '',
|
|
34
|
+
vectorStore: getEnv('VECTOR_STORE', [], 'qdrant'),
|
|
35
|
+
vectorStoreUrl: getOptionalEnv('VECTOR_STORE_URL') ?? '',
|
|
36
|
+
vectorStoreApiKey: getOptionalEnv('VECTOR_STORE_API_KEY'),
|
|
37
|
+
port: parseInt(getEnv('PORT', [], '9473'), 10),
|
|
38
|
+
nodeEnv: getEnv('NODE_ENV', [], 'development'),
|
|
39
|
+
elasticioApiEmail: getOptionalEnv('ELASTICIO_API_EMAIL'),
|
|
40
|
+
elasticioApiKey: getOptionalEnv('ELASTICIO_API_KEY'),
|
|
41
|
+
elasticioApiBaseUrl: getEnv('ELASTICIO_API_BASE_URL', [], 'https://api.elastic.io/v2'),
|
|
42
|
+
logLevel: getEnv('LOG_LEVEL', [], 'INFO'),
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;AAiB5D,SAAS,MAAM,CAAC,GAAW,EAAE,eAAyB,EAAE,EAAE,YAAqB;IAC7E,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,+DAA+D,GAAG,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,sBAAsB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3K,CAAC;AAED,SAAS,cAAc,CAAC,GAAW,EAAE,eAAyB,EAAE,EAAE,YAAqB;IACrF,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,iBAAiB,EAAE,MAAM,CAAC,oBAAoB,EAAE,EAAE,EAAE,QAAQ,CAAC;IAC7D,uBAAuB,EAAE,cAAc,CAAC,4BAA4B,CAAC,IAAI,EAAE;IAC3E,WAAW,EAAE,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,QAAQ,CAAC;IACjD,cAAc,EAAE,cAAc,CAAC,kBAAkB,CAAC,IAAI,EAAE;IACxD,iBAAiB,EAAE,cAAc,CAAC,sBAAsB,CAAC;IACzD,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;IAC9C,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,aAAa,CAAC;IAC9C,iBAAiB,EAAE,cAAc,CAAC,qBAAqB,CAAC;IACxD,eAAe,EAAE,cAAc,CAAC,mBAAmB,CAAC;IACpD,mBAAmB,EAAE,MAAM,CAAC,wBAAwB,EAAE,EAAE,EAAE,2BAA2B,CAAC;IACtF,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,MAAM,CAAC;CAC1C,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { EmbeddingProvider } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Returns the configured active embedding provider.
|
|
4
|
+
* Currently defaults to Google's gemini-embedding-2.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getEmbeddingProvider(): EmbeddingProvider;
|
|
7
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/embeddings/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAM/C;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAoBxD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { GoogleEmbeddingProvider } from './google.js';
|
|
2
|
+
import { config } from '../config.js';
|
|
3
|
+
let activeProvider = null;
|
|
4
|
+
/**
|
|
5
|
+
* Returns the configured active embedding provider.
|
|
6
|
+
* Currently defaults to Google's gemini-embedding-2.
|
|
7
|
+
*/
|
|
8
|
+
export function getEmbeddingProvider() {
|
|
9
|
+
if (activeProvider) {
|
|
10
|
+
return activeProvider;
|
|
11
|
+
}
|
|
12
|
+
if (!config.embeddingProviderApiKey) {
|
|
13
|
+
throw new Error('Semantic search is not configured: EMBEDDING_PROVIDER_API_KEY environment variable is not set.');
|
|
14
|
+
}
|
|
15
|
+
const providerType = config.embeddingProvider;
|
|
16
|
+
switch (providerType.toLowerCase()) {
|
|
17
|
+
case 'google':
|
|
18
|
+
activeProvider = new GoogleEmbeddingProvider();
|
|
19
|
+
break;
|
|
20
|
+
default:
|
|
21
|
+
throw new Error(`Unsupported embedding provider configured: ${providerType}`);
|
|
22
|
+
}
|
|
23
|
+
return activeProvider;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/embeddings/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,IAAI,cAAc,GAA6B,IAAI,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,gGAAgG,CAAC,CAAC;IACpH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAE9C,QAAQ,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;QACnC,KAAK,QAAQ;YACX,cAAc,GAAG,IAAI,uBAAuB,EAAE,CAAC;YAC/C,MAAM;QACR;YACE,MAAM,IAAI,KAAK,CAAC,8CAA8C,YAAY,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { EmbeddingProvider } from './types.js';
|
|
2
|
+
export declare class GoogleEmbeddingProvider implements EmbeddingProvider {
|
|
3
|
+
private ai;
|
|
4
|
+
private model;
|
|
5
|
+
constructor();
|
|
6
|
+
private withTimeout;
|
|
7
|
+
private retry;
|
|
8
|
+
embedText(text: string): Promise<number[]>;
|
|
9
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
10
|
+
embedImage(imageBuffer: Buffer, mimeType: string): Promise<number[]>;
|
|
11
|
+
embedVideo(videoBuffer: Buffer, mimeType: string): Promise<number[]>;
|
|
12
|
+
embedDocument(docBuffer: Buffer, mimeType: string): Promise<number[]>;
|
|
13
|
+
getDimensions(): number;
|
|
14
|
+
/**
|
|
15
|
+
* Helper to send inline media parts to the Gemini embedding model
|
|
16
|
+
*/
|
|
17
|
+
private embedMultimodalPart;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=google.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/embeddings/google.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAI/C,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,OAAO,CAAC,EAAE,CAAc;IACxB,OAAO,CAAC,KAAK,CAAwB;;YAOvB,WAAW;YAQX,KAAK;IA8Bb,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAmB1C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IA4BhD,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IASpE,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IASpE,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAS3E,aAAa,IAAI,MAAM;IAIvB;;OAEG;YACW,mBAAmB;CAoBlC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { GoogleGenAI } from '@google/genai';
|
|
2
|
+
import { logger } from '../api/logger.js';
|
|
3
|
+
import { config } from '../config.js';
|
|
4
|
+
export class GoogleEmbeddingProvider {
|
|
5
|
+
ai;
|
|
6
|
+
model = 'gemini-embedding-2';
|
|
7
|
+
constructor() {
|
|
8
|
+
const apiKey = config.embeddingProviderApiKey;
|
|
9
|
+
this.ai = new GoogleGenAI({ apiKey });
|
|
10
|
+
}
|
|
11
|
+
async withTimeout(promise, timeoutMs = 25000) {
|
|
12
|
+
let timer;
|
|
13
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
14
|
+
timer = setTimeout(() => reject(new Error('API request timed out')), timeoutMs);
|
|
15
|
+
});
|
|
16
|
+
return Promise.race([promise, timeoutPromise]).finally(() => clearTimeout(timer));
|
|
17
|
+
}
|
|
18
|
+
async retry(fn, maxRetries = 6, baseDelayMs = 2000) {
|
|
19
|
+
let attempt = 0;
|
|
20
|
+
while (true) {
|
|
21
|
+
try {
|
|
22
|
+
return await fn();
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
attempt++;
|
|
26
|
+
const errStr = String(err);
|
|
27
|
+
const isRateLimit = err?.status === 429 ||
|
|
28
|
+
err?.statusCode === 429 ||
|
|
29
|
+
errStr.includes('429') ||
|
|
30
|
+
errStr.includes('ResourceExhausted') ||
|
|
31
|
+
errStr.includes('Quota exceeded') ||
|
|
32
|
+
errStr.includes('rate limit');
|
|
33
|
+
if (attempt >= maxRetries) {
|
|
34
|
+
logger.error(`[Gemini API] Max retries (${maxRetries}) reached. Failing.`);
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
const delay = baseDelayMs * Math.pow(2, attempt - 1);
|
|
38
|
+
logger.warn(`[Gemini API] ${isRateLimit ? 'Rate limit (429)' : 'Error'} encountered. Retrying in ${delay / 1000}s (Attempt ${attempt}/${maxRetries})... Error: ${err?.message || errStr}`);
|
|
39
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async embedText(text) {
|
|
44
|
+
return this.retry(async () => {
|
|
45
|
+
const response = await this.withTimeout(this.ai.models.embedContent({
|
|
46
|
+
model: this.model,
|
|
47
|
+
contents: text,
|
|
48
|
+
config: {
|
|
49
|
+
outputDimensionality: 768,
|
|
50
|
+
},
|
|
51
|
+
}));
|
|
52
|
+
const values = response.embeddings?.[0]?.values;
|
|
53
|
+
if (!values) {
|
|
54
|
+
throw new Error(`Failed to generate embedding for text: ${text.substring(0, 50)}...`);
|
|
55
|
+
}
|
|
56
|
+
return values;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async embedBatch(texts) {
|
|
60
|
+
return this.retry(async () => {
|
|
61
|
+
// Map strings to individual Content objects to get distinct embeddings for each item
|
|
62
|
+
const contents = texts.map(t => ({ parts: [{ text: t }] }));
|
|
63
|
+
const response = await this.withTimeout(this.ai.models.embedContent({
|
|
64
|
+
model: this.model,
|
|
65
|
+
contents,
|
|
66
|
+
config: {
|
|
67
|
+
outputDimensionality: 768,
|
|
68
|
+
},
|
|
69
|
+
}));
|
|
70
|
+
if (response.embeddings && Array.isArray(response.embeddings)) {
|
|
71
|
+
const results = [];
|
|
72
|
+
for (const e of response.embeddings) {
|
|
73
|
+
if (e.values) {
|
|
74
|
+
results.push(e.values);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return results;
|
|
78
|
+
}
|
|
79
|
+
// Fallback if batch endpoint isn't supported for some parameters, run sequentially
|
|
80
|
+
return Promise.all(texts.map((t) => this.embedText(t)));
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
async embedImage(imageBuffer, mimeType) {
|
|
84
|
+
return this.embedMultimodalPart({
|
|
85
|
+
inlineData: {
|
|
86
|
+
data: imageBuffer.toString('base64'),
|
|
87
|
+
mimeType,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async embedVideo(videoBuffer, mimeType) {
|
|
92
|
+
return this.embedMultimodalPart({
|
|
93
|
+
inlineData: {
|
|
94
|
+
data: videoBuffer.toString('base64'),
|
|
95
|
+
mimeType,
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
async embedDocument(docBuffer, mimeType) {
|
|
100
|
+
return this.embedMultimodalPart({
|
|
101
|
+
inlineData: {
|
|
102
|
+
data: docBuffer.toString('base64'),
|
|
103
|
+
mimeType,
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
getDimensions() {
|
|
108
|
+
return 768; // gemini-embedding-2 configured output size
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Helper to send inline media parts to the Gemini embedding model
|
|
112
|
+
*/
|
|
113
|
+
async embedMultimodalPart(part) {
|
|
114
|
+
return this.retry(async () => {
|
|
115
|
+
const response = await this.withTimeout(this.ai.models.embedContent({
|
|
116
|
+
model: this.model,
|
|
117
|
+
contents: {
|
|
118
|
+
parts: [part],
|
|
119
|
+
},
|
|
120
|
+
config: {
|
|
121
|
+
outputDimensionality: 768,
|
|
122
|
+
},
|
|
123
|
+
}));
|
|
124
|
+
const values = response.embeddings?.[0]?.values;
|
|
125
|
+
if (!values) {
|
|
126
|
+
throw new Error('Failed to generate embedding for multimodal content.');
|
|
127
|
+
}
|
|
128
|
+
return values;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=google.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/embeddings/google.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,OAAO,uBAAuB;IAC1B,EAAE,CAAc;IAChB,KAAK,GAAG,oBAAoB,CAAC;IAErC;QACE,MAAM,MAAM,GAAG,MAAM,CAAC,uBAAuB,CAAC;QAC9C,IAAI,CAAC,EAAE,GAAG,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAEO,KAAK,CAAC,WAAW,CAAI,OAAmB,EAAE,SAAS,GAAG,KAAK;QACjE,IAAI,KAAqB,CAAC;QAC1B,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACtD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,CAAC;IAEO,KAAK,CAAC,KAAK,CAAI,EAAoB,EAAE,UAAU,GAAG,CAAC,EAAE,WAAW,GAAG,IAAI;QAC7E,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,OAAO,MAAM,EAAE,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,EAAE,CAAC;gBACV,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC3B,MAAM,WAAW,GACf,GAAG,EAAE,MAAM,KAAK,GAAG;oBACnB,GAAG,EAAE,UAAU,KAAK,GAAG;oBACvB,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;oBACtB,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC;oBACpC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;oBACjC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;gBAEhC,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;oBAC1B,MAAM,CAAC,KAAK,CAAC,6BAA6B,UAAU,qBAAqB,CAAC,CAAC;oBAC3E,MAAM,GAAG,CAAC;gBACZ,CAAC;gBAED,MAAM,KAAK,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;gBACrD,MAAM,CAAC,IAAI,CACT,gBAAgB,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,6BAA6B,KAAK,GAAG,IAAI,cAAc,OAAO,IAAI,UAAU,eAAe,GAAG,EAAE,OAAO,IAAI,MAAM,EAAE,CAC9K,CAAC;gBACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;gBAClE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE;oBACN,oBAAoB,EAAE,GAAG;iBAC1B;aACF,CAAC,CAAC,CAAC;YAEJ,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;YAChD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;YACxF,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YAC3B,qFAAqF;YACrF,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAE5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;gBAClE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ;gBACR,MAAM,EAAE;oBACN,oBAAoB,EAAE,GAAG;iBAC1B;aACF,CAAC,CAAC,CAAC;YAEJ,IAAI,QAAQ,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9D,MAAM,OAAO,GAAe,EAAE,CAAC;gBAC/B,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;oBACpC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;wBACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,mFAAmF;YACnF,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,QAAgB;QACpD,OAAO,IAAI,CAAC,mBAAmB,CAAC;YAC9B,UAAU,EAAE;gBACV,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACpC,QAAQ;aACT;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,QAAgB;QACpD,OAAO,IAAI,CAAC,mBAAmB,CAAC;YAC9B,UAAU,EAAE;gBACV,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACpC,QAAQ;aACT;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,QAAgB;QACrD,OAAO,IAAI,CAAC,mBAAmB,CAAC;YAC9B,UAAU,EAAE;gBACV,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAClC,QAAQ;aACT;SACF,CAAC,CAAC;IACL,CAAC;IAED,aAAa;QACX,OAAO,GAAG,CAAC,CAAC,4CAA4C;IAC1D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAAC,IAAS;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;gBAClE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE;oBACR,KAAK,EAAE,CAAC,IAAI,CAAC;iBACd;gBACD,MAAM,EAAE;oBACN,oBAAoB,EAAE,GAAG;iBAC1B;aACF,CAAC,CAAC,CAAC;YAEJ,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;YAChD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAC1E,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface EmbeddingProvider {
|
|
2
|
+
/**
|
|
3
|
+
* Generates a vector embedding for a single string of text.
|
|
4
|
+
*/
|
|
5
|
+
embedText(text: string): Promise<number[]>;
|
|
6
|
+
/**
|
|
7
|
+
* Generates embeddings for a batch of strings.
|
|
8
|
+
*/
|
|
9
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
10
|
+
/**
|
|
11
|
+
* Generates a vector embedding for an image buffer.
|
|
12
|
+
*/
|
|
13
|
+
embedImage(imageBuffer: Buffer, mimeType: string): Promise<number[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Generates a vector embedding for a video buffer.
|
|
16
|
+
*/
|
|
17
|
+
embedVideo(videoBuffer: Buffer, mimeType: string): Promise<number[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Generates a vector embedding for a document buffer (PDF, HTML, etc.).
|
|
20
|
+
*/
|
|
21
|
+
embedDocument(docBuffer: Buffer, mimeType: string): Promise<number[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Returns the dimension size of the embedding vectors (e.g. 768).
|
|
24
|
+
*/
|
|
25
|
+
getDimensions(): number;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/embeddings/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE3C;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEjD;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAErE;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAErE;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEtE;;OAEG;IACH,aAAa,IAAI,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/embeddings/types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { config } from './config.js';
|
|
3
|
+
import express from 'express';
|
|
4
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
5
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
6
|
+
import { createElasticioClient } from './api/client.js';
|
|
7
|
+
import { createMcpServer, SessionManager } from './server.js';
|
|
8
|
+
import { logger } from './api/logger.js';
|
|
9
|
+
import { ingestionQueue } from './api/samples.js';
|
|
10
|
+
import crypto from 'node:crypto';
|
|
11
|
+
const args = process.argv.slice(2);
|
|
12
|
+
const transportFlag = args.find((arg) => arg.startsWith('--transport='));
|
|
13
|
+
const isSseMode = transportFlag ? transportFlag.split('=')[1] === 'sse' : false;
|
|
14
|
+
if (isSseMode) {
|
|
15
|
+
const app = express();
|
|
16
|
+
const sessionManager = new SessionManager();
|
|
17
|
+
sessionManager.startReaper(30 * 60 * 1000); // 30 minutes idle timeout
|
|
18
|
+
const port = config.port;
|
|
19
|
+
// Custom CORS middleware to support cross-origin browser dashboards or clients
|
|
20
|
+
app.use((req, res, next) => {
|
|
21
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
22
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE, OPTIONS');
|
|
23
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, mcp-session-id, x-elasticio-email, x-elasticio-api-key');
|
|
24
|
+
if (req.method === 'OPTIONS') {
|
|
25
|
+
res.sendStatus(200);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
next();
|
|
29
|
+
});
|
|
30
|
+
// Global HTTP request logging middleware
|
|
31
|
+
app.use((req, res, next) => {
|
|
32
|
+
const start = Date.now();
|
|
33
|
+
res.on('finish', () => {
|
|
34
|
+
const duration = Date.now() - start;
|
|
35
|
+
logger.info(`[HTTP] ${req.method} ${req.originalUrl} - Status: ${res.statusCode} (${duration}ms)`);
|
|
36
|
+
});
|
|
37
|
+
next();
|
|
38
|
+
});
|
|
39
|
+
app.disable('x-powered-by');
|
|
40
|
+
// Custom Security Headers middleware to enforce baseline security controls
|
|
41
|
+
app.use((req, res, next) => {
|
|
42
|
+
res.setHeader('X-Content-Type-Options', 'nosniff');
|
|
43
|
+
res.setHeader('X-Frame-Options', 'DENY');
|
|
44
|
+
res.setHeader('X-XSS-Protection', '1; mode=block');
|
|
45
|
+
res.setHeader('Strict-Transport-Security', 'max-age=15552000; includeSubDomains');
|
|
46
|
+
res.setHeader('Content-Security-Policy', "default-src 'none'");
|
|
47
|
+
next();
|
|
48
|
+
});
|
|
49
|
+
app.get('/health', (req, res) => {
|
|
50
|
+
res.status(200).json({
|
|
51
|
+
status: 'OK',
|
|
52
|
+
activeSessions: sessionManager.activeSessionCount()
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
const connectionRateLimits = new Map();
|
|
56
|
+
const sseRateLimiter = (limit, windowMs) => {
|
|
57
|
+
return (req, res, next) => {
|
|
58
|
+
const ip = req.headers['x-forwarded-for'] || req.ip || req.socket.remoteAddress || 'unknown';
|
|
59
|
+
const now = Date.now();
|
|
60
|
+
let info = connectionRateLimits.get(ip);
|
|
61
|
+
if (!info) {
|
|
62
|
+
info = { timestamps: [] };
|
|
63
|
+
connectionRateLimits.set(ip, info);
|
|
64
|
+
}
|
|
65
|
+
info.timestamps = info.timestamps.filter((ts) => now - ts < windowMs);
|
|
66
|
+
if (info.timestamps.length >= limit) {
|
|
67
|
+
logger.warn(`[Rate Limit Exceeded] IP: ${ip} exceeded session connection limit for ${req.path}`);
|
|
68
|
+
res.status(429).send('Too Many Requests: SSE connection rate limit exceeded. Please wait a minute and try again.');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
info.timestamps.push(now);
|
|
72
|
+
next();
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
const getAuthHeader = (req) => {
|
|
76
|
+
let authHeader = req.headers['authorization'];
|
|
77
|
+
const emailHeader = req.headers['x-elasticio-email'];
|
|
78
|
+
const apiKeyHeader = req.headers['x-elasticio-api-key'];
|
|
79
|
+
if (!authHeader && typeof emailHeader === 'string' && typeof apiKeyHeader === 'string') {
|
|
80
|
+
const token = Buffer.from(`${emailHeader}:${apiKeyHeader}`).toString('base64');
|
|
81
|
+
authHeader = `Basic ${token}`;
|
|
82
|
+
}
|
|
83
|
+
if (config.nodeEnv !== 'production') {
|
|
84
|
+
const queryEmail = req.query.email;
|
|
85
|
+
const queryApiKey = req.query.apiKey;
|
|
86
|
+
const queryAuth = req.query.auth;
|
|
87
|
+
if (!authHeader && typeof queryEmail === 'string' && typeof queryApiKey === 'string') {
|
|
88
|
+
const token = Buffer.from(`${queryEmail}:${queryApiKey}`).toString('base64');
|
|
89
|
+
authHeader = `Basic ${token}`;
|
|
90
|
+
}
|
|
91
|
+
if (!authHeader && typeof queryAuth === 'string') {
|
|
92
|
+
authHeader = queryAuth;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return authHeader;
|
|
96
|
+
};
|
|
97
|
+
const handleSessionRoute = async (req, res, next) => {
|
|
98
|
+
try {
|
|
99
|
+
const sessionId = req.headers['mcp-session-id'] || req.query.sessionId;
|
|
100
|
+
if (typeof sessionId === 'string' &&
|
|
101
|
+
sessionId.trim() !== '' &&
|
|
102
|
+
sessionId !== 'undefined' &&
|
|
103
|
+
sessionId !== 'null') {
|
|
104
|
+
// Existing session
|
|
105
|
+
const session = sessionManager.getSession(sessionId);
|
|
106
|
+
if (!session) {
|
|
107
|
+
res.status(404).send(`Session with ID '${sessionId}' not found.`);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// Verify credentials to prevent session hijacking
|
|
111
|
+
const currentAuth = getAuthHeader(req);
|
|
112
|
+
if (!currentAuth || currentAuth !== session.authHeader) {
|
|
113
|
+
res.status(401).send('Unauthorized: Credentials do not match the session owner.');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
session.lastActive = Date.now();
|
|
117
|
+
if (req.method === 'DELETE') {
|
|
118
|
+
sessionManager.removeSession(sessionId);
|
|
119
|
+
res.sendStatus(200);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
await session.transport.handleRequest(req, res, req.body);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (req.method !== 'GET' && req.method !== 'POST') {
|
|
126
|
+
res.status(405).send('Method Not Allowed: New session must be GET or POST.');
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const authHeader = getAuthHeader(req);
|
|
130
|
+
if (!authHeader) {
|
|
131
|
+
res.status(401).send('Unauthorized: Authorization header or "x-elasticio-email" & "x-elasticio-api-key" headers are required.');
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const generatedSessionId = crypto.randomUUID();
|
|
135
|
+
// Create new session resources
|
|
136
|
+
const client = createElasticioClient(authHeader);
|
|
137
|
+
const server = createMcpServer(client);
|
|
138
|
+
const transport = new StreamableHTTPServerTransport({
|
|
139
|
+
sessionIdGenerator: () => generatedSessionId,
|
|
140
|
+
enableJsonResponse: true
|
|
141
|
+
});
|
|
142
|
+
transport.onerror = (err) => {
|
|
143
|
+
logger.error('[SSE Transport Error]', err.message || err, err.stack || '');
|
|
144
|
+
};
|
|
145
|
+
await server.connect(transport);
|
|
146
|
+
sessionManager.registerSession(generatedSessionId, {
|
|
147
|
+
server,
|
|
148
|
+
transport,
|
|
149
|
+
client,
|
|
150
|
+
authHeader,
|
|
151
|
+
lastActive: Date.now()
|
|
152
|
+
});
|
|
153
|
+
res.setHeader('mcp-session-id', generatedSessionId);
|
|
154
|
+
logger.info(`[Session Created] ID: ${generatedSessionId} (Active: ${sessionManager.activeSessionCount()})`);
|
|
155
|
+
await transport.handleRequest(req, res, req.body);
|
|
156
|
+
req.on('close', () => {
|
|
157
|
+
sessionManager.removeSession(generatedSessionId);
|
|
158
|
+
logger.info(`[Session Closed] ID: ${generatedSessionId} (Active: ${sessionManager.activeSessionCount()})`);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
next(err);
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
const wrap = (fn) => (req, res, next) => { fn(req, res, next).catch(next); };
|
|
166
|
+
app.get('/sse', sseRateLimiter(10, 60000), wrap(handleSessionRoute));
|
|
167
|
+
app.post('/sse', express.json({ limit: '2mb' }), wrap(handleSessionRoute));
|
|
168
|
+
app.delete('/sse', wrap(handleSessionRoute));
|
|
169
|
+
app.post('/messages', express.json({ limit: '2mb' }), wrap(handleSessionRoute));
|
|
170
|
+
app.delete('/messages', wrap(handleSessionRoute));
|
|
171
|
+
app.post('/api/samples', express.json({ limit: '50mb' }), (req, res, next) => {
|
|
172
|
+
try {
|
|
173
|
+
const authHeader = getAuthHeader(req);
|
|
174
|
+
if (!authHeader) {
|
|
175
|
+
res.status(401).send('Unauthorized: Missing credentials.');
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const flows = Array.isArray(req.body) ? req.body : [req.body];
|
|
179
|
+
const purge = req.query.purge === 'true';
|
|
180
|
+
ingestionQueue.enqueue(flows, purge).catch((err) => {
|
|
181
|
+
logger.error('[Samples Ingest Queue Error]', err);
|
|
182
|
+
});
|
|
183
|
+
res.status(202).json({
|
|
184
|
+
status: 'Accepted',
|
|
185
|
+
message: `Ingestion of ${flows.length} flow samples started in the background.${purge ? ' Collection purged first.' : ''}`
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
next(err);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
app.use((err, req, res, _next) => {
|
|
193
|
+
logger.error('[SSE Server Express Error]', err.message || err, err.stack || '');
|
|
194
|
+
if (!res.headersSent) {
|
|
195
|
+
res.status(500).send('Internal Server Error');
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
app.listen(port, () => {
|
|
199
|
+
logger.info(`[elastic.io MCP Server] Running in SSE mode on port ${port}`);
|
|
200
|
+
logger.info(`[SSE Endpoint] GET http://localhost:${port}/sse`);
|
|
201
|
+
logger.info(`[Message Endpoint] POST http://localhost:${port}/messages`);
|
|
202
|
+
logger.info(`[Server Start] SSE mode listening on port ${port}`);
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
const email = config.elasticioApiEmail;
|
|
207
|
+
const apiKey = config.elasticioApiKey;
|
|
208
|
+
if (!email || !apiKey) {
|
|
209
|
+
logger.error('[Error] Missing elastic.io credentials. For local Stdio mode, please set ELASTICIO_API_EMAIL and ELASTICIO_API_KEY in your environment or .env file.');
|
|
210
|
+
logger.error('[Server Error] Missing elastic.io credentials on startup');
|
|
211
|
+
process.exit(1);
|
|
212
|
+
}
|
|
213
|
+
const token = Buffer.from(`${email}:${apiKey}`).toString('base64');
|
|
214
|
+
const authHeader = `Basic ${token}`;
|
|
215
|
+
const client = createElasticioClient(authHeader);
|
|
216
|
+
const server = createMcpServer(client);
|
|
217
|
+
const transport = new StdioServerTransport();
|
|
218
|
+
server.connect(transport).then(() => {
|
|
219
|
+
logger.info('[elastic.io MCP Server] Running in local stdio mode.');
|
|
220
|
+
logger.info('[Server Start] Local stdio mode initialized successfully');
|
|
221
|
+
}).catch((err) => {
|
|
222
|
+
logger.error('[Fatal Error] Failed to start:', err);
|
|
223
|
+
logger.error(`[Server Error] ${err.message || err}`);
|
|
224
|
+
process.exit(1);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AASA,wBAAgB,eAAe,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAE7D"}
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = path.dirname(__filename);
|
|
5
|
+
// src/ → project root
|
|
6
|
+
const PROJECT_ROOT = path.resolve(__dirname, '..');
|
|
7
|
+
export function resolveFromRoot(...segments) {
|
|
8
|
+
return path.resolve(PROJECT_ROOT, ...segments);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,sBAAsB;AACtB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAEnD,MAAM,UAAU,eAAe,CAAC,GAAG,QAAkB;IACnD,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,QAAQ,CAAC,CAAC;AACjD,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { AxiosInstance } from 'axios';
|
|
3
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
4
|
+
/**
|
|
5
|
+
* Instantiates and configures a new MCP Server instance.
|
|
6
|
+
* By passing the scoped AxiosInstance, we achieve absolute credential isolation.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createMcpServer(client: AxiosInstance): McpServer;
|
|
9
|
+
export interface Session {
|
|
10
|
+
server: McpServer;
|
|
11
|
+
transport: StreamableHTTPServerTransport;
|
|
12
|
+
client: AxiosInstance;
|
|
13
|
+
authHeader: string;
|
|
14
|
+
lastActive: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Manage active sessions for SSE Transport (multi-tenant environment)
|
|
18
|
+
*/
|
|
19
|
+
export declare class SessionManager {
|
|
20
|
+
private sessions;
|
|
21
|
+
private cleanupInterval;
|
|
22
|
+
registerSession(sessionId: string, session: Session): void;
|
|
23
|
+
getSession(sessionId: string): Session | undefined;
|
|
24
|
+
removeSession(sessionId: string): void;
|
|
25
|
+
activeSessionCount(): number;
|
|
26
|
+
startReaper(maxIdleMs?: number): void;
|
|
27
|
+
stopReaper(): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYpE,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAOnG;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAwVhE;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,6BAA6B,CAAC;IACzC,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,eAAe,CAA6B;IAEpD,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAInD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIlD,aAAa,CAAC,SAAS,EAAE,MAAM;IAU/B,kBAAkB,IAAI,MAAM;IAI5B,WAAW,CAAC,SAAS,GAAE,MAAuB;IAgB9C,UAAU;CAMX"}
|