@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,375 @@
1
+ const HTTP_METHODS = new Set(['get', 'post', 'put', 'patch', 'delete', 'head', 'options']);
2
+ /**
3
+ * Mutates `api` in place (adding `x-mcp-*` extensions) and returns the derived
4
+ * generation knobs + migration report.
5
+ */
6
+ export function translateStainless(config, api) {
7
+ const warnings = [];
8
+ const report = [];
9
+ const toolNames = {};
10
+ const skipped = [];
11
+ const unwrapped = [];
12
+ // Distinct resources can singularize to the same name (e.g. `users` and
13
+ // `user`, both → `list_user`). buildAllTools' collision handler only appends
14
+ // the HTTP method, which still collides when the verb matches — so make the
15
+ // names we assign unique up front by suffixing `_2`, `_3`, …
16
+ const assignedNames = new Set();
17
+ const claimName = (base) => {
18
+ let name = base;
19
+ for (let n = 2; assignedNames.has(name); n++)
20
+ name = `${base}_${n}`;
21
+ assignedNames.add(name);
22
+ return name;
23
+ };
24
+ // 1. Resource-tree-driven naming → x-mcp-name (the headline parity item).
25
+ if (config.resources && typeof config.resources === 'object') {
26
+ walkResources(config.resources, [], (methodName, value, chain) => {
27
+ const ptr = parseMethodPointer(value);
28
+ const op = locateOperation(api, ptr);
29
+ if (!op) {
30
+ warnings.push(`Resource method "${chain.join('.')}.${methodName}" did not match any operation in the spec — skipped.`);
31
+ return;
32
+ }
33
+ const key = ptr.method && ptr.path ? `${ptr.method.toUpperCase()} ${ptr.path}` : opKey(op);
34
+ if (isMethodSkipped(value)) {
35
+ op['x-mcp-emit'] = 'skip';
36
+ skipped.push(key);
37
+ return;
38
+ }
39
+ const derived = toolNameFromTree(methodName, chain);
40
+ if (derived && !op['x-mcp-name']) {
41
+ const name = claimName(derived);
42
+ op['x-mcp-name'] = name;
43
+ toolNames[key] = name;
44
+ }
45
+ });
46
+ }
47
+ // 1b. Fallback: resource/method encoded as `x-stainless-*` operation extensions
48
+ // (common when the tree lives in the spec rather than the config).
49
+ forEachOperation(api, (op, method, path) => {
50
+ const key = `${method.toUpperCase()} ${path}`;
51
+ const sResource = typeof op['x-stainless-resource'] === 'string'
52
+ ? op['x-stainless-resource']
53
+ : undefined;
54
+ const sMethod = typeof op['x-stainless-method-name'] === 'string'
55
+ ? op['x-stainless-method-name']
56
+ : undefined;
57
+ if (isStainlessSkipped(op)) {
58
+ if (op['x-mcp-emit'] !== 'skip') {
59
+ op['x-mcp-emit'] = 'skip';
60
+ skipped.push(key);
61
+ }
62
+ return;
63
+ }
64
+ if (sResource && sMethod && !op['x-mcp-name']) {
65
+ const derived = toolNameFromTree(sMethod, sResource.split('.').filter(Boolean));
66
+ if (derived) {
67
+ const name = claimName(derived);
68
+ op['x-mcp-name'] = name;
69
+ toolNames[key] = name;
70
+ }
71
+ }
72
+ });
73
+ // 2. unwrap_response → x-mcp-jq-filter on the success response.
74
+ const unwrap = config.settings?.unwrap_response;
75
+ if (unwrap) {
76
+ // A string names the envelope property. Validate it to a safe dotted path —
77
+ // the value is emitted into a generated `applyJqFilter(result, '.<prop>')`
78
+ // call, so reject anything that could break out of that string literal.
79
+ let explicitProp;
80
+ if (typeof unwrap === 'string') {
81
+ const candidate = unwrap.replace(/^\./, '').trim();
82
+ if (/^[A-Za-z0-9_.]+$/.test(candidate)) {
83
+ explicitProp = candidate;
84
+ }
85
+ else {
86
+ warnings.push(`Ignoring settings.unwrap_response "${unwrap}" — not a simple property path ([A-Za-z0-9_.]).`);
87
+ }
88
+ }
89
+ if (typeof unwrap !== 'string' || explicitProp) {
90
+ forEachOperation(api, (op, method, path) => {
91
+ if (op['x-mcp-emit'] === 'skip' || op['x-mcp-jq-filter'])
92
+ return;
93
+ const key = `${method.toUpperCase()} ${path}`;
94
+ if (explicitProp) {
95
+ op['x-mcp-jq-filter'] = `.${explicitProp}`;
96
+ unwrapped.push(key);
97
+ }
98
+ else {
99
+ // Boolean `true`: only unwrap when the success schema actually has a
100
+ // `data` envelope, so non-enveloped responses are left untouched.
101
+ const schema = successSchema(op);
102
+ if (schema && hasProperty(schema, 'data')) {
103
+ op['x-mcp-jq-filter'] = '.data';
104
+ unwrapped.push(key);
105
+ }
106
+ }
107
+ });
108
+ }
109
+ }
110
+ // 3. Named environments → base URL + MCP_ENVIRONMENTS seed.
111
+ let environments;
112
+ let defaultEnvironment;
113
+ let baseUrl;
114
+ if (config.environments && typeof config.environments === 'object') {
115
+ const entries = Object.entries(config.environments).filter(([, v]) => typeof v === 'string' && v);
116
+ if (entries.length > 0) {
117
+ environments = Object.fromEntries(entries);
118
+ defaultEnvironment = 'production' in environments ? 'production' : entries[0][0];
119
+ baseUrl = environments[defaultEnvironment];
120
+ report.push(`Environments: ${entries.map(([n]) => n).join(', ')} (default "${defaultEnvironment}" → ${baseUrl}).`);
121
+ }
122
+ }
123
+ // 4. Auth: pick a security scheme and/or rename its env var (read_env).
124
+ const authOverride = deriveAuthOverride(config);
125
+ if (authOverride) {
126
+ if (authOverride.schemeName) {
127
+ report.push(`Auth: pinned to security scheme "${authOverride.schemeName}".`);
128
+ }
129
+ if (authOverride.envVarName) {
130
+ report.push(`Auth: credential read from env var "${authOverride.envVarName}" (read_env).`);
131
+ }
132
+ }
133
+ // 5. Code-mode detection (Stainless's current 2-tool default).
134
+ const mcp = resolveMcpServer(config);
135
+ const codeMode = !!(mcp &&
136
+ (mcp.code === true ||
137
+ mcp.code_execution === true ||
138
+ mcp.tools === 'code' ||
139
+ (Array.isArray(mcp.tools) && mcp.tools.includes('code'))));
140
+ const docsSearch = !!(mcp && mcp.docs_search === true);
141
+ if (codeMode) {
142
+ warnings.push('Stainless code-mode MCP server detected (a sandboxed code-execution tool + docs-search). ' +
143
+ 'mcpmake has no sandbox/code-exec equivalent — generating OWNED, editable per-endpoint ' +
144
+ 'tools instead. For large APIs add --dynamic-discovery (search_tools + on-demand schemas) ' +
145
+ 'as the token-efficiency analog.');
146
+ }
147
+ if (Object.keys(toolNames).length > 0) {
148
+ report.push(`Tool names: derived ${Object.keys(toolNames).length} name(s) from the resource tree.`);
149
+ }
150
+ if (unwrapped.length > 0) {
151
+ report.push(`Response unwrap: applied a jq filter to ${unwrapped.length} operation(s).`);
152
+ }
153
+ if (skipped.length > 0) {
154
+ report.push(`Excluded ${skipped.length} operation(s) marked non-MCP in the Stainless config.`);
155
+ }
156
+ return {
157
+ toolNames,
158
+ environments,
159
+ defaultEnvironment,
160
+ baseUrl,
161
+ authOverride,
162
+ unwrapped,
163
+ skipped,
164
+ codeMode,
165
+ docsSearch,
166
+ warnings,
167
+ report,
168
+ };
169
+ }
170
+ // ---------------------------------------------------------------------------
171
+ // Resource tree
172
+ // ---------------------------------------------------------------------------
173
+ function walkResources(resources, chain, visit) {
174
+ for (const [resourceName, resource] of Object.entries(resources)) {
175
+ if (!resource || typeof resource !== 'object')
176
+ continue;
177
+ const here = [...chain, resourceName];
178
+ if (resource.methods && typeof resource.methods === 'object') {
179
+ for (const [methodName, value] of Object.entries(resource.methods)) {
180
+ visit(methodName, value, here);
181
+ }
182
+ }
183
+ if (resource.subresources && typeof resource.subresources === 'object') {
184
+ walkResources(resource.subresources, here, visit);
185
+ }
186
+ }
187
+ }
188
+ function parseMethodPointer(value) {
189
+ if (typeof value === 'string') {
190
+ const parts = value.trim().split(/\s+/);
191
+ if (parts.length >= 2 && HTTP_METHODS.has(parts[0].toLowerCase())) {
192
+ return { method: parts[0].toLowerCase(), path: parts.slice(1).join(' ') };
193
+ }
194
+ return { operationId: value.trim() };
195
+ }
196
+ if (value && typeof value === 'object') {
197
+ if (typeof value.endpoint === 'string') {
198
+ const parts = value.endpoint.trim().split(/\s+/);
199
+ if (parts.length >= 2 && HTTP_METHODS.has(parts[0].toLowerCase())) {
200
+ return { method: parts[0].toLowerCase(), path: parts.slice(1).join(' ') };
201
+ }
202
+ }
203
+ return {
204
+ method: typeof value.method === 'string' ? value.method.toLowerCase() : undefined,
205
+ path: typeof value.path === 'string' ? value.path : undefined,
206
+ operationId: (typeof value.operationId === 'string' && value.operationId) ||
207
+ (typeof value.operation_id === 'string' && value.operation_id) ||
208
+ undefined,
209
+ };
210
+ }
211
+ return {};
212
+ }
213
+ function locateOperation(api, ptr) {
214
+ if (ptr.method && ptr.path) {
215
+ const op = getOperation(api, ptr.method, ptr.path);
216
+ if (op)
217
+ return op;
218
+ }
219
+ if (ptr.operationId) {
220
+ return getOperationById(api, ptr.operationId);
221
+ }
222
+ return undefined;
223
+ }
224
+ function getOperation(api, method, path) {
225
+ const pathItem = api.paths?.[path];
226
+ if (!pathItem || typeof pathItem !== 'object')
227
+ return undefined;
228
+ const op = pathItem[method];
229
+ return op && typeof op === 'object' ? op : undefined;
230
+ }
231
+ function getOperationById(api, operationId) {
232
+ let found;
233
+ forEachOperation(api, (op) => {
234
+ if (!found && op.operationId === operationId)
235
+ found = op;
236
+ });
237
+ return found;
238
+ }
239
+ function forEachOperation(api, visit) {
240
+ for (const [path, pathItem] of Object.entries(api.paths ?? {})) {
241
+ if (!pathItem || typeof pathItem !== 'object')
242
+ continue;
243
+ for (const method of HTTP_METHODS) {
244
+ const op = pathItem[method];
245
+ if (op && typeof op === 'object')
246
+ visit(op, method, path);
247
+ }
248
+ }
249
+ }
250
+ function opKey(op) {
251
+ const id = typeof op.operationId === 'string' ? op.operationId : 'op';
252
+ return id;
253
+ }
254
+ function isMethodSkipped(value) {
255
+ if (value && typeof value === 'object') {
256
+ if (value.skip === true)
257
+ return true;
258
+ if (value.mcp === false)
259
+ return true;
260
+ if (value.mcp && typeof value.mcp === 'object' && value.mcp.enabled === false)
261
+ return true;
262
+ }
263
+ return false;
264
+ }
265
+ function isStainlessSkipped(op) {
266
+ if (op['x-stainless-skip'] === true)
267
+ return true;
268
+ if (op['x-stainless-mcp'] === false)
269
+ return true;
270
+ return false;
271
+ }
272
+ // ---------------------------------------------------------------------------
273
+ // Naming
274
+ // ---------------------------------------------------------------------------
275
+ /**
276
+ * Reproduce Stainless's resource-tree tool naming: the SDK call
277
+ * `<resource>.<method>` becomes the tool `<method>_<singular resource chain>`,
278
+ * child-first — e.g. `cards.issuing.create` → `create_issuing_card`.
279
+ */
280
+ export function toolNameFromTree(methodName, chain) {
281
+ const method = methodName === 'del' ? 'delete' : methodName;
282
+ const tail = chain.slice().reverse().map(singularize).map(toSnake).filter(Boolean);
283
+ const head = toSnake(method);
284
+ return [head, ...tail].filter(Boolean).join('_');
285
+ }
286
+ export function singularize(word) {
287
+ if (/ies$/i.test(word))
288
+ return word.replace(/ies$/i, 'y');
289
+ if (/(ss|us|is)$/i.test(word))
290
+ return word; // status, focus, analysis — leave alone
291
+ if (/(s|x|z|ch|sh)es$/i.test(word))
292
+ return word.replace(/es$/i, '');
293
+ if (/s$/i.test(word))
294
+ return word.replace(/s$/i, '');
295
+ return word;
296
+ }
297
+ function toSnake(word) {
298
+ return word
299
+ .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
300
+ .replace(/[\s./-]+/g, '_')
301
+ .replace(/[^a-zA-Z0-9_]/g, '_')
302
+ .replace(/_+/g, '_')
303
+ .replace(/^_|_$/g, '')
304
+ .toLowerCase();
305
+ }
306
+ // ---------------------------------------------------------------------------
307
+ // Responses / auth / mcp
308
+ // ---------------------------------------------------------------------------
309
+ function successSchema(op) {
310
+ const responses = op.responses;
311
+ if (!responses)
312
+ return undefined;
313
+ const response = (responses['200'] ?? responses['201']);
314
+ const content = response?.content;
315
+ const media = content?.['application/json'];
316
+ const schema = media?.schema;
317
+ return schema && typeof schema === 'object' ? schema : undefined;
318
+ }
319
+ function hasProperty(schema, prop) {
320
+ const props = schema.properties;
321
+ if (props && typeof props === 'object' && prop in props)
322
+ return true;
323
+ // Dereferenced specs (e.g. Stripe-style list envelopes) often compose the
324
+ // envelope as `allOf`/`oneOf`/`anyOf` rather than a flat `properties`.
325
+ for (const key of ['allOf', 'oneOf', 'anyOf']) {
326
+ const members = schema[key];
327
+ if (Array.isArray(members) &&
328
+ members.some((m) => m && typeof m === 'object' && hasProperty(m, prop))) {
329
+ return true;
330
+ }
331
+ }
332
+ return false;
333
+ }
334
+ function deriveAuthOverride(config) {
335
+ const opts = config.client_settings?.opts;
336
+ if (!opts || typeof opts !== 'object')
337
+ return undefined;
338
+ for (const opt of Object.values(opts)) {
339
+ if (!opt || typeof opt !== 'object')
340
+ continue;
341
+ const schemeName = opt.auth && typeof opt.auth === 'object' && typeof opt.auth.security_scheme === 'string'
342
+ ? opt.auth.security_scheme
343
+ : undefined;
344
+ const envVarName = typeof opt.read_env === 'string' ? sanitizeEnvVarName(opt.read_env) : undefined;
345
+ if (schemeName || envVarName)
346
+ return { schemeName, envVarName };
347
+ }
348
+ return undefined;
349
+ }
350
+ /**
351
+ * Coerce a Stainless `read_env` value into a valid POSIX-style env-var name so
352
+ * it is safe to emit as `process.env.<name>` / `os.environ.get("<name>")` in the
353
+ * generated code. (Real read_env values already look like `ACME_API_KEY`; this
354
+ * just guarantees an odd one can't produce invalid source.) Returns undefined
355
+ * when nothing usable remains.
356
+ */
357
+ export function sanitizeEnvVarName(raw) {
358
+ let name = raw.trim().replace(/[^A-Za-z0-9_]/g, '_');
359
+ if (name && /^[0-9]/.test(name))
360
+ name = `_${name}`;
361
+ return name.length > 0 ? name : undefined;
362
+ }
363
+ function resolveMcpServer(config) {
364
+ if (config.mcp_server && typeof config.mcp_server === 'object') {
365
+ return config.mcp_server;
366
+ }
367
+ const targets = config.targets;
368
+ if (targets && typeof targets === 'object') {
369
+ const candidate = targets.mcp_server ?? targets.mcp;
370
+ if (candidate && typeof candidate === 'object')
371
+ return candidate;
372
+ }
373
+ return undefined;
374
+ }
375
+ //# sourceMappingURL=stainless-translator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stainless-translator.js","sourceRoot":"","sources":["../../src/transformer/stainless-translator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { OperationDescriptor, ToolDefinition } from '../types/index.js';
2
+ export declare function buildToolDefinition(op: OperationDescriptor): ToolDefinition;
3
+ export declare function buildAllTools(operations: OperationDescriptor[]): ToolDefinition[];
4
+ //# sourceMappingURL=tool-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-builder.d.ts","sourceRoot":"","sources":["../../src/transformer/tool-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AAczF,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,mBAAmB,GAAG,cAAc,CA6D3E;AAkDD,wBAAgB,aAAa,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,cAAc,EAAE,CA2BjF"}
@@ -0,0 +1,119 @@
1
+ import { buildOperationInputSchema, jsonSchemaToOutputZodCode, } from '../parser/schema-converter.js';
2
+ import { toToolName, toToolTitle, toFileName, toFunctionName } from './naming.js';
3
+ import { escapeTemplateLiteral, escapeStringLiteral, sanitizeIdentifier, sanitizePathTemplate, } from '../utils/sanitize.js';
4
+ export function buildToolDefinition(op) {
5
+ const inputSchemaCode = buildOperationInputSchema(op);
6
+ const descParts = [];
7
+ if (op.summary)
8
+ descParts.push(op.summary);
9
+ if (op.description && op.description !== op.summary)
10
+ descParts.push(op.description);
11
+ if (op.deprecated)
12
+ descParts.push('[DEPRECATED]');
13
+ if (op.mcpExtensions?.deprecationMessage) {
14
+ descParts.push(`[DEPRECATED: ${op.mcpExtensions.deprecationMessage}]`);
15
+ }
16
+ if (op.mcpExtensions?.deprecationReplacement) {
17
+ descParts.push(`Use ${op.mcpExtensions.deprecationReplacement} instead.`);
18
+ }
19
+ const description = escapeTemplateLiteral(descParts.join(' — ') || `${op.method.toUpperCase()} ${op.path}`);
20
+ const pathParams = op.parameters.filter((p) => p.in === 'path').map((p) => p.name);
21
+ const queryParams = op.parameters.filter((p) => p.in === 'query').map((p) => p.name);
22
+ // Apply x-mcp-* extension overrides
23
+ const mcpName = op.mcpExtensions?.name;
24
+ const mcpDesc = op.mcpExtensions?.description;
25
+ // Output schema from 200 response
26
+ const successResponse = op.responses.find((r) => r.statusCode === '200' || r.statusCode === '201');
27
+ const outputSchemaCode = successResponse?.schema
28
+ ? jsonSchemaToOutputZodCode(successResponse.schema)
29
+ : undefined;
30
+ // Annotations from HTTP method semantics
31
+ const annotations = buildAnnotations(op.method);
32
+ return {
33
+ name: mcpName ? sanitizeIdentifier(mcpName) : toToolName(op.operationId),
34
+ title: mcpName ? mcpName : toToolTitle(op.operationId),
35
+ description: mcpDesc ? escapeTemplateLiteral(mcpDesc) : description,
36
+ inputSchemaCode,
37
+ outputSchemaCode,
38
+ operationId: op.operationId,
39
+ method: op.method,
40
+ pathTemplate: op.path,
41
+ pathParams,
42
+ queryParams,
43
+ headerParams: op.parameters.filter((p) => p.in === 'header').map((p) => p.name),
44
+ hasRequestBody: !!op.requestBody,
45
+ requestBodyContentType: op.requestBody?.contentType ?? 'application/json',
46
+ fileName: toFileName(op.operationId),
47
+ functionName: toFunctionName(op.operationId),
48
+ buildUrlBody: generateBuildUrlBody(op.path, pathParams, queryParams),
49
+ annotations,
50
+ isAsync: op.responses.some((r) => r.statusCode === '202'),
51
+ isDestructive: op.method === 'delete',
52
+ // Escaped because it is emitted into a single-quoted string literal
53
+ // (`applyJqFilter(result, '<jqFilter>')`) in the tool-handler template.
54
+ jqFilter: op.mcpExtensions?.jqFilter
55
+ ? escapeStringLiteral(op.mcpExtensions.jqFilter)
56
+ : undefined,
57
+ };
58
+ }
59
+ function buildAnnotations(method) {
60
+ switch (method) {
61
+ case 'get':
62
+ case 'head':
63
+ case 'options':
64
+ return { readOnlyHint: true };
65
+ case 'delete':
66
+ return { destructiveHint: true };
67
+ case 'put':
68
+ return { idempotentHint: true };
69
+ default:
70
+ return undefined;
71
+ }
72
+ }
73
+ function generateBuildUrlBody(pathTemplate, pathParams, queryParams) {
74
+ const safePath = sanitizePathTemplate(pathTemplate);
75
+ const lines = [];
76
+ lines.push(` let url = baseUrl + '${escapeStringLiteral(safePath)}';`);
77
+ for (const p of pathParams) {
78
+ const safeP = sanitizeIdentifier(p);
79
+ lines.push(` url = url.replace('${escapeStringLiteral(`{${safeP}}`)}', encodeURIComponent(String(params['${escapeStringLiteral(safeP)}'])));`);
80
+ }
81
+ if (queryParams.length > 0) {
82
+ lines.push(' const query = new URLSearchParams();');
83
+ for (const q of queryParams) {
84
+ const safeQ = sanitizeIdentifier(q);
85
+ lines.push(` if (params['${escapeStringLiteral(safeQ)}'] !== undefined) query.set('${escapeStringLiteral(safeQ)}', String(params['${escapeStringLiteral(safeQ)}']));`);
86
+ }
87
+ lines.push(' const qs = query.toString();');
88
+ lines.push(' return qs ? `${url}?${qs}` : url;');
89
+ }
90
+ else {
91
+ lines.push(' return url;');
92
+ }
93
+ return lines.join('\n');
94
+ }
95
+ export function buildAllTools(operations) {
96
+ // Filter out operations marked with x-mcp-emit: skip
97
+ const filtered = operations.filter((op) => op.mcpExtensions?.emit !== 'skip');
98
+ const tools = filtered.map(buildToolDefinition);
99
+ // Handle name collisions by appending method
100
+ const nameCount = new Map();
101
+ for (const t of tools) {
102
+ nameCount.set(t.name, (nameCount.get(t.name) ?? 0) + 1);
103
+ }
104
+ for (const tool of tools) {
105
+ if ((nameCount.get(tool.name) ?? 0) > 1) {
106
+ tool.name = `${tool.name}_${tool.method}`;
107
+ tool.fileName = `${tool.fileName}-${tool.method}`;
108
+ tool.functionName = `${tool.functionName}${tool.method.charAt(0).toUpperCase() + tool.method.slice(1)}`;
109
+ }
110
+ }
111
+ // Enforce MCP spec name length limit (128 chars)
112
+ for (const tool of tools) {
113
+ if (tool.name.length > 128) {
114
+ tool.name = tool.name.slice(0, 128);
115
+ }
116
+ }
117
+ return tools;
118
+ }
119
+ //# sourceMappingURL=tool-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-builder.js","sourceRoot":"","sources":["../../src/transformer/tool-builder.ts"],"names":[],"mappings":"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"}