mcp4openapi 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +7 -0
- package/README.md +489 -0
- package/dist/composite-executor.d.ts +65 -0
- package/dist/composite-executor.d.ts.map +1 -0
- package/dist/composite-executor.js +147 -0
- package/dist/composite-executor.js.map +1 -0
- package/dist/constants.d.ts +36 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +36 -0
- package/dist/constants.js.map +1 -0
- package/dist/http-transport.d.ts +195 -0
- package/dist/http-transport.d.ts.map +1 -0
- package/dist/http-transport.js +760 -0
- package/dist/http-transport.js.map +1 -0
- package/dist/interceptors.d.ts +74 -0
- package/dist/interceptors.d.ts.map +1 -0
- package/dist/interceptors.js +220 -0
- package/dist/interceptors.js.map +1 -0
- package/dist/logger.d.ts +81 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +264 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp-server.d.ts +110 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +568 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/metrics.d.ts +86 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +229 -0
- package/dist/metrics.js.map +1 -0
- package/dist/openapi-parser.d.ts +35 -0
- package/dist/openapi-parser.d.ts.map +1 -0
- package/dist/openapi-parser.js +160 -0
- package/dist/openapi-parser.js.map +1 -0
- package/dist/profile-loader.d.ts +25 -0
- package/dist/profile-loader.d.ts.map +1 -0
- package/dist/profile-loader.js +134 -0
- package/dist/profile-loader.js.map +1 -0
- package/dist/schema-validator.d.ts +32 -0
- package/dist/schema-validator.d.ts.map +1 -0
- package/dist/schema-validator.js +126 -0
- package/dist/schema-validator.js.map +1 -0
- package/dist/scripts/validate-profile.d.ts +9 -0
- package/dist/scripts/validate-profile.d.ts.map +1 -0
- package/dist/scripts/validate-profile.js +289 -0
- package/dist/scripts/validate-profile.js.map +1 -0
- package/dist/scripts/validate-schema.d.ts +9 -0
- package/dist/scripts/validate-schema.d.ts.map +1 -0
- package/dist/scripts/validate-schema.js +84 -0
- package/dist/scripts/validate-schema.js.map +1 -0
- package/dist/src/composite-executor.d.ts +75 -0
- package/dist/src/composite-executor.d.ts.map +1 -0
- package/dist/src/composite-executor.js +175 -0
- package/dist/src/composite-executor.js.map +1 -0
- package/dist/src/constants.d.ts +36 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +36 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/dag-executor.d.ts +49 -0
- package/dist/src/dag-executor.d.ts.map +1 -0
- package/dist/src/dag-executor.js +138 -0
- package/dist/src/dag-executor.js.map +1 -0
- package/dist/src/errors.d.ts +47 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +99 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/generated-schemas.d.ts +661 -0
- package/dist/src/generated-schemas.d.ts.map +1 -0
- package/dist/src/generated-schemas.js +66 -0
- package/dist/src/generated-schemas.js.map +1 -0
- package/dist/src/http-client-factory.d.ts +62 -0
- package/dist/src/http-client-factory.d.ts.map +1 -0
- package/dist/src/http-client-factory.js +121 -0
- package/dist/src/http-client-factory.js.map +1 -0
- package/dist/src/http-transport.d.ts +194 -0
- package/dist/src/http-transport.d.ts.map +1 -0
- package/dist/src/http-transport.js +851 -0
- package/dist/src/http-transport.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +59 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/interceptors.d.ts +78 -0
- package/dist/src/interceptors.d.ts.map +1 -0
- package/dist/src/interceptors.js +252 -0
- package/dist/src/interceptors.js.map +1 -0
- package/dist/src/jsonrpc-validator.d.ts +27 -0
- package/dist/src/jsonrpc-validator.d.ts.map +1 -0
- package/dist/src/jsonrpc-validator.js +58 -0
- package/dist/src/jsonrpc-validator.js.map +1 -0
- package/dist/src/lib.d.ts +8 -0
- package/dist/src/lib.d.ts.map +1 -0
- package/dist/src/lib.js +7 -0
- package/dist/src/lib.js.map +1 -0
- package/dist/src/logger.d.ts +81 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +264 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/mcp-server.d.ts +117 -0
- package/dist/src/mcp-server.d.ts.map +1 -0
- package/dist/src/mcp-server.js +621 -0
- package/dist/src/mcp-server.js.map +1 -0
- package/dist/src/metrics.d.ts +86 -0
- package/dist/src/metrics.d.ts.map +1 -0
- package/dist/src/metrics.js +229 -0
- package/dist/src/metrics.js.map +1 -0
- package/dist/src/naming-warnings.d.ts +23 -0
- package/dist/src/naming-warnings.d.ts.map +1 -0
- package/dist/src/naming-warnings.js +83 -0
- package/dist/src/naming-warnings.js.map +1 -0
- package/dist/src/naming.d.ts +58 -0
- package/dist/src/naming.d.ts.map +1 -0
- package/dist/src/naming.js +510 -0
- package/dist/src/naming.js.map +1 -0
- package/dist/src/openapi-parser.d.ts +49 -0
- package/dist/src/openapi-parser.d.ts.map +1 -0
- package/dist/src/openapi-parser.js +216 -0
- package/dist/src/openapi-parser.js.map +1 -0
- package/dist/src/profile-loader.d.ts +77 -0
- package/dist/src/profile-loader.d.ts.map +1 -0
- package/dist/src/profile-loader.js +443 -0
- package/dist/src/profile-loader.js.map +1 -0
- package/dist/src/schema-validator.d.ts +30 -0
- package/dist/src/schema-validator.d.ts.map +1 -0
- package/dist/src/schema-validator.js +115 -0
- package/dist/src/schema-validator.js.map +1 -0
- package/dist/src/testing/fixtures.d.ts +268 -0
- package/dist/src/testing/fixtures.d.ts.map +1 -0
- package/dist/src/testing/fixtures.js +210 -0
- package/dist/src/testing/fixtures.js.map +1 -0
- package/dist/src/testing/mock-gitlab-server.d.ts +34 -0
- package/dist/src/testing/mock-gitlab-server.d.ts.map +1 -0
- package/dist/src/testing/mock-gitlab-server.js +351 -0
- package/dist/src/testing/mock-gitlab-server.js.map +1 -0
- package/dist/src/testing/mock-utils.d.ts +41 -0
- package/dist/src/testing/mock-utils.d.ts.map +1 -0
- package/dist/src/testing/mock-utils.js +59 -0
- package/dist/src/testing/mock-utils.js.map +1 -0
- package/dist/src/testing/test-http-utils.d.ts +52 -0
- package/dist/src/testing/test-http-utils.d.ts.map +1 -0
- package/dist/src/testing/test-http-utils.js +109 -0
- package/dist/src/testing/test-http-utils.js.map +1 -0
- package/dist/src/testing/test-types.d.ts +76 -0
- package/dist/src/testing/test-types.d.ts.map +1 -0
- package/dist/src/testing/test-types.js +7 -0
- package/dist/src/testing/test-types.js.map +1 -0
- package/dist/src/tool-generator.d.ts +43 -0
- package/dist/src/tool-generator.d.ts.map +1 -0
- package/dist/src/tool-generator.js +123 -0
- package/dist/src/tool-generator.js.map +1 -0
- package/dist/src/types/http-transport.d.ts +45 -0
- package/dist/src/types/http-transport.d.ts.map +1 -0
- package/dist/src/types/http-transport.js +8 -0
- package/dist/src/types/http-transport.js.map +1 -0
- package/dist/src/types/openapi.d.ts +50 -0
- package/dist/src/types/openapi.d.ts.map +1 -0
- package/dist/src/types/openapi.js +9 -0
- package/dist/src/types/openapi.js.map +1 -0
- package/dist/src/types/profile.d.ts +80 -0
- package/dist/src/types/profile.d.ts.map +1 -0
- package/dist/src/types/profile.js +9 -0
- package/dist/src/types/profile.js.map +1 -0
- package/dist/src/validation-utils.d.ts +15 -0
- package/dist/src/validation-utils.d.ts.map +1 -0
- package/dist/src/validation-utils.js +25 -0
- package/dist/src/validation-utils.js.map +1 -0
- package/dist/testing/fixtures.d.ts +186 -0
- package/dist/testing/fixtures.d.ts.map +1 -0
- package/dist/testing/fixtures.js +135 -0
- package/dist/testing/fixtures.js.map +1 -0
- package/dist/testing/http-integration.test.d.ts +7 -0
- package/dist/testing/http-integration.test.d.ts.map +1 -0
- package/dist/testing/http-integration.test.js +383 -0
- package/dist/testing/http-integration.test.js.map +1 -0
- package/dist/testing/http-multiuser.test.d.ts +10 -0
- package/dist/testing/http-multiuser.test.d.ts.map +1 -0
- package/dist/testing/http-multiuser.test.js +255 -0
- package/dist/testing/http-multiuser.test.js.map +1 -0
- package/dist/testing/integration.test.d.ts +8 -0
- package/dist/testing/integration.test.d.ts.map +1 -0
- package/dist/testing/integration.test.js +247 -0
- package/dist/testing/integration.test.js.map +1 -0
- package/dist/testing/mock-gitlab-server.d.ts +34 -0
- package/dist/testing/mock-gitlab-server.d.ts.map +1 -0
- package/dist/testing/mock-gitlab-server.js +224 -0
- package/dist/testing/mock-gitlab-server.js.map +1 -0
- package/dist/testing/test-types.d.ts +59 -0
- package/dist/testing/test-types.d.ts.map +1 -0
- package/dist/testing/test-types.js +7 -0
- package/dist/testing/test-types.js.map +1 -0
- package/dist/tool-generator.d.ts +43 -0
- package/dist/tool-generator.d.ts.map +1 -0
- package/dist/tool-generator.js +123 -0
- package/dist/tool-generator.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/http-transport.d.ts +39 -0
- package/dist/types/http-transport.d.ts.map +1 -0
- package/dist/types/http-transport.js +8 -0
- package/dist/types/http-transport.js.map +1 -0
- package/dist/types/openapi.d.ts +50 -0
- package/dist/types/openapi.d.ts.map +1 -0
- package/dist/types/openapi.js +9 -0
- package/dist/types/openapi.js.map +1 -0
- package/dist/types/profile.d.ts +76 -0
- package/dist/types/profile.d.ts.map +1 -0
- package/dist/types/profile.js +9 -0
- package/dist/types/profile.js.map +1 -0
- package/package.json +84 -0
- package/profile-schema.json +369 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prometheus Metrics Collector
|
|
3
|
+
*
|
|
4
|
+
* Why: Observability for production deployments
|
|
5
|
+
*
|
|
6
|
+
* Tracks:
|
|
7
|
+
* - HTTP requests (status, method, path)
|
|
8
|
+
* - Session lifecycle (active, created, destroyed)
|
|
9
|
+
* - MCP operations (tool calls, duration, errors)
|
|
10
|
+
* - API calls to backend (operation, status, duration)
|
|
11
|
+
*/
|
|
12
|
+
import { Registry } from 'prom-client';
|
|
13
|
+
export interface MetricsCollectorConfig {
|
|
14
|
+
enabled: boolean;
|
|
15
|
+
prefix?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class MetricsCollector {
|
|
18
|
+
private registry;
|
|
19
|
+
private enabled;
|
|
20
|
+
private httpRequestsTotal;
|
|
21
|
+
private httpRequestDuration;
|
|
22
|
+
private sessionsActive;
|
|
23
|
+
private sessionsCreatedTotal;
|
|
24
|
+
private sessionsDestroyedTotal;
|
|
25
|
+
private mcpToolCallsTotal;
|
|
26
|
+
private mcpToolCallDuration;
|
|
27
|
+
private mcpToolCallErrors;
|
|
28
|
+
private apiCallsTotal;
|
|
29
|
+
private apiCallDuration;
|
|
30
|
+
private apiCallErrors;
|
|
31
|
+
constructor(config: MetricsCollectorConfig);
|
|
32
|
+
/**
|
|
33
|
+
* Record HTTP request
|
|
34
|
+
*/
|
|
35
|
+
recordHttpRequest(method: string, path: string, status: number, durationSeconds: number): void;
|
|
36
|
+
/**
|
|
37
|
+
* Record session created
|
|
38
|
+
*/
|
|
39
|
+
recordSessionCreated(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Record session destroyed
|
|
42
|
+
*/
|
|
43
|
+
recordSessionDestroyed(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Record MCP tool call
|
|
46
|
+
*/
|
|
47
|
+
recordToolCall(tool: string, status: 'success' | 'error', durationSeconds: number): void;
|
|
48
|
+
/**
|
|
49
|
+
* Record MCP tool call error
|
|
50
|
+
*/
|
|
51
|
+
recordToolCallError(tool: string, errorType: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Record API call to backend
|
|
54
|
+
*/
|
|
55
|
+
recordApiCall(operation: string, status: number, durationSeconds: number): void;
|
|
56
|
+
/**
|
|
57
|
+
* Record API call error
|
|
58
|
+
*/
|
|
59
|
+
recordApiCallError(operation: string, errorType: string): void;
|
|
60
|
+
/**
|
|
61
|
+
* Get metrics in Prometheus format
|
|
62
|
+
*/
|
|
63
|
+
getMetrics(): Promise<string>;
|
|
64
|
+
/**
|
|
65
|
+
* Get registry (for testing)
|
|
66
|
+
*/
|
|
67
|
+
getRegistry(): Registry;
|
|
68
|
+
/**
|
|
69
|
+
* Normalize path for metrics (remove dynamic segments)
|
|
70
|
+
*
|
|
71
|
+
* Why: Avoid high cardinality in metrics labels
|
|
72
|
+
*
|
|
73
|
+
* Examples:
|
|
74
|
+
* - /mcp?sessionId=abc123 -> /mcp
|
|
75
|
+
* - /metrics -> /metrics
|
|
76
|
+
* - /health -> /health
|
|
77
|
+
*/
|
|
78
|
+
private normalizePath;
|
|
79
|
+
/**
|
|
80
|
+
* Get status label (2xx, 4xx, 5xx)
|
|
81
|
+
*
|
|
82
|
+
* Why: Group similar statuses to reduce cardinality
|
|
83
|
+
*/
|
|
84
|
+
private getStatusLabel;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAA6B,MAAM,aAAa,CAAC;AAElE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,OAAO,CAAU;IAGzB,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,mBAAmB,CAAY;IAGvC,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,oBAAoB,CAAU;IACtC,OAAO,CAAC,sBAAsB,CAAU;IAGxC,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,mBAAmB,CAAY;IACvC,OAAO,CAAC,iBAAiB,CAAU;IAGnC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,eAAe,CAAY;IACnC,OAAO,CAAC,aAAa,CAAU;gBAEnB,MAAM,EAAE,sBAAsB;IAwF1C;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IAmB9F;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAM5B;;OAEG;IACH,sBAAsB,IAAI,IAAI;IAM9B;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IAOxF;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAK1D;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IAS/E;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAK9D;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAOnC;;OAEG;IACH,WAAW,IAAI,QAAQ;IAIvB;;;;;;;;;OASG;IACH,OAAO,CAAC,aAAa;IAcrB;;;;OAIG;IACH,OAAO,CAAC,cAAc;CAOvB"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prometheus Metrics Collector
|
|
3
|
+
*
|
|
4
|
+
* Why: Observability for production deployments
|
|
5
|
+
*
|
|
6
|
+
* Tracks:
|
|
7
|
+
* - HTTP requests (status, method, path)
|
|
8
|
+
* - Session lifecycle (active, created, destroyed)
|
|
9
|
+
* - MCP operations (tool calls, duration, errors)
|
|
10
|
+
* - API calls to backend (operation, status, duration)
|
|
11
|
+
*/
|
|
12
|
+
import { Registry, Counter, Gauge, Histogram } from 'prom-client';
|
|
13
|
+
export class MetricsCollector {
|
|
14
|
+
registry;
|
|
15
|
+
enabled;
|
|
16
|
+
// HTTP metrics
|
|
17
|
+
httpRequestsTotal;
|
|
18
|
+
httpRequestDuration;
|
|
19
|
+
// Session metrics
|
|
20
|
+
sessionsActive;
|
|
21
|
+
sessionsCreatedTotal;
|
|
22
|
+
sessionsDestroyedTotal;
|
|
23
|
+
// MCP operation metrics
|
|
24
|
+
mcpToolCallsTotal;
|
|
25
|
+
mcpToolCallDuration;
|
|
26
|
+
mcpToolCallErrors;
|
|
27
|
+
// API metrics (calls to backend API)
|
|
28
|
+
apiCallsTotal;
|
|
29
|
+
apiCallDuration;
|
|
30
|
+
apiCallErrors;
|
|
31
|
+
constructor(config) {
|
|
32
|
+
this.enabled = config.enabled;
|
|
33
|
+
this.registry = new Registry();
|
|
34
|
+
const prefix = config.prefix || 'mcp_';
|
|
35
|
+
// HTTP metrics
|
|
36
|
+
this.httpRequestsTotal = new Counter({
|
|
37
|
+
name: `${prefix}http_requests_total`,
|
|
38
|
+
help: 'Total number of HTTP requests',
|
|
39
|
+
labelNames: ['method', 'path', 'status'],
|
|
40
|
+
registers: [this.registry],
|
|
41
|
+
});
|
|
42
|
+
this.httpRequestDuration = new Histogram({
|
|
43
|
+
name: `${prefix}http_request_duration_seconds`,
|
|
44
|
+
help: 'HTTP request duration in seconds',
|
|
45
|
+
labelNames: ['method', 'path', 'status'],
|
|
46
|
+
buckets: [0.001, 0.01, 0.05, 0.1, 0.5, 1, 2, 5],
|
|
47
|
+
registers: [this.registry],
|
|
48
|
+
});
|
|
49
|
+
// Session metrics
|
|
50
|
+
this.sessionsActive = new Gauge({
|
|
51
|
+
name: `${prefix}sessions_active`,
|
|
52
|
+
help: 'Number of active sessions',
|
|
53
|
+
registers: [this.registry],
|
|
54
|
+
});
|
|
55
|
+
this.sessionsCreatedTotal = new Counter({
|
|
56
|
+
name: `${prefix}sessions_created_total`,
|
|
57
|
+
help: 'Total number of sessions created',
|
|
58
|
+
registers: [this.registry],
|
|
59
|
+
});
|
|
60
|
+
this.sessionsDestroyedTotal = new Counter({
|
|
61
|
+
name: `${prefix}sessions_destroyed_total`,
|
|
62
|
+
help: 'Total number of sessions destroyed',
|
|
63
|
+
registers: [this.registry],
|
|
64
|
+
});
|
|
65
|
+
// MCP operation metrics
|
|
66
|
+
this.mcpToolCallsTotal = new Counter({
|
|
67
|
+
name: `${prefix}tool_calls_total`,
|
|
68
|
+
help: 'Total number of MCP tool calls',
|
|
69
|
+
labelNames: ['tool', 'status'],
|
|
70
|
+
registers: [this.registry],
|
|
71
|
+
});
|
|
72
|
+
this.mcpToolCallDuration = new Histogram({
|
|
73
|
+
name: `${prefix}tool_call_duration_seconds`,
|
|
74
|
+
help: 'MCP tool call duration in seconds',
|
|
75
|
+
labelNames: ['tool', 'status'],
|
|
76
|
+
buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5, 10, 30],
|
|
77
|
+
registers: [this.registry],
|
|
78
|
+
});
|
|
79
|
+
this.mcpToolCallErrors = new Counter({
|
|
80
|
+
name: `${prefix}tool_call_errors_total`,
|
|
81
|
+
help: 'Total number of MCP tool call errors',
|
|
82
|
+
labelNames: ['tool', 'error_type'],
|
|
83
|
+
registers: [this.registry],
|
|
84
|
+
});
|
|
85
|
+
// API metrics
|
|
86
|
+
this.apiCallsTotal = new Counter({
|
|
87
|
+
name: `${prefix}api_calls_total`,
|
|
88
|
+
help: 'Total number of API calls to backend',
|
|
89
|
+
labelNames: ['operation', 'status'],
|
|
90
|
+
registers: [this.registry],
|
|
91
|
+
});
|
|
92
|
+
this.apiCallDuration = new Histogram({
|
|
93
|
+
name: `${prefix}api_call_duration_seconds`,
|
|
94
|
+
help: 'API call duration in seconds',
|
|
95
|
+
labelNames: ['operation', 'status'],
|
|
96
|
+
buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5, 10],
|
|
97
|
+
registers: [this.registry],
|
|
98
|
+
});
|
|
99
|
+
this.apiCallErrors = new Counter({
|
|
100
|
+
name: `${prefix}api_call_errors_total`,
|
|
101
|
+
help: 'Total number of API call errors',
|
|
102
|
+
labelNames: ['operation', 'error_type'],
|
|
103
|
+
registers: [this.registry],
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Record HTTP request
|
|
108
|
+
*/
|
|
109
|
+
recordHttpRequest(method, path, status, durationSeconds) {
|
|
110
|
+
if (!this.enabled)
|
|
111
|
+
return;
|
|
112
|
+
this.httpRequestsTotal.inc({
|
|
113
|
+
method,
|
|
114
|
+
path: this.normalizePath(path),
|
|
115
|
+
status: status.toString(),
|
|
116
|
+
});
|
|
117
|
+
this.httpRequestDuration.observe({
|
|
118
|
+
method,
|
|
119
|
+
path: this.normalizePath(path),
|
|
120
|
+
status: status.toString(),
|
|
121
|
+
}, durationSeconds);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Record session created
|
|
125
|
+
*/
|
|
126
|
+
recordSessionCreated() {
|
|
127
|
+
if (!this.enabled)
|
|
128
|
+
return;
|
|
129
|
+
this.sessionsCreatedTotal.inc();
|
|
130
|
+
this.sessionsActive.inc();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Record session destroyed
|
|
134
|
+
*/
|
|
135
|
+
recordSessionDestroyed() {
|
|
136
|
+
if (!this.enabled)
|
|
137
|
+
return;
|
|
138
|
+
this.sessionsDestroyedTotal.inc();
|
|
139
|
+
this.sessionsActive.dec();
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Record MCP tool call
|
|
143
|
+
*/
|
|
144
|
+
recordToolCall(tool, status, durationSeconds) {
|
|
145
|
+
if (!this.enabled)
|
|
146
|
+
return;
|
|
147
|
+
this.mcpToolCallsTotal.inc({ tool, status });
|
|
148
|
+
this.mcpToolCallDuration.observe({ tool, status }, durationSeconds);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Record MCP tool call error
|
|
152
|
+
*/
|
|
153
|
+
recordToolCallError(tool, errorType) {
|
|
154
|
+
if (!this.enabled)
|
|
155
|
+
return;
|
|
156
|
+
this.mcpToolCallErrors.inc({ tool, error_type: errorType });
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Record API call to backend
|
|
160
|
+
*/
|
|
161
|
+
recordApiCall(operation, status, durationSeconds) {
|
|
162
|
+
if (!this.enabled)
|
|
163
|
+
return;
|
|
164
|
+
const statusLabel = this.getStatusLabel(status);
|
|
165
|
+
this.apiCallsTotal.inc({ operation, status: statusLabel });
|
|
166
|
+
this.apiCallDuration.observe({ operation, status: statusLabel }, durationSeconds);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Record API call error
|
|
170
|
+
*/
|
|
171
|
+
recordApiCallError(operation, errorType) {
|
|
172
|
+
if (!this.enabled)
|
|
173
|
+
return;
|
|
174
|
+
this.apiCallErrors.inc({ operation, error_type: errorType });
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get metrics in Prometheus format
|
|
178
|
+
*/
|
|
179
|
+
async getMetrics() {
|
|
180
|
+
if (!this.enabled) {
|
|
181
|
+
return '# Metrics disabled\n';
|
|
182
|
+
}
|
|
183
|
+
return this.registry.metrics();
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get registry (for testing)
|
|
187
|
+
*/
|
|
188
|
+
getRegistry() {
|
|
189
|
+
return this.registry;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Normalize path for metrics (remove dynamic segments)
|
|
193
|
+
*
|
|
194
|
+
* Why: Avoid high cardinality in metrics labels
|
|
195
|
+
*
|
|
196
|
+
* Examples:
|
|
197
|
+
* - /mcp?sessionId=abc123 -> /mcp
|
|
198
|
+
* - /metrics -> /metrics
|
|
199
|
+
* - /health -> /health
|
|
200
|
+
*/
|
|
201
|
+
normalizePath(path) {
|
|
202
|
+
// Remove query string
|
|
203
|
+
const pathWithoutQuery = path.split('?')[0];
|
|
204
|
+
// Known paths
|
|
205
|
+
if (pathWithoutQuery === '/mcp' ||
|
|
206
|
+
pathWithoutQuery === '/metrics' ||
|
|
207
|
+
pathWithoutQuery === '/health') {
|
|
208
|
+
return pathWithoutQuery;
|
|
209
|
+
}
|
|
210
|
+
return pathWithoutQuery;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get status label (2xx, 4xx, 5xx)
|
|
214
|
+
*
|
|
215
|
+
* Why: Group similar statuses to reduce cardinality
|
|
216
|
+
*/
|
|
217
|
+
getStatusLabel(status) {
|
|
218
|
+
if (status >= 200 && status < 300)
|
|
219
|
+
return '2xx';
|
|
220
|
+
if (status >= 300 && status < 400)
|
|
221
|
+
return '3xx';
|
|
222
|
+
if (status >= 400 && status < 500)
|
|
223
|
+
return '4xx';
|
|
224
|
+
if (status >= 500 && status < 600)
|
|
225
|
+
return '5xx';
|
|
226
|
+
return 'unknown';
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool name length warning and recommendations
|
|
3
|
+
*
|
|
4
|
+
* Why: Help users understand name length issues and choose appropriate strategy
|
|
5
|
+
*/
|
|
6
|
+
import type { Logger } from './logger.js';
|
|
7
|
+
import { type OperationForNaming } from './naming.js';
|
|
8
|
+
export interface NameWarningOptions {
|
|
9
|
+
maxLength: number;
|
|
10
|
+
similarTopN: number;
|
|
11
|
+
similarityThreshold: number;
|
|
12
|
+
minParts?: number;
|
|
13
|
+
minLength?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Collect operations that exceed name length limit
|
|
17
|
+
*/
|
|
18
|
+
export declare function collectOffenders(operations: OperationForNaming[], maxLength: number): OperationForNaming[];
|
|
19
|
+
/**
|
|
20
|
+
* Generate warnings and suggestions for long tool names
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateNameWarnings(operations: OperationForNaming[], options: NameWarningOptions, logger: Logger): void;
|
|
23
|
+
//# sourceMappingURL=naming-warnings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming-warnings.d.ts","sourceRoot":"","sources":["../../src/naming-warnings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,kBAAkB,EAAE,EAChC,SAAS,EAAE,MAAM,GAChB,kBAAkB,EAAE,CAEtB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,kBAAkB,EAAE,EAChC,OAAO,EAAE,kBAAkB,EAC3B,MAAM,EAAE,MAAM,GACb,IAAI,CAiFN"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool name length warning and recommendations
|
|
3
|
+
*
|
|
4
|
+
* Why: Help users understand name length issues and choose appropriate strategy
|
|
5
|
+
*/
|
|
6
|
+
import { shortenToolName, pickMostSimilarPairs, detectCollisions, NamingStrategy } from './naming.js';
|
|
7
|
+
/**
|
|
8
|
+
* Collect operations that exceed name length limit
|
|
9
|
+
*/
|
|
10
|
+
export function collectOffenders(operations, maxLength) {
|
|
11
|
+
return operations.filter(op => op.operationId.length > maxLength);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generate warnings and suggestions for long tool names
|
|
15
|
+
*/
|
|
16
|
+
export function generateNameWarnings(operations, options, logger) {
|
|
17
|
+
const { maxLength, similarTopN, similarityThreshold } = options;
|
|
18
|
+
const offenders = collectOffenders(operations, maxLength);
|
|
19
|
+
if (offenders.length === 0) {
|
|
20
|
+
return; // No warnings needed
|
|
21
|
+
}
|
|
22
|
+
logger.warn(`\n${'='.repeat(80)}`);
|
|
23
|
+
logger.warn(`⚠️ Tool Name Length Warning`);
|
|
24
|
+
logger.warn(`${'='.repeat(80)}\n`);
|
|
25
|
+
logger.warn(`Detected ${offenders.length} tool names exceeding ${maxLength} characters.`);
|
|
26
|
+
logger.warn(`Long names may be truncated or cause issues in some MCP clients.\n`);
|
|
27
|
+
// Pick most similar pairs to show as examples
|
|
28
|
+
const similarPairs = pickMostSimilarPairs(offenders, similarTopN, similarityThreshold);
|
|
29
|
+
if (similarPairs.length > 0) {
|
|
30
|
+
logger.warn(`Showing ${similarPairs.length} most similar name pairs with shortening suggestions:\n`);
|
|
31
|
+
for (let i = 0; i < similarPairs.length; i++) {
|
|
32
|
+
const pair = similarPairs[i];
|
|
33
|
+
logger.warn(`${'-'.repeat(80)}`);
|
|
34
|
+
logger.warn(`Example ${i + 1}/${similarPairs.length}:`);
|
|
35
|
+
logger.warn(` Operation A: ${pair.opA.operationId} (${pair.opA.operationId.length} chars)`);
|
|
36
|
+
logger.warn(` Operation B: ${pair.opB.operationId} (${pair.opB.operationId.length} chars)`);
|
|
37
|
+
logger.warn(` Similarity: ${(pair.similarity * 100).toFixed(1)}%\n`);
|
|
38
|
+
// Show all strategies
|
|
39
|
+
const strategies = [NamingStrategy.Balanced, NamingStrategy.Iterative, NamingStrategy.Hash];
|
|
40
|
+
for (const strategy of strategies) {
|
|
41
|
+
const resultA = shortenToolName(pair.opA, strategy, maxLength, operations, {
|
|
42
|
+
minParts: options.minParts,
|
|
43
|
+
minLength: options.minLength,
|
|
44
|
+
});
|
|
45
|
+
const resultB = shortenToolName(pair.opB, strategy, maxLength, operations, {
|
|
46
|
+
minParts: options.minParts,
|
|
47
|
+
minLength: options.minLength,
|
|
48
|
+
});
|
|
49
|
+
const collision = resultA.name === resultB.name ? '⚠️ COLLISION' : '✓ No collision';
|
|
50
|
+
logger.warn(` Strategy: ${strategy}`);
|
|
51
|
+
logger.warn(` A: ${resultA.name} (${resultA.name.length} chars)`);
|
|
52
|
+
logger.warn(` B: ${resultB.name} (${resultB.name.length} chars)`);
|
|
53
|
+
logger.warn(` ${collision}\n`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Show collision statistics for each strategy
|
|
58
|
+
logger.warn(`${'-'.repeat(80)}`);
|
|
59
|
+
logger.warn(`Collision Analysis:\n`);
|
|
60
|
+
const strategies = [NamingStrategy.Balanced, NamingStrategy.Iterative, NamingStrategy.Hash];
|
|
61
|
+
for (const strategy of strategies) {
|
|
62
|
+
const collisions = detectCollisions(offenders, strategy, maxLength, {
|
|
63
|
+
minParts: options.minParts,
|
|
64
|
+
minLength: options.minLength,
|
|
65
|
+
});
|
|
66
|
+
const collisionCount = Array.from(collisions.values()).reduce((sum, ops) => sum + ops.length - 1, 0);
|
|
67
|
+
logger.warn(` ${strategy}: ${collisionCount} collision(s) among ${offenders.length} names`);
|
|
68
|
+
}
|
|
69
|
+
logger.warn(`\n${'-'.repeat(80)}`);
|
|
70
|
+
logger.warn(`How to Fix:\n`);
|
|
71
|
+
logger.warn(` 1. Choose a shortening strategy based on collision analysis above`);
|
|
72
|
+
logger.warn(` 2. Set environment variables:\n`);
|
|
73
|
+
logger.warn(` export MCP_TOOLNAME_STRATEGY=balanced # or: iterative, hash, auto`);
|
|
74
|
+
logger.warn(` export MCP_TOOLNAME_WARN_ONLY=false # Apply shortening`);
|
|
75
|
+
logger.warn(` export MCP_TOOLNAME_MAX=45 # Optional: adjust limit`);
|
|
76
|
+
logger.warn(` export MCP_TOOLNAME_MIN_PARTS=3 # Optional: min parts (for balanced)`);
|
|
77
|
+
logger.warn(` export MCP_TOOLNAME_MIN_LENGTH=20 # Optional: min length (for balanced)\n`);
|
|
78
|
+
logger.warn(` Example for balanced strategy:`);
|
|
79
|
+
logger.warn(` export MCP_TOOLNAME_STRATEGY=balanced MCP_TOOLNAME_WARN_ONLY=false\n`);
|
|
80
|
+
logger.warn(`${'-'.repeat(80)}`);
|
|
81
|
+
logger.warn(`Summary: ${offenders.length} names need shortening. Choose strategy and restart.\n`);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=naming-warnings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming-warnings.js","sourceRoot":"","sources":["../../src/naming-warnings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool name shortening strategies
|
|
3
|
+
*
|
|
4
|
+
* Why: MCP tool names combined with server name must stay under limits.
|
|
5
|
+
* Different strategies offer trade-offs between readability and compactness.
|
|
6
|
+
*/
|
|
7
|
+
export declare enum NamingStrategy {
|
|
8
|
+
None = "none",
|
|
9
|
+
Balanced = "balanced",
|
|
10
|
+
Iterative = "iterative",
|
|
11
|
+
Hash = "hash",
|
|
12
|
+
Auto = "auto"
|
|
13
|
+
}
|
|
14
|
+
export interface OperationForNaming {
|
|
15
|
+
operationId: string;
|
|
16
|
+
method: string;
|
|
17
|
+
path: string;
|
|
18
|
+
tags?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface ShortenResult {
|
|
21
|
+
name: string;
|
|
22
|
+
truncated: boolean;
|
|
23
|
+
strategy: NamingStrategy;
|
|
24
|
+
originalLength: number;
|
|
25
|
+
partsUsed?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface SimilarPair {
|
|
28
|
+
opA: OperationForNaming;
|
|
29
|
+
opB: OperationForNaming;
|
|
30
|
+
similarity: number;
|
|
31
|
+
}
|
|
32
|
+
export interface ShorteningOptions {
|
|
33
|
+
maxLength: number;
|
|
34
|
+
minParts?: number;
|
|
35
|
+
minLength?: number;
|
|
36
|
+
allOperations?: OperationForNaming[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Shorten tool name using specified strategy
|
|
40
|
+
*/
|
|
41
|
+
export declare function shortenToolName(op: OperationForNaming, strategy: NamingStrategy, maxLength: number, allOperations?: OperationForNaming[], options?: Partial<ShorteningOptions>): ShortenResult;
|
|
42
|
+
/**
|
|
43
|
+
* Generate stable short hash from string
|
|
44
|
+
*/
|
|
45
|
+
export declare function stableHash(str: string, length?: number): string;
|
|
46
|
+
/**
|
|
47
|
+
* Calculate Levenshtein distance between two strings
|
|
48
|
+
*/
|
|
49
|
+
export declare function levenshteinDistance(a: string, b: string): number;
|
|
50
|
+
/**
|
|
51
|
+
* Pick most similar pairs of operations
|
|
52
|
+
*/
|
|
53
|
+
export declare function pickMostSimilarPairs(operations: OperationForNaming[], topN: number, threshold?: number): SimilarPair[];
|
|
54
|
+
/**
|
|
55
|
+
* Detect potential collisions when shortening multiple operations
|
|
56
|
+
*/
|
|
57
|
+
export declare function detectCollisions(operations: OperationForNaming[], strategy: NamingStrategy, maxLength: number, options?: Partial<ShorteningOptions>): Map<string, OperationForNaming[]>;
|
|
58
|
+
//# sourceMappingURL=naming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/naming.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAY,cAAc;IACxB,IAAI,SAAS;IACb,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,IAAI,SAAS;IACb,IAAI,SAAS;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,kBAAkB,CAAC;IACxB,GAAG,EAAE,kBAAkB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACtC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,kBAAkB,EACtB,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,kBAAkB,EAAE,EACpC,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACnC,aAAa,CAoDf;AAiYD;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM,CAUlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAoBhE;AAaD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,kBAAkB,EAAE,EAChC,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAa,GACvB,WAAW,EAAE,CA4Df;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,kBAAkB,EAAE,EAChC,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACnC,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAmBnC"}
|