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.
Files changed (209) hide show
  1. package/LICENSE.md +7 -0
  2. package/README.md +489 -0
  3. package/dist/composite-executor.d.ts +65 -0
  4. package/dist/composite-executor.d.ts.map +1 -0
  5. package/dist/composite-executor.js +147 -0
  6. package/dist/composite-executor.js.map +1 -0
  7. package/dist/constants.d.ts +36 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/constants.js +36 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/http-transport.d.ts +195 -0
  12. package/dist/http-transport.d.ts.map +1 -0
  13. package/dist/http-transport.js +760 -0
  14. package/dist/http-transport.js.map +1 -0
  15. package/dist/interceptors.d.ts +74 -0
  16. package/dist/interceptors.d.ts.map +1 -0
  17. package/dist/interceptors.js +220 -0
  18. package/dist/interceptors.js.map +1 -0
  19. package/dist/logger.d.ts +81 -0
  20. package/dist/logger.d.ts.map +1 -0
  21. package/dist/logger.js +264 -0
  22. package/dist/logger.js.map +1 -0
  23. package/dist/mcp-server.d.ts +110 -0
  24. package/dist/mcp-server.d.ts.map +1 -0
  25. package/dist/mcp-server.js +568 -0
  26. package/dist/mcp-server.js.map +1 -0
  27. package/dist/metrics.d.ts +86 -0
  28. package/dist/metrics.d.ts.map +1 -0
  29. package/dist/metrics.js +229 -0
  30. package/dist/metrics.js.map +1 -0
  31. package/dist/openapi-parser.d.ts +35 -0
  32. package/dist/openapi-parser.d.ts.map +1 -0
  33. package/dist/openapi-parser.js +160 -0
  34. package/dist/openapi-parser.js.map +1 -0
  35. package/dist/profile-loader.d.ts +25 -0
  36. package/dist/profile-loader.d.ts.map +1 -0
  37. package/dist/profile-loader.js +134 -0
  38. package/dist/profile-loader.js.map +1 -0
  39. package/dist/schema-validator.d.ts +32 -0
  40. package/dist/schema-validator.d.ts.map +1 -0
  41. package/dist/schema-validator.js +126 -0
  42. package/dist/schema-validator.js.map +1 -0
  43. package/dist/scripts/validate-profile.d.ts +9 -0
  44. package/dist/scripts/validate-profile.d.ts.map +1 -0
  45. package/dist/scripts/validate-profile.js +289 -0
  46. package/dist/scripts/validate-profile.js.map +1 -0
  47. package/dist/scripts/validate-schema.d.ts +9 -0
  48. package/dist/scripts/validate-schema.d.ts.map +1 -0
  49. package/dist/scripts/validate-schema.js +84 -0
  50. package/dist/scripts/validate-schema.js.map +1 -0
  51. package/dist/src/composite-executor.d.ts +75 -0
  52. package/dist/src/composite-executor.d.ts.map +1 -0
  53. package/dist/src/composite-executor.js +175 -0
  54. package/dist/src/composite-executor.js.map +1 -0
  55. package/dist/src/constants.d.ts +36 -0
  56. package/dist/src/constants.d.ts.map +1 -0
  57. package/dist/src/constants.js +36 -0
  58. package/dist/src/constants.js.map +1 -0
  59. package/dist/src/dag-executor.d.ts +49 -0
  60. package/dist/src/dag-executor.d.ts.map +1 -0
  61. package/dist/src/dag-executor.js +138 -0
  62. package/dist/src/dag-executor.js.map +1 -0
  63. package/dist/src/errors.d.ts +47 -0
  64. package/dist/src/errors.d.ts.map +1 -0
  65. package/dist/src/errors.js +99 -0
  66. package/dist/src/errors.js.map +1 -0
  67. package/dist/src/generated-schemas.d.ts +661 -0
  68. package/dist/src/generated-schemas.d.ts.map +1 -0
  69. package/dist/src/generated-schemas.js +66 -0
  70. package/dist/src/generated-schemas.js.map +1 -0
  71. package/dist/src/http-client-factory.d.ts +62 -0
  72. package/dist/src/http-client-factory.d.ts.map +1 -0
  73. package/dist/src/http-client-factory.js +121 -0
  74. package/dist/src/http-client-factory.js.map +1 -0
  75. package/dist/src/http-transport.d.ts +194 -0
  76. package/dist/src/http-transport.d.ts.map +1 -0
  77. package/dist/src/http-transport.js +851 -0
  78. package/dist/src/http-transport.js.map +1 -0
  79. package/dist/src/index.d.ts +8 -0
  80. package/dist/src/index.d.ts.map +1 -0
  81. package/dist/src/index.js +59 -0
  82. package/dist/src/index.js.map +1 -0
  83. package/dist/src/interceptors.d.ts +78 -0
  84. package/dist/src/interceptors.d.ts.map +1 -0
  85. package/dist/src/interceptors.js +252 -0
  86. package/dist/src/interceptors.js.map +1 -0
  87. package/dist/src/jsonrpc-validator.d.ts +27 -0
  88. package/dist/src/jsonrpc-validator.d.ts.map +1 -0
  89. package/dist/src/jsonrpc-validator.js +58 -0
  90. package/dist/src/jsonrpc-validator.js.map +1 -0
  91. package/dist/src/lib.d.ts +8 -0
  92. package/dist/src/lib.d.ts.map +1 -0
  93. package/dist/src/lib.js +7 -0
  94. package/dist/src/lib.js.map +1 -0
  95. package/dist/src/logger.d.ts +81 -0
  96. package/dist/src/logger.d.ts.map +1 -0
  97. package/dist/src/logger.js +264 -0
  98. package/dist/src/logger.js.map +1 -0
  99. package/dist/src/mcp-server.d.ts +117 -0
  100. package/dist/src/mcp-server.d.ts.map +1 -0
  101. package/dist/src/mcp-server.js +621 -0
  102. package/dist/src/mcp-server.js.map +1 -0
  103. package/dist/src/metrics.d.ts +86 -0
  104. package/dist/src/metrics.d.ts.map +1 -0
  105. package/dist/src/metrics.js +229 -0
  106. package/dist/src/metrics.js.map +1 -0
  107. package/dist/src/naming-warnings.d.ts +23 -0
  108. package/dist/src/naming-warnings.d.ts.map +1 -0
  109. package/dist/src/naming-warnings.js +83 -0
  110. package/dist/src/naming-warnings.js.map +1 -0
  111. package/dist/src/naming.d.ts +58 -0
  112. package/dist/src/naming.d.ts.map +1 -0
  113. package/dist/src/naming.js +510 -0
  114. package/dist/src/naming.js.map +1 -0
  115. package/dist/src/openapi-parser.d.ts +49 -0
  116. package/dist/src/openapi-parser.d.ts.map +1 -0
  117. package/dist/src/openapi-parser.js +216 -0
  118. package/dist/src/openapi-parser.js.map +1 -0
  119. package/dist/src/profile-loader.d.ts +77 -0
  120. package/dist/src/profile-loader.d.ts.map +1 -0
  121. package/dist/src/profile-loader.js +443 -0
  122. package/dist/src/profile-loader.js.map +1 -0
  123. package/dist/src/schema-validator.d.ts +30 -0
  124. package/dist/src/schema-validator.d.ts.map +1 -0
  125. package/dist/src/schema-validator.js +115 -0
  126. package/dist/src/schema-validator.js.map +1 -0
  127. package/dist/src/testing/fixtures.d.ts +268 -0
  128. package/dist/src/testing/fixtures.d.ts.map +1 -0
  129. package/dist/src/testing/fixtures.js +210 -0
  130. package/dist/src/testing/fixtures.js.map +1 -0
  131. package/dist/src/testing/mock-gitlab-server.d.ts +34 -0
  132. package/dist/src/testing/mock-gitlab-server.d.ts.map +1 -0
  133. package/dist/src/testing/mock-gitlab-server.js +351 -0
  134. package/dist/src/testing/mock-gitlab-server.js.map +1 -0
  135. package/dist/src/testing/mock-utils.d.ts +41 -0
  136. package/dist/src/testing/mock-utils.d.ts.map +1 -0
  137. package/dist/src/testing/mock-utils.js +59 -0
  138. package/dist/src/testing/mock-utils.js.map +1 -0
  139. package/dist/src/testing/test-http-utils.d.ts +52 -0
  140. package/dist/src/testing/test-http-utils.d.ts.map +1 -0
  141. package/dist/src/testing/test-http-utils.js +109 -0
  142. package/dist/src/testing/test-http-utils.js.map +1 -0
  143. package/dist/src/testing/test-types.d.ts +76 -0
  144. package/dist/src/testing/test-types.d.ts.map +1 -0
  145. package/dist/src/testing/test-types.js +7 -0
  146. package/dist/src/testing/test-types.js.map +1 -0
  147. package/dist/src/tool-generator.d.ts +43 -0
  148. package/dist/src/tool-generator.d.ts.map +1 -0
  149. package/dist/src/tool-generator.js +123 -0
  150. package/dist/src/tool-generator.js.map +1 -0
  151. package/dist/src/types/http-transport.d.ts +45 -0
  152. package/dist/src/types/http-transport.d.ts.map +1 -0
  153. package/dist/src/types/http-transport.js +8 -0
  154. package/dist/src/types/http-transport.js.map +1 -0
  155. package/dist/src/types/openapi.d.ts +50 -0
  156. package/dist/src/types/openapi.d.ts.map +1 -0
  157. package/dist/src/types/openapi.js +9 -0
  158. package/dist/src/types/openapi.js.map +1 -0
  159. package/dist/src/types/profile.d.ts +80 -0
  160. package/dist/src/types/profile.d.ts.map +1 -0
  161. package/dist/src/types/profile.js +9 -0
  162. package/dist/src/types/profile.js.map +1 -0
  163. package/dist/src/validation-utils.d.ts +15 -0
  164. package/dist/src/validation-utils.d.ts.map +1 -0
  165. package/dist/src/validation-utils.js +25 -0
  166. package/dist/src/validation-utils.js.map +1 -0
  167. package/dist/testing/fixtures.d.ts +186 -0
  168. package/dist/testing/fixtures.d.ts.map +1 -0
  169. package/dist/testing/fixtures.js +135 -0
  170. package/dist/testing/fixtures.js.map +1 -0
  171. package/dist/testing/http-integration.test.d.ts +7 -0
  172. package/dist/testing/http-integration.test.d.ts.map +1 -0
  173. package/dist/testing/http-integration.test.js +383 -0
  174. package/dist/testing/http-integration.test.js.map +1 -0
  175. package/dist/testing/http-multiuser.test.d.ts +10 -0
  176. package/dist/testing/http-multiuser.test.d.ts.map +1 -0
  177. package/dist/testing/http-multiuser.test.js +255 -0
  178. package/dist/testing/http-multiuser.test.js.map +1 -0
  179. package/dist/testing/integration.test.d.ts +8 -0
  180. package/dist/testing/integration.test.d.ts.map +1 -0
  181. package/dist/testing/integration.test.js +247 -0
  182. package/dist/testing/integration.test.js.map +1 -0
  183. package/dist/testing/mock-gitlab-server.d.ts +34 -0
  184. package/dist/testing/mock-gitlab-server.d.ts.map +1 -0
  185. package/dist/testing/mock-gitlab-server.js +224 -0
  186. package/dist/testing/mock-gitlab-server.js.map +1 -0
  187. package/dist/testing/test-types.d.ts +59 -0
  188. package/dist/testing/test-types.d.ts.map +1 -0
  189. package/dist/testing/test-types.js +7 -0
  190. package/dist/testing/test-types.js.map +1 -0
  191. package/dist/tool-generator.d.ts +43 -0
  192. package/dist/tool-generator.d.ts.map +1 -0
  193. package/dist/tool-generator.js +123 -0
  194. package/dist/tool-generator.js.map +1 -0
  195. package/dist/tsconfig.tsbuildinfo +1 -0
  196. package/dist/types/http-transport.d.ts +39 -0
  197. package/dist/types/http-transport.d.ts.map +1 -0
  198. package/dist/types/http-transport.js +8 -0
  199. package/dist/types/http-transport.js.map +1 -0
  200. package/dist/types/openapi.d.ts +50 -0
  201. package/dist/types/openapi.d.ts.map +1 -0
  202. package/dist/types/openapi.js +9 -0
  203. package/dist/types/openapi.js.map +1 -0
  204. package/dist/types/profile.d.ts +76 -0
  205. package/dist/types/profile.d.ts.map +1 -0
  206. package/dist/types/profile.js +9 -0
  207. package/dist/types/profile.js.map +1 -0
  208. package/package.json +84 -0
  209. 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"}