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,66 @@
1
+ // Generated by ts-to-zod
2
+ import { z } from "zod";
3
+ export const compositeStepSchema = z.object({
4
+ call: z.string(),
5
+ store_as: z.string(),
6
+ depends_on: z.array(z.string()).optional()
7
+ });
8
+ export const parameterDefinitionSchema = z.object({
9
+ type: z.union([z.literal("string"), z.literal("integer"), z.literal("number"), z.literal("boolean"), z.literal("array"), z.literal("object")]),
10
+ description: z.string(),
11
+ required: z.boolean().optional(),
12
+ required_for: z.array(z.string()).optional(),
13
+ enum: z.array(z.string()).optional(),
14
+ items: z.object({
15
+ type: z.string()
16
+ }).optional(),
17
+ default: z.unknown().optional(),
18
+ example: z.unknown().optional()
19
+ });
20
+ export const authInterceptorSchema = z.object({
21
+ type: z.union([z.literal("bearer"), z.literal("query"), z.literal("custom-header")]),
22
+ header_name: z.string().optional(),
23
+ query_param: z.string().optional(),
24
+ value_from_env: z.string()
25
+ });
26
+ export const baseUrlConfigSchema = z.object({
27
+ value_from_env: z.string(),
28
+ default: z.string().optional()
29
+ });
30
+ export const rateLimitConfigSchema = z.object({
31
+ max_requests_per_minute: z.number(),
32
+ overrides: z.record(z.string(), z.object({
33
+ max_requests_per_minute: z.number()
34
+ })).optional()
35
+ });
36
+ export const retryConfigSchema = z.object({
37
+ max_attempts: z.number(),
38
+ backoff_ms: z.array(z.number()),
39
+ retry_on_status: z.array(z.number())
40
+ });
41
+ export const toolDefinitionSchema = z.object({
42
+ name: z.string(),
43
+ description: z.string(),
44
+ operations: z.union([z.record(z.string(), z.string()), z.record(z.string(), z.string())]).optional(),
45
+ composite: z.boolean().optional(),
46
+ steps: z.array(compositeStepSchema).optional(),
47
+ partial_results: z.boolean().optional(),
48
+ parameters: z.record(z.string(), parameterDefinitionSchema),
49
+ metadata_params: z.array(z.string()).optional(),
50
+ response_fields: z.record(z.string(), z.array(z.string())).optional()
51
+ });
52
+ export const interceptorConfigSchema = z.object({
53
+ auth: authInterceptorSchema.optional(),
54
+ base_url: baseUrlConfigSchema.optional(),
55
+ rate_limit: rateLimitConfigSchema.optional(),
56
+ retry: retryConfigSchema.optional(),
57
+ array_format: z.union([z.literal("brackets"), z.literal("indices"), z.literal("repeat"), z.literal("comma")]).optional()
58
+ });
59
+ export const profileSchema = z.object({
60
+ profile_name: z.string(),
61
+ description: z.string().optional(),
62
+ tools: z.array(toolDefinitionSchema),
63
+ interceptors: interceptorConfigSchema.optional(),
64
+ parameter_aliases: z.record(z.string(), z.array(z.string())).optional()
65
+ });
66
+ //# sourceMappingURL=generated-schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-schemas.js","sourceRoot":"","sources":["../../src/generated-schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * HTTP Client Factory - unified HTTP client management
3
+ *
4
+ * Why: Eliminates code duplication in HTTP client creation and management
5
+ * Provides consistent client lifecycle, auth handling, and caching
6
+ */
7
+ import { HttpClient } from './interceptors.js';
8
+ import type { Profile } from './types/profile.js';
9
+ export interface HttpClientConfig {
10
+ profile: Profile;
11
+ baseUrl: string;
12
+ sessionToken?: string;
13
+ }
14
+ /**
15
+ * Factory for creating and managing HTTP clients
16
+ * Handles both global and session-specific clients
17
+ */
18
+ export declare class HttpClientFactory {
19
+ private globalClient?;
20
+ private sessionClients;
21
+ /**
22
+ * Create global HTTP client (for stdio transport)
23
+ */
24
+ createGlobalClient(config: HttpClientConfig): HttpClient;
25
+ /**
26
+ * Get or create session-specific HTTP client
27
+ */
28
+ getOrCreateSessionClient(sessionId: string, config: HttpClientConfig): HttpClient;
29
+ /**
30
+ * Get global client (throws if not initialized)
31
+ */
32
+ getGlobalClient(): HttpClient;
33
+ /**
34
+ * Get session client (throws if not exists)
35
+ */
36
+ getSessionClient(sessionId: string): HttpClient;
37
+ /**
38
+ * Cleanup session client
39
+ */
40
+ cleanupSessionClient(sessionId: string): boolean;
41
+ /**
42
+ * Check if global client exists
43
+ */
44
+ hasGlobalClient(): boolean;
45
+ /**
46
+ * Check if session client exists
47
+ */
48
+ hasSessionClient(sessionId: string): boolean;
49
+ /**
50
+ * Get auth token for client creation
51
+ */
52
+ private getAuthToken;
53
+ /**
54
+ * Create interceptor chain for client
55
+ */
56
+ private createInterceptorChain;
57
+ /**
58
+ * Validate client configuration
59
+ */
60
+ validateClientConfig(config: HttpClientConfig): void;
61
+ }
62
+ //# sourceMappingURL=http-client-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client-factory.d.ts","sourceRoot":"","sources":["../../src/http-client-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAoB,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,YAAY,CAAC,CAAa;IAClC,OAAO,CAAC,cAAc,CAAiC;IAEvD;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU;IAOxD;;OAEG;IACH,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,UAAU;IAsBjF;;OAEG;IACH,eAAe,IAAI,UAAU;IAO7B;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU;IAQ/C;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIhD;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI5C;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAK9B;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;CAmBrD"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * HTTP Client Factory - unified HTTP client management
3
+ *
4
+ * Why: Eliminates code duplication in HTTP client creation and management
5
+ * Provides consistent client lifecycle, auth handling, and caching
6
+ */
7
+ import { InterceptorChain, HttpClient } from './interceptors.js';
8
+ import { ConfigurationError, AuthenticationError } from './errors.js';
9
+ /**
10
+ * Factory for creating and managing HTTP clients
11
+ * Handles both global and session-specific clients
12
+ */
13
+ export class HttpClientFactory {
14
+ globalClient;
15
+ sessionClients = new Map();
16
+ /**
17
+ * Create global HTTP client (for stdio transport)
18
+ */
19
+ createGlobalClient(config) {
20
+ const interceptors = this.createInterceptorChain(config);
21
+ const client = new HttpClient(config.baseUrl, interceptors);
22
+ this.globalClient = client;
23
+ return client;
24
+ }
25
+ /**
26
+ * Get or create session-specific HTTP client
27
+ */
28
+ getOrCreateSessionClient(sessionId, config) {
29
+ // Check cache first
30
+ let client = this.sessionClients.get(sessionId);
31
+ if (client) {
32
+ return client;
33
+ }
34
+ // Create new client for session
35
+ const interceptors = this.createInterceptorChain(config);
36
+ const newClient = new HttpClient(config.baseUrl, interceptors);
37
+ // Double-check for race condition
38
+ const existingClient = this.sessionClients.get(sessionId);
39
+ if (existingClient) {
40
+ return existingClient;
41
+ }
42
+ // Cache and return
43
+ this.sessionClients.set(sessionId, newClient);
44
+ return newClient;
45
+ }
46
+ /**
47
+ * Get global client (throws if not initialized)
48
+ */
49
+ getGlobalClient() {
50
+ if (!this.globalClient) {
51
+ throw new ConfigurationError('Global HTTP client not initialized');
52
+ }
53
+ return this.globalClient;
54
+ }
55
+ /**
56
+ * Get session client (throws if not exists)
57
+ */
58
+ getSessionClient(sessionId) {
59
+ const client = this.sessionClients.get(sessionId);
60
+ if (!client) {
61
+ throw new ConfigurationError(`Session HTTP client not found for session: ${sessionId}`);
62
+ }
63
+ return client;
64
+ }
65
+ /**
66
+ * Cleanup session client
67
+ */
68
+ cleanupSessionClient(sessionId) {
69
+ return this.sessionClients.delete(sessionId);
70
+ }
71
+ /**
72
+ * Check if global client exists
73
+ */
74
+ hasGlobalClient() {
75
+ return !!this.globalClient;
76
+ }
77
+ /**
78
+ * Check if session client exists
79
+ */
80
+ hasSessionClient(sessionId) {
81
+ return this.sessionClients.has(sessionId);
82
+ }
83
+ /**
84
+ * Get auth token for client creation
85
+ */
86
+ getAuthToken(config) {
87
+ // Priority: session token > environment token
88
+ if (config.sessionToken) {
89
+ return config.sessionToken;
90
+ }
91
+ if (config.profile.interceptors?.auth) {
92
+ return process.env[config.profile.interceptors.auth.value_from_env];
93
+ }
94
+ return undefined;
95
+ }
96
+ /**
97
+ * Create interceptor chain for client
98
+ */
99
+ createInterceptorChain(config) {
100
+ const token = this.getAuthToken(config);
101
+ return new InterceptorChain(config.profile.interceptors || {}, token);
102
+ }
103
+ /**
104
+ * Validate client configuration
105
+ */
106
+ validateClientConfig(config) {
107
+ if (!config.baseUrl) {
108
+ throw new ConfigurationError('Base URL is required for HTTP client');
109
+ }
110
+ if (!config.profile) {
111
+ throw new ConfigurationError('Profile is required for HTTP client');
112
+ }
113
+ // Check if we have any auth token available
114
+ const hasToken = this.getAuthToken(config);
115
+ if (!hasToken && config.profile.interceptors?.auth) {
116
+ const envVar = config.profile.interceptors.auth.value_from_env;
117
+ throw new AuthenticationError(`No auth token available. Expected token in Authorization header or ${envVar} env var`, { envVar });
118
+ }
119
+ }
120
+ }
121
+ //# sourceMappingURL=http-client-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client-factory.js","sourceRoot":"","sources":["../../src/http-client-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * HTTP Streamable Transport for MCP
3
+ *
4
+ * Implements MCP Specification 2025-03-26
5
+ * https://modelcontextprotocol.io/specification/2025-03-26/basic/transports
6
+ *
7
+ * Why: Enables remote MCP server access with SSE streaming, session management,
8
+ * and resumability for reliable communication over HTTP.
9
+ */
10
+ import type { Logger } from './logger.js';
11
+ import type { HttpTransportConfig } from './types/http-transport.js';
12
+ export declare class HttpTransport {
13
+ private app;
14
+ private server;
15
+ private sessions;
16
+ private config;
17
+ private logger;
18
+ private metrics;
19
+ private cleanupInterval;
20
+ private messageHandler;
21
+ constructor(config: HttpTransportConfig, logger: Logger);
22
+ /**
23
+ * Setup Express middleware
24
+ *
25
+ * Why: Security (Origin validation, rate limiting), JSON parsing, session extraction, metrics
26
+ */
27
+ private setupMiddleware;
28
+ private hasWarnedAboutBinding;
29
+ /**
30
+ * Check if origin is allowed
31
+ *
32
+ * Why: Prevent DNS rebinding attacks
33
+ *
34
+ * Supports:
35
+ * - Exact hostname: 'example.com', 'api.example.com'
36
+ * - Wildcard subdomain: '*.example.com'
37
+ * - IPv4 CIDR: '192.168.1.0/24', '10.0.0.0/8'
38
+ * - IPv4 exact: '192.168.1.100'
39
+ */
40
+ private isAllowedOrigin;
41
+ /**
42
+ * Match hostname against allowed origin pattern
43
+ *
44
+ * Supports:
45
+ * - Exact match: 'example.com' === 'example.com'
46
+ * - Wildcard: '*.example.com' matches 'api.example.com', 'web.example.com'
47
+ * - CIDR: '192.168.1.0/24' matches '192.168.1.1' through '192.168.1.254'
48
+ */
49
+ private matchOrigin;
50
+ /**
51
+ * Check if IP address is within CIDR range
52
+ *
53
+ * Example: '192.168.1.50' matches '192.168.1.0/24'
54
+ */
55
+ private matchCIDR;
56
+ /**
57
+ * Convert IPv4 address to 32-bit integer
58
+ *
59
+ * Example: '192.168.1.1' -> 3232235777
60
+ */
61
+ private ipToInt;
62
+ /**
63
+ * Setup MCP endpoint routes
64
+ *
65
+ * Why: Single endpoint for POST (client→server) and GET (SSE stream)
66
+ */
67
+ private setupRoutes;
68
+ /**
69
+ * Handle metrics endpoint
70
+ *
71
+ * Why: Prometheus scraping endpoint
72
+ */
73
+ private handleMetrics;
74
+ /**
75
+ * Validate token format and length
76
+ *
77
+ * Why centralized: Single source of truth for token validation rules
78
+ *
79
+ * Relaxed validation: Allow common API token characters including colons,
80
+ * to support various token formats (GitLab glpat-, YouTrack perm:, etc.)
81
+ */
82
+ private validateToken;
83
+ /**
84
+ * Extract and validate auth token from request headers
85
+ *
86
+ * Supports:
87
+ * - Authorization: Bearer <token>
88
+ * - X-API-Token: <token>
89
+ *
90
+ * Why strict validation: Prevents header injection attacks
91
+ */
92
+ private extractAuthToken;
93
+ /**
94
+ * Handle POST requests - Client sending messages to server
95
+ *
96
+ * MCP Spec: POST can contain requests, notifications, or responses
97
+ */
98
+ private handlePost;
99
+ /**
100
+ * Handle GET requests - Client opening SSE stream for server messages
101
+ *
102
+ * MCP Spec: GET opens SSE stream for server-initiated requests/notifications
103
+ */
104
+ private handleGet;
105
+ /**
106
+ * Handle DELETE requests - Client terminating session
107
+ *
108
+ * MCP Spec: DELETE explicitly terminates session
109
+ */
110
+ private handleDelete;
111
+ /**
112
+ * Start SSE response for a POST request
113
+ *
114
+ * Why: Returns response via SSE stream, allows server-initiated messages
115
+ */
116
+ private startSSEResponse;
117
+ /**
118
+ * Start SSE stream for GET request
119
+ *
120
+ * Why: Allows server to send requests/notifications to client
121
+ */
122
+ private startSSEStream;
123
+ /**
124
+ * Replay messages after Last-Event-ID
125
+ *
126
+ * Why: Resumability - client can reconnect and receive missed messages
127
+ */
128
+ private replayMessages;
129
+ /**
130
+ * Send message to client via SSE
131
+ *
132
+ * Why: Server-initiated requests/notifications
133
+ */
134
+ sendToClient(sessionId: string, message: unknown): void;
135
+ /**
136
+ * Determine message type (request, notification, response)
137
+ */
138
+ private getMessageType;
139
+ /**
140
+ * Create new session
141
+ *
142
+ * Why: Stateful sessions for MCP protocol
143
+ */
144
+ private createSession;
145
+ /**
146
+ * Update session activity timestamp
147
+ */
148
+ private updateSessionActivity;
149
+ /**
150
+ * Destroy session and cleanup resources
151
+ *
152
+ * Why: Free memory, close streams
153
+ */
154
+ private destroySession;
155
+ /**
156
+ * Session destruction listeners for cleanup in other components
157
+ */
158
+ private sessionDestroyedListeners;
159
+ /**
160
+ * Register listener for session destruction events
161
+ *
162
+ * Why: Allows MCPServer to cleanup per-session HTTP clients
163
+ */
164
+ onSessionDestroyed(listener: (sessionId: string) => void): void;
165
+ /**
166
+ * Notify all listeners about session destruction
167
+ */
168
+ private notifySessionDestroyed;
169
+ /**
170
+ * Cleanup expired sessions
171
+ *
172
+ * Why: Prevent memory leaks, enforce session timeout
173
+ */
174
+ private cleanupExpiredSessions;
175
+ /**
176
+ * Get auth token from session
177
+ *
178
+ * Why public: Allows MCPServer to securely access session tokens without breaking encapsulation
179
+ */
180
+ getSessionToken(sessionId: string): string | undefined;
181
+ /**
182
+ * Set message handler for processing incoming JSON-RPC messages
183
+ */
184
+ setMessageHandler(handler: (message: unknown, sessionId?: string) => Promise<unknown>): void;
185
+ /**
186
+ * Start HTTP server
187
+ */
188
+ start(): Promise<void>;
189
+ /**
190
+ * Stop HTTP server
191
+ */
192
+ stop(): Promise<void>;
193
+ }
194
+ //# sourceMappingURL=http-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../../src/http-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAIV,mBAAmB,EAEpB,MAAM,2BAA2B,CAAC;AAOnC,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,cAAc,CAA6E;gBAEvF,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM;IAiBvD;;;;OAIG;IACH,OAAO,CAAC,eAAe;IA+CvB,OAAO,CAAC,qBAAqB,CAAS;IAEtC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,eAAe;IA8BvB;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;IAoBnB;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAyBjB;;;;OAIG;IACH,OAAO,CAAC,OAAO;IAmBf;;;;OAIG;IACH,OAAO,CAAC,WAAW;IA6GnB;;;;OAIG;YACW,aAAa;IAoB3B;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;IAgBrB;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IA2BxB;;;;OAIG;YACW,UAAU;IA4FxB;;;;OAIG;YACW,SAAS;IAkDvB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAmCpB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IA6CtB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAatB;;;;OAIG;IACI,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IA6B9D;;OAEG;IACH,OAAO,CAAC,cAAc;IAuBtB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAyBrB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAO7B;;;;OAIG;IACH,OAAO,CAAC,cAAc;IA+BtB;;OAEG;IACH,OAAO,CAAC,yBAAyB,CAA0C;IAE3E;;;;OAIG;IACI,kBAAkB,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAItE;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAqB9B;;;;OAIG;IACI,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK7D;;OAEG;IACI,iBAAiB,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAInG;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BnC;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAuBnC"}