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,369 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://github.com/davidruzicka/mcp4openapi/profile-schema.json",
4
+ "title": "MCP Profile",
5
+ "description": "Configuration schema for MCP from OpenAPI tool profiles",
6
+ "type": "object",
7
+ "required": ["profile_name", "tools"],
8
+ "properties": {
9
+ "profile_name": {
10
+ "type": "string",
11
+ "description": "Unique identifier for this profile",
12
+ "examples": ["gitlab-developer", "github-readonly", "custom-api"]
13
+ },
14
+ "description": {
15
+ "type": "string",
16
+ "description": "Human-readable description of what this profile provides"
17
+ },
18
+ "parameter_aliases": {
19
+ "type": "object",
20
+ "description": "Map parameter names to their aliases (e.g., 'id' -> ['project_id', 'group_id'])",
21
+ "additionalProperties": {
22
+ "type": "array",
23
+ "items": {
24
+ "type": "string"
25
+ }
26
+ },
27
+ "examples": [
28
+ {
29
+ "id": ["project_id", "group_id", "resource_id"]
30
+ }
31
+ ]
32
+ },
33
+ "tools": {
34
+ "type": "array",
35
+ "description": "List of MCP tools defined in this profile",
36
+ "minItems": 1,
37
+ "items": {
38
+ "$ref": "#/definitions/Tool"
39
+ }
40
+ },
41
+ "interceptors": {
42
+ "$ref": "#/definitions/Interceptors"
43
+ }
44
+ },
45
+ "definitions": {
46
+ "Tool": {
47
+ "type": "object",
48
+ "required": ["name", "description", "parameters"],
49
+ "properties": {
50
+ "name": {
51
+ "type": "string",
52
+ "description": "Tool name (must be unique, lowercase with underscores)",
53
+ "pattern": "^[a-z][a-z0-9_]*$",
54
+ "examples": ["manage_project_badges", "get_merge_request_with_details"]
55
+ },
56
+ "description": {
57
+ "type": "string",
58
+ "description": "Clear description of what this tool does (shown to LLM)",
59
+ "minLength": 10
60
+ },
61
+ "composite": {
62
+ "type": "boolean",
63
+ "description": "If true, this tool chains multiple API calls",
64
+ "default": false
65
+ },
66
+ "partial_results": {
67
+ "type": "boolean",
68
+ "description": "If true, return partial results even if some steps fail (composite only)",
69
+ "default": false
70
+ },
71
+ "operations": {
72
+ "type": "object",
73
+ "description": "Map action names to OpenAPI operationIds (for simple tools)",
74
+ "additionalProperties": {
75
+ "type": "string"
76
+ },
77
+ "examples": [
78
+ {
79
+ "list": "getApiV4ProjectsIdBadges",
80
+ "get": "getApiV4ProjectsIdBadgesBadgeId",
81
+ "create": "postApiV4ProjectsIdBadges"
82
+ }
83
+ ]
84
+ },
85
+ "response_fields": {
86
+ "type": "object",
87
+ "description": "Define which fields to include in response for each action (reduces verbosity)",
88
+ "additionalProperties": {
89
+ "type": "array",
90
+ "items": {
91
+ "type": "string"
92
+ }
93
+ },
94
+ "examples": [
95
+ {
96
+ "list": ["id", "name", "path", "web_url"],
97
+ "get": ["id", "name", "description", "web_url", "created_at"]
98
+ }
99
+ ]
100
+ },
101
+ "steps": {
102
+ "type": "array",
103
+ "description": "Sequence of API calls to execute (for composite tools)",
104
+ "items": {
105
+ "$ref": "#/definitions/CompositeStep"
106
+ }
107
+ },
108
+ "parameters": {
109
+ "type": "object",
110
+ "description": "Input parameters for this tool",
111
+ "additionalProperties": {
112
+ "$ref": "#/definitions/Parameter"
113
+ }
114
+ },
115
+ "metadata_params": {
116
+ "type": "array",
117
+ "description": "Parameter names that are metadata (not sent in API request body)",
118
+ "items": {
119
+ "type": "string"
120
+ },
121
+ "examples": [["action", "resource_type"]]
122
+ }
123
+ },
124
+ "oneOf": [
125
+ {
126
+ "required": ["operations"],
127
+ "properties": {
128
+ "operations": {
129
+ "type": "object"
130
+ }
131
+ }
132
+ },
133
+ {
134
+ "required": ["steps", "composite"],
135
+ "properties": {
136
+ "composite": {
137
+ "const": true
138
+ },
139
+ "steps": {
140
+ "type": "array"
141
+ }
142
+ }
143
+ }
144
+ ]
145
+ },
146
+ "Parameter": {
147
+ "type": "object",
148
+ "required": ["type", "description"],
149
+ "properties": {
150
+ "type": {
151
+ "type": "string",
152
+ "enum": ["string", "integer", "number", "boolean", "array", "object"],
153
+ "description": "Parameter data type"
154
+ },
155
+ "description": {
156
+ "type": "string",
157
+ "description": "Clear description of this parameter (shown to LLM)",
158
+ "minLength": 5
159
+ },
160
+ "required": {
161
+ "type": "boolean",
162
+ "description": "Is this parameter always required?",
163
+ "default": false
164
+ },
165
+ "required_for": {
166
+ "type": "array",
167
+ "description": "List of actions this parameter is required for",
168
+ "items": {
169
+ "type": "string"
170
+ },
171
+ "examples": [["create", "update"]]
172
+ },
173
+ "enum": {
174
+ "type": "array",
175
+ "description": "List of allowed values",
176
+ "items": {
177
+ "type": "string"
178
+ },
179
+ "minItems": 1
180
+ },
181
+ "items": {
182
+ "type": "object",
183
+ "description": "Item type for array parameters",
184
+ "properties": {
185
+ "type": {
186
+ "type": "string"
187
+ }
188
+ }
189
+ },
190
+ "default": {
191
+ "description": "Default value if not provided"
192
+ },
193
+ "example": {
194
+ "description": "Example value for documentation"
195
+ }
196
+ }
197
+ },
198
+ "CompositeStep": {
199
+ "type": "object",
200
+ "required": ["call", "store_as"],
201
+ "properties": {
202
+ "call": {
203
+ "type": "string",
204
+ "description": "OpenAPI operationId to call",
205
+ "examples": ["getApiV4ProjectsIdMergeRequestsMergeRequestIid"]
206
+ },
207
+ "store_as": {
208
+ "type": "string",
209
+ "description": "JSON path where to store result (e.g., 'merge_request', 'merge_request.comments')",
210
+ "pattern": "^[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)*$",
211
+ "examples": ["merge_request", "merge_request.comments", "user.profile"]
212
+ }
213
+ }
214
+ },
215
+ "Interceptors": {
216
+ "type": "object",
217
+ "description": "HTTP interceptor configuration (auth, rate limiting, retry)",
218
+ "properties": {
219
+ "auth": {
220
+ "$ref": "#/definitions/Auth"
221
+ },
222
+ "base_url": {
223
+ "$ref": "#/definitions/BaseUrl"
224
+ },
225
+ "rate_limit": {
226
+ "$ref": "#/definitions/RateLimit"
227
+ },
228
+ "retry": {
229
+ "$ref": "#/definitions/Retry"
230
+ },
231
+ "array_format": {
232
+ "type": "string",
233
+ "enum": ["brackets", "indices", "repeat", "comma"],
234
+ "description": "How to serialize array query parameters",
235
+ "default": "repeat",
236
+ "examples": ["brackets"]
237
+ }
238
+ }
239
+ },
240
+ "Auth": {
241
+ "type": "object",
242
+ "required": ["type", "value_from_env"],
243
+ "properties": {
244
+ "type": {
245
+ "type": "string",
246
+ "enum": ["bearer", "query", "custom-header"],
247
+ "description": "Authentication type"
248
+ },
249
+ "value_from_env": {
250
+ "type": "string",
251
+ "description": "Environment variable name containing the auth token",
252
+ "pattern": "^[A-Z][A-Z0-9_]*$",
253
+ "examples": ["API_TOKEN", "GITLAB_TOKEN"]
254
+ },
255
+ "header_name": {
256
+ "type": "string",
257
+ "description": "Custom header name (required for custom-header type)",
258
+ "examples": ["X-API-Key", "X-Auth-Token"]
259
+ },
260
+ "query_param": {
261
+ "type": "string",
262
+ "description": "Query parameter name (required for query type)",
263
+ "examples": ["api_key", "token"]
264
+ }
265
+ },
266
+ "allOf": [
267
+ {
268
+ "if": {
269
+ "properties": {
270
+ "type": {
271
+ "const": "custom-header"
272
+ }
273
+ }
274
+ },
275
+ "then": {
276
+ "required": ["header_name"],
277
+ "properties": {
278
+ "header_name": {
279
+ "type": "string"
280
+ }
281
+ }
282
+ }
283
+ },
284
+ {
285
+ "if": {
286
+ "properties": {
287
+ "type": {
288
+ "const": "query"
289
+ }
290
+ }
291
+ },
292
+ "then": {
293
+ "required": ["query_param"],
294
+ "properties": {
295
+ "query_param": {
296
+ "type": "string"
297
+ }
298
+ }
299
+ }
300
+ }
301
+ ]
302
+ },
303
+ "BaseUrl": {
304
+ "type": "object",
305
+ "required": ["value_from_env"],
306
+ "properties": {
307
+ "value_from_env": {
308
+ "type": "string",
309
+ "description": "Environment variable name containing the base URL",
310
+ "pattern": "^[A-Z][A-Z0-9_]*$",
311
+ "examples": ["API_BASE_URL"]
312
+ },
313
+ "default": {
314
+ "type": "string",
315
+ "format": "uri",
316
+ "description": "Default base URL if environment variable is not set",
317
+ "examples": ["https://gitlab.com/api/v4"]
318
+ }
319
+ }
320
+ },
321
+ "RateLimit": {
322
+ "type": "object",
323
+ "required": ["max_requests_per_minute"],
324
+ "properties": {
325
+ "max_requests_per_minute": {
326
+ "type": "integer",
327
+ "minimum": 1,
328
+ "description": "Maximum number of requests per minute (token bucket algorithm)",
329
+ "examples": [600, 60, 30]
330
+ }
331
+ }
332
+ },
333
+ "Retry": {
334
+ "type": "object",
335
+ "required": ["max_attempts", "backoff_ms", "retry_on_status"],
336
+ "properties": {
337
+ "max_attempts": {
338
+ "type": "integer",
339
+ "minimum": 1,
340
+ "maximum": 10,
341
+ "description": "Maximum number of retry attempts",
342
+ "examples": [3]
343
+ },
344
+ "backoff_ms": {
345
+ "type": "array",
346
+ "description": "Backoff delays in milliseconds (one per attempt)",
347
+ "items": {
348
+ "type": "integer",
349
+ "minimum": 0
350
+ },
351
+ "minItems": 1,
352
+ "examples": [[1000, 2000, 4000]]
353
+ },
354
+ "retry_on_status": {
355
+ "type": "array",
356
+ "description": "HTTP status codes that trigger retry",
357
+ "items": {
358
+ "type": "integer",
359
+ "minimum": 400,
360
+ "maximum": 599
361
+ },
362
+ "minItems": 1,
363
+ "examples": [[429, 502, 503, 504]]
364
+ }
365
+ }
366
+ }
367
+ }
368
+ }
369
+