@mcpmake/core 0.2.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 (323) hide show
  1. package/dist/analyzer/auth-detector.d.ts +13 -0
  2. package/dist/analyzer/auth-detector.d.ts.map +1 -0
  3. package/dist/analyzer/auth-detector.js +143 -0
  4. package/dist/analyzer/auth-detector.js.map +1 -0
  5. package/dist/analyzer/dom-parser.d.ts +11 -0
  6. package/dist/analyzer/dom-parser.d.ts.map +1 -0
  7. package/dist/analyzer/dom-parser.js +260 -0
  8. package/dist/analyzer/dom-parser.js.map +1 -0
  9. package/dist/analyzer/goal-crawler.d.ts +26 -0
  10. package/dist/analyzer/goal-crawler.d.ts.map +1 -0
  11. package/dist/analyzer/goal-crawler.js +178 -0
  12. package/dist/analyzer/goal-crawler.js.map +1 -0
  13. package/dist/analyzer/hybrid-detector.d.ts +29 -0
  14. package/dist/analyzer/hybrid-detector.d.ts.map +1 -0
  15. package/dist/analyzer/hybrid-detector.js +97 -0
  16. package/dist/analyzer/hybrid-detector.js.map +1 -0
  17. package/dist/analyzer/index.d.ts +13 -0
  18. package/dist/analyzer/index.d.ts.map +1 -0
  19. package/dist/analyzer/index.js +9 -0
  20. package/dist/analyzer/index.js.map +1 -0
  21. package/dist/analyzer/screenshot-capture.d.ts +30 -0
  22. package/dist/analyzer/screenshot-capture.d.ts.map +1 -0
  23. package/dist/analyzer/screenshot-capture.js +43 -0
  24. package/dist/analyzer/screenshot-capture.js.map +1 -0
  25. package/dist/analyzer/selector-builder.d.ts +20 -0
  26. package/dist/analyzer/selector-builder.d.ts.map +1 -0
  27. package/dist/analyzer/selector-builder.js +200 -0
  28. package/dist/analyzer/selector-builder.js.map +1 -0
  29. package/dist/analyzer/semantic-analyzer.d.ts +14 -0
  30. package/dist/analyzer/semantic-analyzer.d.ts.map +1 -0
  31. package/dist/analyzer/semantic-analyzer.js +146 -0
  32. package/dist/analyzer/semantic-analyzer.js.map +1 -0
  33. package/dist/analyzer/site-crawler.d.ts +39 -0
  34. package/dist/analyzer/site-crawler.d.ts.map +1 -0
  35. package/dist/analyzer/site-crawler.js +236 -0
  36. package/dist/analyzer/site-crawler.js.map +1 -0
  37. package/dist/config/configurable-command.d.ts +14 -0
  38. package/dist/config/configurable-command.d.ts.map +1 -0
  39. package/dist/config/configurable-command.js +71 -0
  40. package/dist/config/configurable-command.js.map +1 -0
  41. package/dist/config/mcpmake-config.d.ts +69 -0
  42. package/dist/config/mcpmake-config.d.ts.map +1 -0
  43. package/dist/config/mcpmake-config.js +209 -0
  44. package/dist/config/mcpmake-config.js.map +1 -0
  45. package/dist/emitter/code-writer.d.ts +9 -0
  46. package/dist/emitter/code-writer.d.ts.map +1 -0
  47. package/dist/emitter/code-writer.js +26 -0
  48. package/dist/emitter/code-writer.js.map +1 -0
  49. package/dist/emitter/index.d.ts +33 -0
  50. package/dist/emitter/index.d.ts.map +1 -0
  51. package/dist/emitter/index.js +297 -0
  52. package/dist/emitter/index.js.map +1 -0
  53. package/dist/emitter/mcpb-bundler.d.ts +32 -0
  54. package/dist/emitter/mcpb-bundler.d.ts.map +1 -0
  55. package/dist/emitter/mcpb-bundler.js +173 -0
  56. package/dist/emitter/mcpb-bundler.js.map +1 -0
  57. package/dist/emitter/project-scaffolder.d.ts +5 -0
  58. package/dist/emitter/project-scaffolder.d.ts.map +1 -0
  59. package/dist/emitter/project-scaffolder.js +101 -0
  60. package/dist/emitter/project-scaffolder.js.map +1 -0
  61. package/dist/emitter/python-template-loader.d.ts +5 -0
  62. package/dist/emitter/python-template-loader.d.ts.map +1 -0
  63. package/dist/emitter/python-template-loader.js +31 -0
  64. package/dist/emitter/python-template-loader.js.map +1 -0
  65. package/dist/emitter/python-templates/dockerfile.hbs +14 -0
  66. package/dist/emitter/python-templates/env.example.hbs +12 -0
  67. package/dist/emitter/python-templates/requirements.txt.hbs +4 -0
  68. package/dist/emitter/python-templates/server.py.hbs +93 -0
  69. package/dist/emitter/site-scaffolder.d.ts +14 -0
  70. package/dist/emitter/site-scaffolder.d.ts.map +1 -0
  71. package/dist/emitter/site-scaffolder.js +71 -0
  72. package/dist/emitter/site-scaffolder.js.map +1 -0
  73. package/dist/emitter/site-template-loader.d.ts +6 -0
  74. package/dist/emitter/site-template-loader.d.ts.map +1 -0
  75. package/dist/emitter/site-template-loader.js +48 -0
  76. package/dist/emitter/site-template-loader.js.map +1 -0
  77. package/dist/emitter/site-templates/browser-manager.ts.hbs +233 -0
  78. package/dist/emitter/site-templates/config.ts.hbs +28 -0
  79. package/dist/emitter/site-templates/dockerfile.hbs +31 -0
  80. package/dist/emitter/site-templates/env.example.hbs +19 -0
  81. package/dist/emitter/site-templates/package.json.hbs +26 -0
  82. package/dist/emitter/site-templates/server-main-http.ts.hbs +108 -0
  83. package/dist/emitter/site-templates/server-main.ts.hbs +23 -0
  84. package/dist/emitter/site-templates/tool-handler-action.ts.hbs +86 -0
  85. package/dist/emitter/site-templates/tool-handler-form.ts.hbs +116 -0
  86. package/dist/emitter/site-templates/tool-handler-lifecycle.ts.hbs +146 -0
  87. package/dist/emitter/site-templates/tool-index.ts.hbs +11 -0
  88. package/dist/emitter/template-loader.d.ts +2 -0
  89. package/dist/emitter/template-loader.d.ts.map +1 -0
  90. package/dist/emitter/template-loader.js +28 -0
  91. package/dist/emitter/template-loader.js.map +1 -0
  92. package/dist/emitter/templates/auth-provider.ts.hbs +57 -0
  93. package/dist/emitter/templates/config.ts.hbs +110 -0
  94. package/dist/emitter/templates/discovery.ts.hbs +320 -0
  95. package/dist/emitter/templates/dockerfile.hbs +34 -0
  96. package/dist/emitter/templates/env.example.hbs +52 -0
  97. package/dist/emitter/templates/gitignore.hbs +5 -0
  98. package/dist/emitter/templates/http-executor.ts.hbs +159 -0
  99. package/dist/emitter/templates/oauth.ts.hbs +188 -0
  100. package/dist/emitter/templates/package.json.hbs +25 -0
  101. package/dist/emitter/templates/prompts.ts.hbs +22 -0
  102. package/dist/emitter/templates/readme.md.hbs +156 -0
  103. package/dist/emitter/templates/resources.ts.hbs +63 -0
  104. package/dist/emitter/templates/response-filter.ts.hbs +128 -0
  105. package/dist/emitter/templates/server-main-http.ts.hbs +442 -0
  106. package/dist/emitter/templates/server-main.ts.hbs +40 -0
  107. package/dist/emitter/templates/task-handlers.ts.hbs +189 -0
  108. package/dist/emitter/templates/task-manager.ts.hbs +139 -0
  109. package/dist/emitter/templates/task-sse.ts.hbs +105 -0
  110. package/dist/emitter/templates/tool-handler.ts.hbs +142 -0
  111. package/dist/emitter/templates/tool-index.ts.hbs +42 -0
  112. package/dist/emitter/templates/tool-test.ts.hbs +57 -0
  113. package/dist/emitter/templates/trace.ts.hbs +79 -0
  114. package/dist/emitter/templates/tsconfig.json.hbs +16 -0
  115. package/dist/emitter/templates/types.ts.hbs +5 -0
  116. package/dist/emitter/worker-template-loader.d.ts +6 -0
  117. package/dist/emitter/worker-template-loader.d.ts.map +1 -0
  118. package/dist/emitter/worker-template-loader.js +34 -0
  119. package/dist/emitter/worker-template-loader.js.map +1 -0
  120. package/dist/emitter/worker-templates/config.ts.hbs +93 -0
  121. package/dist/emitter/worker-templates/dev-vars.example.hbs +27 -0
  122. package/dist/emitter/worker-templates/gitignore.hbs +6 -0
  123. package/dist/emitter/worker-templates/package.json.hbs +24 -0
  124. package/dist/emitter/worker-templates/readme.md.hbs +73 -0
  125. package/dist/emitter/worker-templates/server.test.ts.hbs +20 -0
  126. package/dist/emitter/worker-templates/tool-handler.ts.hbs +103 -0
  127. package/dist/emitter/worker-templates/tool-index.ts.hbs +28 -0
  128. package/dist/emitter/worker-templates/tsconfig.json.hbs +17 -0
  129. package/dist/emitter/worker-templates/worker.ts.hbs +286 -0
  130. package/dist/emitter/worker-templates/wrangler.toml.hbs +19 -0
  131. package/dist/generator/spec-generator.d.ts +7 -0
  132. package/dist/generator/spec-generator.d.ts.map +1 -0
  133. package/dist/generator/spec-generator.js +51 -0
  134. package/dist/generator/spec-generator.js.map +1 -0
  135. package/dist/index.d.ts +75 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +101 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/parser/har-filter.d.ts +9 -0
  140. package/dist/parser/har-filter.d.ts.map +1 -0
  141. package/dist/parser/har-filter.js +72 -0
  142. package/dist/parser/har-filter.js.map +1 -0
  143. package/dist/parser/har-loader.d.ts +3 -0
  144. package/dist/parser/har-loader.d.ts.map +1 -0
  145. package/dist/parser/har-loader.js +15 -0
  146. package/dist/parser/har-loader.js.map +1 -0
  147. package/dist/parser/har-normalizer.d.ts +21 -0
  148. package/dist/parser/har-normalizer.d.ts.map +1 -0
  149. package/dist/parser/har-normalizer.js +79 -0
  150. package/dist/parser/har-normalizer.js.map +1 -0
  151. package/dist/parser/index.d.ts +11 -0
  152. package/dist/parser/index.d.ts.map +1 -0
  153. package/dist/parser/index.js +7 -0
  154. package/dist/parser/index.js.map +1 -0
  155. package/dist/parser/openapi-loader.d.ts +7 -0
  156. package/dist/parser/openapi-loader.d.ts.map +1 -0
  157. package/dist/parser/openapi-loader.js +309 -0
  158. package/dist/parser/openapi-loader.js.map +1 -0
  159. package/dist/parser/operation-extractor.d.ts +14 -0
  160. package/dist/parser/operation-extractor.d.ts.map +1 -0
  161. package/dist/parser/operation-extractor.js +156 -0
  162. package/dist/parser/operation-extractor.js.map +1 -0
  163. package/dist/parser/overlay-loader.d.ts +11 -0
  164. package/dist/parser/overlay-loader.d.ts.map +1 -0
  165. package/dist/parser/overlay-loader.js +185 -0
  166. package/dist/parser/overlay-loader.js.map +1 -0
  167. package/dist/parser/postman-loader.d.ts +10 -0
  168. package/dist/parser/postman-loader.d.ts.map +1 -0
  169. package/dist/parser/postman-loader.js +107 -0
  170. package/dist/parser/postman-loader.js.map +1 -0
  171. package/dist/parser/schema-converter.d.ts +13 -0
  172. package/dist/parser/schema-converter.d.ts.map +1 -0
  173. package/dist/parser/schema-converter.js +118 -0
  174. package/dist/parser/schema-converter.js.map +1 -0
  175. package/dist/plugins/adapter.d.ts +41 -0
  176. package/dist/plugins/adapter.d.ts.map +1 -0
  177. package/dist/plugins/adapter.js +16 -0
  178. package/dist/plugins/adapter.js.map +1 -0
  179. package/dist/plugins/loader.d.ts +26 -0
  180. package/dist/plugins/loader.d.ts.map +1 -0
  181. package/dist/plugins/loader.js +59 -0
  182. package/dist/plugins/loader.js.map +1 -0
  183. package/dist/pricing.d.ts +56 -0
  184. package/dist/pricing.d.ts.map +1 -0
  185. package/dist/pricing.js +134 -0
  186. package/dist/pricing.js.map +1 -0
  187. package/dist/providers/index.d.ts +16 -0
  188. package/dist/providers/index.d.ts.map +1 -0
  189. package/dist/providers/index.js +57 -0
  190. package/dist/providers/index.js.map +1 -0
  191. package/dist/recorder/browser-recorder.d.ts +23 -0
  192. package/dist/recorder/browser-recorder.d.ts.map +1 -0
  193. package/dist/recorder/browser-recorder.js +206 -0
  194. package/dist/recorder/browser-recorder.js.map +1 -0
  195. package/dist/rescan/diff-engine.d.ts +6 -0
  196. package/dist/rescan/diff-engine.d.ts.map +1 -0
  197. package/dist/rescan/diff-engine.js +313 -0
  198. package/dist/rescan/diff-engine.js.map +1 -0
  199. package/dist/rescan/index.d.ts +4 -0
  200. package/dist/rescan/index.d.ts.map +1 -0
  201. package/dist/rescan/index.js +3 -0
  202. package/dist/rescan/index.js.map +1 -0
  203. package/dist/rescan/rescan-runner.d.ts +43 -0
  204. package/dist/rescan/rescan-runner.d.ts.map +1 -0
  205. package/dist/rescan/rescan-runner.js +70 -0
  206. package/dist/rescan/rescan-runner.js.map +1 -0
  207. package/dist/rescan/rescan-scheduler.d.ts +42 -0
  208. package/dist/rescan/rescan-scheduler.d.ts.map +1 -0
  209. package/dist/rescan/rescan-scheduler.js +180 -0
  210. package/dist/rescan/rescan-scheduler.js.map +1 -0
  211. package/dist/site-transformer/browser-tools.d.ts +11 -0
  212. package/dist/site-transformer/browser-tools.d.ts.map +1 -0
  213. package/dist/site-transformer/browser-tools.js +60 -0
  214. package/dist/site-transformer/browser-tools.js.map +1 -0
  215. package/dist/site-transformer/index.d.ts +3 -0
  216. package/dist/site-transformer/index.d.ts.map +1 -0
  217. package/dist/site-transformer/index.js +3 -0
  218. package/dist/site-transformer/index.js.map +1 -0
  219. package/dist/site-transformer/selector-healer.d.ts +9 -0
  220. package/dist/site-transformer/selector-healer.d.ts.map +1 -0
  221. package/dist/site-transformer/selector-healer.js +107 -0
  222. package/dist/site-transformer/selector-healer.js.map +1 -0
  223. package/dist/site-transformer/tool-generator.d.ts +14 -0
  224. package/dist/site-transformer/tool-generator.d.ts.map +1 -0
  225. package/dist/site-transformer/tool-generator.js +246 -0
  226. package/dist/site-transformer/tool-generator.js.map +1 -0
  227. package/dist/transformer/auth-detector.d.ts +29 -0
  228. package/dist/transformer/auth-detector.d.ts.map +1 -0
  229. package/dist/transformer/auth-detector.js +104 -0
  230. package/dist/transformer/auth-detector.js.map +1 -0
  231. package/dist/transformer/catalog-builder.d.ts +19 -0
  232. package/dist/transformer/catalog-builder.d.ts.map +1 -0
  233. package/dist/transformer/catalog-builder.js +57 -0
  234. package/dist/transformer/catalog-builder.js.map +1 -0
  235. package/dist/transformer/client-compat.d.ts +7 -0
  236. package/dist/transformer/client-compat.d.ts.map +1 -0
  237. package/dist/transformer/client-compat.js +45 -0
  238. package/dist/transformer/client-compat.js.map +1 -0
  239. package/dist/transformer/har-clusterer.d.ts +10 -0
  240. package/dist/transformer/har-clusterer.d.ts.map +1 -0
  241. package/dist/transformer/har-clusterer.js +28 -0
  242. package/dist/transformer/har-clusterer.js.map +1 -0
  243. package/dist/transformer/har-dedup.d.ts +11 -0
  244. package/dist/transformer/har-dedup.d.ts.map +1 -0
  245. package/dist/transformer/har-dedup.js +82 -0
  246. package/dist/transformer/har-dedup.js.map +1 -0
  247. package/dist/transformer/har-schema-inferrer.d.ts +16 -0
  248. package/dist/transformer/har-schema-inferrer.d.ts.map +1 -0
  249. package/dist/transformer/har-schema-inferrer.js +91 -0
  250. package/dist/transformer/har-schema-inferrer.js.map +1 -0
  251. package/dist/transformer/har-to-operations.d.ts +14 -0
  252. package/dist/transformer/har-to-operations.d.ts.map +1 -0
  253. package/dist/transformer/har-to-operations.js +193 -0
  254. package/dist/transformer/har-to-operations.js.map +1 -0
  255. package/dist/transformer/index.d.ts +9 -0
  256. package/dist/transformer/index.d.ts.map +1 -0
  257. package/dist/transformer/index.js +7 -0
  258. package/dist/transformer/index.js.map +1 -0
  259. package/dist/transformer/llm-namer.d.ts +7 -0
  260. package/dist/transformer/llm-namer.d.ts.map +1 -0
  261. package/dist/transformer/llm-namer.js +60 -0
  262. package/dist/transformer/llm-namer.js.map +1 -0
  263. package/dist/transformer/naming.d.ts +5 -0
  264. package/dist/transformer/naming.d.ts.map +1 -0
  265. package/dist/transformer/naming.js +31 -0
  266. package/dist/transformer/naming.js.map +1 -0
  267. package/dist/transformer/operation-filter.d.ts +14 -0
  268. package/dist/transformer/operation-filter.d.ts.map +1 -0
  269. package/dist/transformer/operation-filter.js +53 -0
  270. package/dist/transformer/operation-filter.js.map +1 -0
  271. package/dist/transformer/resource-builder.d.ts +13 -0
  272. package/dist/transformer/resource-builder.d.ts.map +1 -0
  273. package/dist/transformer/resource-builder.js +87 -0
  274. package/dist/transformer/resource-builder.js.map +1 -0
  275. package/dist/transformer/schema-merger.d.ts +15 -0
  276. package/dist/transformer/schema-merger.d.ts.map +1 -0
  277. package/dist/transformer/schema-merger.js +66 -0
  278. package/dist/transformer/schema-merger.js.map +1 -0
  279. package/dist/transformer/stainless-config.d.ts +75 -0
  280. package/dist/transformer/stainless-config.d.ts.map +1 -0
  281. package/dist/transformer/stainless-config.js +59 -0
  282. package/dist/transformer/stainless-config.js.map +1 -0
  283. package/dist/transformer/stainless-translator.d.ts +61 -0
  284. package/dist/transformer/stainless-translator.d.ts.map +1 -0
  285. package/dist/transformer/stainless-translator.js +375 -0
  286. package/dist/transformer/stainless-translator.js.map +1 -0
  287. package/dist/transformer/tool-builder.d.ts +4 -0
  288. package/dist/transformer/tool-builder.d.ts.map +1 -0
  289. package/dist/transformer/tool-builder.js +119 -0
  290. package/dist/transformer/tool-builder.js.map +1 -0
  291. package/dist/types/index.d.ts +140 -0
  292. package/dist/types/index.d.ts.map +1 -0
  293. package/dist/types/index.js +2 -0
  294. package/dist/types/index.js.map +1 -0
  295. package/dist/types/site.d.ts +285 -0
  296. package/dist/types/site.d.ts.map +1 -0
  297. package/dist/types/site.js +9 -0
  298. package/dist/types/site.js.map +1 -0
  299. package/dist/utils/fail.d.ts +49 -0
  300. package/dist/utils/fail.d.ts.map +1 -0
  301. package/dist/utils/fail.js +223 -0
  302. package/dist/utils/fail.js.map +1 -0
  303. package/dist/utils/fs.d.ts +6 -0
  304. package/dist/utils/fs.d.ts.map +1 -0
  305. package/dist/utils/fs.js +29 -0
  306. package/dist/utils/fs.js.map +1 -0
  307. package/dist/utils/interactive.d.ts +7 -0
  308. package/dist/utils/interactive.d.ts.map +1 -0
  309. package/dist/utils/interactive.js +31 -0
  310. package/dist/utils/interactive.js.map +1 -0
  311. package/dist/utils/logger.d.ts +2 -0
  312. package/dist/utils/logger.d.ts.map +1 -0
  313. package/dist/utils/logger.js +3 -0
  314. package/dist/utils/logger.js.map +1 -0
  315. package/dist/utils/sanitize.d.ts +29 -0
  316. package/dist/utils/sanitize.d.ts.map +1 -0
  317. package/dist/utils/sanitize.js +45 -0
  318. package/dist/utils/sanitize.js.map +1 -0
  319. package/dist/utils/watcher.d.ts +12 -0
  320. package/dist/utils/watcher.d.ts.map +1 -0
  321. package/dist/utils/watcher.js +37 -0
  322. package/dist/utils/watcher.js.map +1 -0
  323. package/package.json +45 -0
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Filter operations by tag or path pattern.
3
+ * Patterns can be:
4
+ * - A tag name: "pets" matches operations tagged with "pets"
5
+ * - A path prefix: "/users*" matches /users, /users/{id}, etc.
6
+ * - A glob-like pattern: "*admin*" matches any operation with "admin" in path or tags
7
+ */
8
+ export function filterOperations(operations, options) {
9
+ let result = operations;
10
+ if (options.include?.length) {
11
+ result = result.filter((op) => options.include.some((pattern) => matchesOperation(op, pattern)));
12
+ }
13
+ if (options.exclude?.length) {
14
+ result = result.filter((op) => !options.exclude.some((pattern) => matchesOperation(op, pattern)));
15
+ }
16
+ return result;
17
+ }
18
+ function matchesOperation(op, pattern) {
19
+ const lowerPattern = pattern.toLowerCase();
20
+ // Check tag match
21
+ if (op.tags.some((t) => t.toLowerCase() === lowerPattern))
22
+ return true;
23
+ // Check path match with simple glob support
24
+ if (matchGlob(op.path.toLowerCase(), lowerPattern))
25
+ return true;
26
+ // Check operationId match
27
+ if (op.operationId.toLowerCase().includes(lowerPattern))
28
+ return true;
29
+ return false;
30
+ }
31
+ function matchGlob(str, pattern) {
32
+ // Simple glob matching without regex to avoid ReDoS.
33
+ // Split pattern by '*' and check that all parts appear in order.
34
+ const parts = pattern.split('*');
35
+ let pos = 0;
36
+ for (let i = 0; i < parts.length; i++) {
37
+ const part = parts[i];
38
+ if (part === '')
39
+ continue;
40
+ const idx = str.indexOf(part, pos);
41
+ if (idx === -1)
42
+ return false;
43
+ // First segment must match at start, last at end
44
+ if (i === 0 && idx !== 0)
45
+ return false;
46
+ pos = idx + part.length;
47
+ }
48
+ // If pattern doesn't end with *, the string must end at pos
49
+ if (!pattern.endsWith('*') && pos !== str.length)
50
+ return false;
51
+ return true;
52
+ }
53
+ //# sourceMappingURL=operation-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-filter.js","sourceRoot":"","sources":["../../src/transformer/operation-filter.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAAiC,EACjC,OAAsB;IAEtB,IAAI,MAAM,GAAG,UAAU,CAAC;IAExB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAC5B,OAAO,CAAC,OAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAClE,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,MAAM,CAAC,MAAM,CACpB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAC3E,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAuB,EAAE,OAAe;IAChE,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAE3C,kBAAkB;IAClB,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvE,4CAA4C;IAC5C,IAAI,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhE,0BAA0B;IAC1B,IAAI,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAErE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,OAAe;IAC7C,qDAAqD;IACrD,iEAAiE;IACjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,KAAK,EAAE;YAAE,SAAS;QAE1B,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAE7B,iDAAiD;QACjD,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACvC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,4DAA4D;IAC5D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAE/D,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { OperationDescriptor } from '../types/index.js';
2
+ import type { ResourceDefinition, PromptDefinition } from '../types/index.js';
3
+ /**
4
+ * Generate MCP resources from GET operations.
5
+ * - List endpoints (no path params) → static resources
6
+ * - Detail endpoints (with path params) → URI template resources
7
+ */
8
+ export declare function buildResources(operations: OperationDescriptor[]): ResourceDefinition[];
9
+ /**
10
+ * Generate MCP prompts — one per tag as a "workflow" prompt.
11
+ */
12
+ export declare function buildPrompts(operations: OperationDescriptor[]): PromptDefinition[];
13
+ //# sourceMappingURL=resource-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-builder.d.ts","sourceRoot":"","sources":["../../src/transformer/resource-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAQ9E;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,kBAAkB,EAAE,CAyDtF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,gBAAgB,EAAE,CAyBlF"}
@@ -0,0 +1,87 @@
1
+ import { escapeTemplateLiteral, escapeStringLiteral, sanitizeIdentifier, } from '../utils/sanitize.js';
2
+ import { toToolName } from './naming.js';
3
+ /**
4
+ * Generate MCP resources from GET operations.
5
+ * - List endpoints (no path params) → static resources
6
+ * - Detail endpoints (with path params) → URI template resources
7
+ */
8
+ export function buildResources(operations) {
9
+ const resources = [];
10
+ for (const op of operations) {
11
+ // Operations dropped from the tool surface (x-mcp-emit: skip) must not leak
12
+ // back in as resources — mirror buildAllTools' skip handling.
13
+ if (op.mcpExtensions?.emit === 'skip')
14
+ continue;
15
+ if (op.method !== 'get')
16
+ continue;
17
+ const name = toToolName(op.operationId);
18
+ const description = escapeTemplateLiteral(op.summary ?? `${op.method.toUpperCase()} ${op.path}`);
19
+ if (!op.path.includes('{')) {
20
+ // Static resource — list endpoint
21
+ resources.push({
22
+ name,
23
+ uri: `api://${name}`,
24
+ path: op.path,
25
+ description,
26
+ });
27
+ }
28
+ else {
29
+ // Template resource — detail endpoint with path params
30
+ const pathParams = op.parameters.filter((p) => p.in === 'path').map((p) => p.name);
31
+ const uriTemplate = `api://${name}/${pathParams.map((p) => `{${p}}`).join('/')}`;
32
+ // Pre-compute URL body to avoid Handlebars/curly-brace conflicts.
33
+ // Resource handler receives (uri: URL, extra) — extract params from uri.pathname.
34
+ const urlLines = [];
35
+ urlLines.push(` const pathParts = uri.pathname.split('/').filter(Boolean);`);
36
+ urlLines.push(` let url = \`\${config.baseUrl}${escapeStringLiteral(op.path)}\`;`);
37
+ // Replace path params using positional extraction from the URI
38
+ const pathSegments = op.path.split('/').filter(Boolean);
39
+ for (let i = 0; i < pathSegments.length; i++) {
40
+ const seg = pathSegments[i];
41
+ if (seg.startsWith('{') && seg.endsWith('}')) {
42
+ const safe = sanitizeIdentifier(seg.slice(1, -1));
43
+ urlLines.push(` if (pathParts[${i}]) url = url.replace('${escapeStringLiteral(seg)}', encodeURIComponent(pathParts[${i}]));`);
44
+ }
45
+ }
46
+ resources.push({
47
+ name,
48
+ uri: uriTemplate,
49
+ path: op.path,
50
+ description,
51
+ isTemplate: true,
52
+ templateParams: pathParams,
53
+ urlBody: urlLines.join('\n'),
54
+ });
55
+ }
56
+ }
57
+ return resources;
58
+ }
59
+ /**
60
+ * Generate MCP prompts — one per tag as a "workflow" prompt.
61
+ */
62
+ export function buildPrompts(operations) {
63
+ const tagGroups = new Map();
64
+ for (const op of operations) {
65
+ if (op.mcpExtensions?.emit === 'skip')
66
+ continue;
67
+ const tag = op.tags[0] ?? 'default';
68
+ const existing = tagGroups.get(tag);
69
+ if (existing)
70
+ existing.push(op);
71
+ else
72
+ tagGroups.set(tag, [op]);
73
+ }
74
+ const prompts = [];
75
+ for (const [tag, ops] of tagGroups) {
76
+ const toolList = ops
77
+ .map((op) => `- ${toToolName(op.operationId)}: ${op.summary ?? op.path}`)
78
+ .join('\\n');
79
+ prompts.push({
80
+ name: `${tag}_workflow`,
81
+ description: escapeTemplateLiteral(`Work with ${tag} — available operations`),
82
+ template: escapeTemplateLiteral(`You have the following ${tag} tools available:\\n${toolList}\\n\\nWhat would you like to do?`),
83
+ });
84
+ }
85
+ return prompts;
86
+ }
87
+ //# sourceMappingURL=resource-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-builder.js","sourceRoot":"","sources":["../../src/transformer/resource-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { JsonSchema } from '../types/index.js';
2
+ /**
3
+ * Merge multiple JSON schemas into one that covers all observed fields.
4
+ * Uses a union approach: if a field appears in any sample, it's included
5
+ * (marked optional if not present in all samples).
6
+ */
7
+ export declare function mergeSchemas(schemas: JsonSchema[]): JsonSchema;
8
+ /**
9
+ * Merge request body schemas from multiple HAR entries in a cluster.
10
+ */
11
+ export declare function mergeRequestBodySchemas(bodies: Array<{
12
+ text: string;
13
+ mimeType: string;
14
+ }>): JsonSchema | undefined;
15
+ //# sourceMappingURL=schema-merger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-merger.d.ts","sourceRoot":"","sources":["../../src/transformer/schema-merger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,CA2C9D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GAChD,UAAU,GAAG,SAAS,CAcxB"}
@@ -0,0 +1,66 @@
1
+ import { inferJsonSchema } from './har-schema-inferrer.js';
2
+ /**
3
+ * Merge multiple JSON schemas into one that covers all observed fields.
4
+ * Uses a union approach: if a field appears in any sample, it's included
5
+ * (marked optional if not present in all samples).
6
+ */
7
+ export function mergeSchemas(schemas) {
8
+ if (schemas.length === 0)
9
+ return { type: 'object' };
10
+ if (schemas.length === 1)
11
+ return schemas[0];
12
+ // Only merge object schemas
13
+ if (!schemas.every((s) => s.type === 'object'))
14
+ return schemas[0];
15
+ const allProperties = new Map();
16
+ const requiredCounts = new Map();
17
+ for (const schema of schemas) {
18
+ const props = (schema.properties ?? {});
19
+ const required = new Set(schema.required ?? []);
20
+ for (const [key, propSchema] of Object.entries(props)) {
21
+ const existing = allProperties.get(key);
22
+ if (existing)
23
+ existing.push(propSchema);
24
+ else
25
+ allProperties.set(key, [propSchema]);
26
+ if (required.has(key)) {
27
+ requiredCounts.set(key, (requiredCounts.get(key) ?? 0) + 1);
28
+ }
29
+ }
30
+ }
31
+ const mergedProperties = {};
32
+ const mergedRequired = [];
33
+ for (const [key, propSchemas] of allProperties) {
34
+ // Use the most common type
35
+ mergedProperties[key] = propSchemas[0];
36
+ // Only required if present in ALL samples
37
+ if ((requiredCounts.get(key) ?? 0) === schemas.length) {
38
+ mergedRequired.push(key);
39
+ }
40
+ }
41
+ return {
42
+ type: 'object',
43
+ properties: mergedProperties,
44
+ ...(mergedRequired.length > 0 ? { required: mergedRequired } : {}),
45
+ };
46
+ }
47
+ /**
48
+ * Merge request body schemas from multiple HAR entries in a cluster.
49
+ */
50
+ export function mergeRequestBodySchemas(bodies) {
51
+ const schemas = [];
52
+ for (const body of bodies) {
53
+ if (!body.text || !body.mimeType.includes('json'))
54
+ continue;
55
+ try {
56
+ schemas.push(inferJsonSchema(JSON.parse(body.text)));
57
+ }
58
+ catch {
59
+ continue;
60
+ }
61
+ }
62
+ if (schemas.length === 0)
63
+ return undefined;
64
+ return mergeSchemas(schemas);
65
+ }
66
+ //# sourceMappingURL=schema-merger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-merger.js","sourceRoot":"","sources":["../../src/transformer/schema-merger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ export type StainlessMethodValue = string | {
2
+ endpoint?: string;
3
+ operationId?: string;
4
+ operation_id?: string;
5
+ method?: string;
6
+ path?: string;
7
+ mcp?: boolean | {
8
+ enabled?: boolean;
9
+ };
10
+ skip?: boolean;
11
+ paginated?: unknown;
12
+ [k: string]: unknown;
13
+ };
14
+ export interface StainlessResource {
15
+ methods?: Record<string, StainlessMethodValue>;
16
+ subresources?: Record<string, StainlessResource>;
17
+ models?: Record<string, string>;
18
+ [k: string]: unknown;
19
+ }
20
+ export interface StainlessOpt {
21
+ type?: string;
22
+ /** Custom env-var name the SDK/MCP reads the secret from (e.g. `ACME_API_KEY`). */
23
+ read_env?: string;
24
+ auth?: {
25
+ security_scheme?: string;
26
+ role?: string;
27
+ };
28
+ [k: string]: unknown;
29
+ }
30
+ export interface StainlessMcpServer {
31
+ /** Stainless's current default: a 2-tool code-execution + docs-search server. */
32
+ code?: boolean;
33
+ code_execution?: boolean;
34
+ tools?: string | string[];
35
+ docs_search?: boolean;
36
+ [k: string]: unknown;
37
+ }
38
+ export interface StainlessConfig {
39
+ 'config-version'?: number;
40
+ organization?: string;
41
+ /** Path to the referenced OpenAPI document. */
42
+ openapi?: string | {
43
+ path?: string;
44
+ spec?: string;
45
+ };
46
+ spec?: string;
47
+ /** Named base URLs: { production: "https://...", sandbox: "https://..." }. */
48
+ environments?: Record<string, string>;
49
+ client_settings?: {
50
+ opts?: Record<string, StainlessOpt>;
51
+ [k: string]: unknown;
52
+ };
53
+ security?: unknown;
54
+ resources?: Record<string, StainlessResource>;
55
+ settings?: {
56
+ /** Auto-unwrap a nested response envelope. `true` => `data`, or a prop name. */
57
+ unwrap_response?: boolean | string;
58
+ [k: string]: unknown;
59
+ };
60
+ targets?: Record<string, unknown>;
61
+ mcp_server?: StainlessMcpServer;
62
+ [k: string]: unknown;
63
+ }
64
+ /**
65
+ * Parse a `stainless.yml` (YAML, with a JSON fallback). Throws a clear error on
66
+ * malformed input or a non-object document.
67
+ */
68
+ export declare function parseStainlessConfig(raw: string): StainlessConfig;
69
+ /**
70
+ * Resolve the OpenAPI spec the Stainless config points at, relative to the
71
+ * config file's directory. An explicit `override` (the CLI `--spec` flag) wins.
72
+ * Returns `undefined` when neither the config nor the override names a spec.
73
+ */
74
+ export declare function resolveSpecPath(config: StainlessConfig, configPath: string, override?: string): string | undefined;
75
+ //# sourceMappingURL=stainless-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stainless-config.d.ts","sourceRoot":"","sources":["../../src/transformer/stainless-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Parsing + typing for a Stainless `stainless.yml` (openapi-stainless) config.
3
+ *
4
+ * Stainless was acquired by Anthropic (~May 2026) and its hosted MCP generator
5
+ * is winding down. This module reads the build config a Stainless user already
6
+ * has so `mcpmake from stainless` can reproduce the equivalent — owned, editable
7
+ * — MCP server. We only model the keys that affect the MCP tool surface or that
8
+ * the importer translates; everything else is ignored (forward-compatible).
9
+ */
10
+ import { resolve, dirname, isAbsolute } from 'node:path';
11
+ import { parse as parseYaml } from 'yaml';
12
+ /**
13
+ * Parse a `stainless.yml` (YAML, with a JSON fallback). Throws a clear error on
14
+ * malformed input or a non-object document.
15
+ */
16
+ export function parseStainlessConfig(raw) {
17
+ let doc;
18
+ try {
19
+ doc = parseYaml(raw);
20
+ }
21
+ catch {
22
+ // `yaml` accepts JSON too, but fall back explicitly for robustness.
23
+ try {
24
+ doc = JSON.parse(raw);
25
+ }
26
+ catch (err) {
27
+ throw new Error(`Could not parse Stainless config: ${err instanceof Error ? err.message : String(err)}`);
28
+ }
29
+ }
30
+ if (!doc || typeof doc !== 'object' || Array.isArray(doc)) {
31
+ throw new Error('Stainless config must be a YAML/JSON object.');
32
+ }
33
+ return doc;
34
+ }
35
+ /**
36
+ * Resolve the OpenAPI spec the Stainless config points at, relative to the
37
+ * config file's directory. An explicit `override` (the CLI `--spec` flag) wins.
38
+ * Returns `undefined` when neither the config nor the override names a spec.
39
+ */
40
+ export function resolveSpecPath(config, configPath, override) {
41
+ if (override)
42
+ return override;
43
+ let ref;
44
+ if (typeof config.openapi === 'string') {
45
+ ref = config.openapi;
46
+ }
47
+ else if (config.openapi && typeof config.openapi === 'object') {
48
+ ref = config.openapi.path ?? config.openapi.spec;
49
+ }
50
+ ref = ref ?? config.spec;
51
+ if (!ref)
52
+ return undefined;
53
+ // Leave URLs and absolute paths untouched; resolve relative paths against the
54
+ // config file's directory (the conventional Stainless layout).
55
+ if (/^https?:\/\//i.test(ref) || isAbsolute(ref))
56
+ return ref;
57
+ return resolve(dirname(configPath), ref);
58
+ }
59
+ //# sourceMappingURL=stainless-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stainless-config.js","sourceRoot":"","sources":["../../src/transformer/stainless-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAoE1C;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;QACpE,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,qCAAqC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACxF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,GAAsB,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAuB,EACvB,UAAkB,EAClB,QAAiB;IAEjB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,IAAI,GAAuB,CAAC;IAC5B,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvC,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;IACvB,CAAC;SAAM,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChE,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;IACnD,CAAC;IACD,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAE3B,8EAA8E;IAC9E,+DAA+D;IAC/D,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAC7D,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Translate a parsed Stainless config into mcpmake's overlay model by mutating
3
+ * the in-memory OpenAPI document, then return the structural knobs the command
4
+ * threads into generation (base URL / environments / auth override) plus a
5
+ * human-readable migration report.
6
+ *
7
+ * The mutation strategy is deliberate: mcpmake already honours `x-mcp-*`
8
+ * operation extensions (see `parser/operation-extractor.ts`), so injecting them
9
+ * onto the spec before extraction is the lowest-risk way to reproduce Stainless
10
+ * behaviour without a parallel override pipeline. Everything here is pure data —
11
+ * the only side effect is setting string-valued `x-mcp-*` keys on operations.
12
+ */
13
+ import type { OpenAPIV3 } from 'openapi-types';
14
+ import type { StainlessConfig } from './stainless-config.js';
15
+ export interface AuthOverride {
16
+ /** Pin the generated server to this OpenAPI security scheme (vs. emitting all). */
17
+ schemeName?: string;
18
+ /** Read the credential from this env var instead of mcpmake's default name. */
19
+ envVarName?: string;
20
+ }
21
+ export interface StainlessTranslation {
22
+ /** Map of `METHOD /path` → derived tool name, for the report and tests. */
23
+ toolNames: Record<string, string>;
24
+ /** Named base URLs to seed into the generated `MCP_ENVIRONMENTS`. */
25
+ environments?: Record<string, string>;
26
+ /** The environment selected by default (e.g. `production`). */
27
+ defaultEnvironment?: string;
28
+ /** Base URL chosen from the default environment (overrides the spec's). */
29
+ baseUrl?: string;
30
+ authOverride?: AuthOverride;
31
+ /** `METHOD /path` keys whose response was given an unwrap `jq` filter. */
32
+ unwrapped: string[];
33
+ /** `METHOD /path` keys dropped from the MCP tool surface. */
34
+ skipped: string[];
35
+ /** Stainless's 2-tool code-execution default was detected. */
36
+ codeMode: boolean;
37
+ docsSearch: boolean;
38
+ warnings: string[];
39
+ report: string[];
40
+ }
41
+ /**
42
+ * Mutates `api` in place (adding `x-mcp-*` extensions) and returns the derived
43
+ * generation knobs + migration report.
44
+ */
45
+ export declare function translateStainless(config: StainlessConfig, api: OpenAPIV3.Document): StainlessTranslation;
46
+ /**
47
+ * Reproduce Stainless's resource-tree tool naming: the SDK call
48
+ * `<resource>.<method>` becomes the tool `<method>_<singular resource chain>`,
49
+ * child-first — e.g. `cards.issuing.create` → `create_issuing_card`.
50
+ */
51
+ export declare function toolNameFromTree(methodName: string, chain: string[]): string;
52
+ export declare function singularize(word: string): string;
53
+ /**
54
+ * Coerce a Stainless `read_env` value into a valid POSIX-style env-var name so
55
+ * it is safe to emit as `process.env.<name>` / `os.environ.get("<name>")` in the
56
+ * generated code. (Real read_env values already look like `ACME_API_KEY`; this
57
+ * just guarantees an odd one can't produce invalid source.) Returns undefined
58
+ * when nothing usable remains.
59
+ */
60
+ export declare function sanitizeEnvVarName(raw: string): string | undefined;
61
+ //# sourceMappingURL=stainless-translator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stainless-translator.d.ts","sourceRoot":"","sources":["../../src/transformer/stainless-translator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,uBAAuB,CAAC;AAI/B,MAAM,WAAW,YAAY;IAC3B,mFAAmF;IACnF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,0EAA0E;IAC1E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,8DAA8D;IAC9D,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,SAAS,CAAC,QAAQ,GACtB,oBAAoB,CAwLtB;AA+HD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAK5E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhD;AA6DD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIlE"}