@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.
- package/dist/analyzer/auth-detector.d.ts +13 -0
- package/dist/analyzer/auth-detector.d.ts.map +1 -0
- package/dist/analyzer/auth-detector.js +143 -0
- package/dist/analyzer/auth-detector.js.map +1 -0
- package/dist/analyzer/dom-parser.d.ts +11 -0
- package/dist/analyzer/dom-parser.d.ts.map +1 -0
- package/dist/analyzer/dom-parser.js +260 -0
- package/dist/analyzer/dom-parser.js.map +1 -0
- package/dist/analyzer/goal-crawler.d.ts +26 -0
- package/dist/analyzer/goal-crawler.d.ts.map +1 -0
- package/dist/analyzer/goal-crawler.js +178 -0
- package/dist/analyzer/goal-crawler.js.map +1 -0
- package/dist/analyzer/hybrid-detector.d.ts +29 -0
- package/dist/analyzer/hybrid-detector.d.ts.map +1 -0
- package/dist/analyzer/hybrid-detector.js +97 -0
- package/dist/analyzer/hybrid-detector.js.map +1 -0
- package/dist/analyzer/index.d.ts +13 -0
- package/dist/analyzer/index.d.ts.map +1 -0
- package/dist/analyzer/index.js +9 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/analyzer/screenshot-capture.d.ts +30 -0
- package/dist/analyzer/screenshot-capture.d.ts.map +1 -0
- package/dist/analyzer/screenshot-capture.js +43 -0
- package/dist/analyzer/screenshot-capture.js.map +1 -0
- package/dist/analyzer/selector-builder.d.ts +20 -0
- package/dist/analyzer/selector-builder.d.ts.map +1 -0
- package/dist/analyzer/selector-builder.js +200 -0
- package/dist/analyzer/selector-builder.js.map +1 -0
- package/dist/analyzer/semantic-analyzer.d.ts +14 -0
- package/dist/analyzer/semantic-analyzer.d.ts.map +1 -0
- package/dist/analyzer/semantic-analyzer.js +146 -0
- package/dist/analyzer/semantic-analyzer.js.map +1 -0
- package/dist/analyzer/site-crawler.d.ts +39 -0
- package/dist/analyzer/site-crawler.d.ts.map +1 -0
- package/dist/analyzer/site-crawler.js +236 -0
- package/dist/analyzer/site-crawler.js.map +1 -0
- package/dist/config/configurable-command.d.ts +14 -0
- package/dist/config/configurable-command.d.ts.map +1 -0
- package/dist/config/configurable-command.js +71 -0
- package/dist/config/configurable-command.js.map +1 -0
- package/dist/config/mcpmake-config.d.ts +69 -0
- package/dist/config/mcpmake-config.d.ts.map +1 -0
- package/dist/config/mcpmake-config.js +209 -0
- package/dist/config/mcpmake-config.js.map +1 -0
- package/dist/emitter/code-writer.d.ts +9 -0
- package/dist/emitter/code-writer.d.ts.map +1 -0
- package/dist/emitter/code-writer.js +26 -0
- package/dist/emitter/code-writer.js.map +1 -0
- package/dist/emitter/index.d.ts +33 -0
- package/dist/emitter/index.d.ts.map +1 -0
- package/dist/emitter/index.js +297 -0
- package/dist/emitter/index.js.map +1 -0
- package/dist/emitter/mcpb-bundler.d.ts +32 -0
- package/dist/emitter/mcpb-bundler.d.ts.map +1 -0
- package/dist/emitter/mcpb-bundler.js +173 -0
- package/dist/emitter/mcpb-bundler.js.map +1 -0
- package/dist/emitter/project-scaffolder.d.ts +5 -0
- package/dist/emitter/project-scaffolder.d.ts.map +1 -0
- package/dist/emitter/project-scaffolder.js +101 -0
- package/dist/emitter/project-scaffolder.js.map +1 -0
- package/dist/emitter/python-template-loader.d.ts +5 -0
- package/dist/emitter/python-template-loader.d.ts.map +1 -0
- package/dist/emitter/python-template-loader.js +31 -0
- package/dist/emitter/python-template-loader.js.map +1 -0
- package/dist/emitter/python-templates/dockerfile.hbs +14 -0
- package/dist/emitter/python-templates/env.example.hbs +12 -0
- package/dist/emitter/python-templates/requirements.txt.hbs +4 -0
- package/dist/emitter/python-templates/server.py.hbs +93 -0
- package/dist/emitter/site-scaffolder.d.ts +14 -0
- package/dist/emitter/site-scaffolder.d.ts.map +1 -0
- package/dist/emitter/site-scaffolder.js +71 -0
- package/dist/emitter/site-scaffolder.js.map +1 -0
- package/dist/emitter/site-template-loader.d.ts +6 -0
- package/dist/emitter/site-template-loader.d.ts.map +1 -0
- package/dist/emitter/site-template-loader.js +48 -0
- package/dist/emitter/site-template-loader.js.map +1 -0
- package/dist/emitter/site-templates/browser-manager.ts.hbs +233 -0
- package/dist/emitter/site-templates/config.ts.hbs +28 -0
- package/dist/emitter/site-templates/dockerfile.hbs +31 -0
- package/dist/emitter/site-templates/env.example.hbs +19 -0
- package/dist/emitter/site-templates/package.json.hbs +26 -0
- package/dist/emitter/site-templates/server-main-http.ts.hbs +108 -0
- package/dist/emitter/site-templates/server-main.ts.hbs +23 -0
- package/dist/emitter/site-templates/tool-handler-action.ts.hbs +86 -0
- package/dist/emitter/site-templates/tool-handler-form.ts.hbs +116 -0
- package/dist/emitter/site-templates/tool-handler-lifecycle.ts.hbs +146 -0
- package/dist/emitter/site-templates/tool-index.ts.hbs +11 -0
- package/dist/emitter/template-loader.d.ts +2 -0
- package/dist/emitter/template-loader.d.ts.map +1 -0
- package/dist/emitter/template-loader.js +28 -0
- package/dist/emitter/template-loader.js.map +1 -0
- package/dist/emitter/templates/auth-provider.ts.hbs +57 -0
- package/dist/emitter/templates/config.ts.hbs +110 -0
- package/dist/emitter/templates/discovery.ts.hbs +320 -0
- package/dist/emitter/templates/dockerfile.hbs +34 -0
- package/dist/emitter/templates/env.example.hbs +52 -0
- package/dist/emitter/templates/gitignore.hbs +5 -0
- package/dist/emitter/templates/http-executor.ts.hbs +159 -0
- package/dist/emitter/templates/oauth.ts.hbs +188 -0
- package/dist/emitter/templates/package.json.hbs +25 -0
- package/dist/emitter/templates/prompts.ts.hbs +22 -0
- package/dist/emitter/templates/readme.md.hbs +156 -0
- package/dist/emitter/templates/resources.ts.hbs +63 -0
- package/dist/emitter/templates/response-filter.ts.hbs +128 -0
- package/dist/emitter/templates/server-main-http.ts.hbs +442 -0
- package/dist/emitter/templates/server-main.ts.hbs +40 -0
- package/dist/emitter/templates/task-handlers.ts.hbs +189 -0
- package/dist/emitter/templates/task-manager.ts.hbs +139 -0
- package/dist/emitter/templates/task-sse.ts.hbs +105 -0
- package/dist/emitter/templates/tool-handler.ts.hbs +142 -0
- package/dist/emitter/templates/tool-index.ts.hbs +42 -0
- package/dist/emitter/templates/tool-test.ts.hbs +57 -0
- package/dist/emitter/templates/trace.ts.hbs +79 -0
- package/dist/emitter/templates/tsconfig.json.hbs +16 -0
- package/dist/emitter/templates/types.ts.hbs +5 -0
- package/dist/emitter/worker-template-loader.d.ts +6 -0
- package/dist/emitter/worker-template-loader.d.ts.map +1 -0
- package/dist/emitter/worker-template-loader.js +34 -0
- package/dist/emitter/worker-template-loader.js.map +1 -0
- package/dist/emitter/worker-templates/config.ts.hbs +93 -0
- package/dist/emitter/worker-templates/dev-vars.example.hbs +27 -0
- package/dist/emitter/worker-templates/gitignore.hbs +6 -0
- package/dist/emitter/worker-templates/package.json.hbs +24 -0
- package/dist/emitter/worker-templates/readme.md.hbs +73 -0
- package/dist/emitter/worker-templates/server.test.ts.hbs +20 -0
- package/dist/emitter/worker-templates/tool-handler.ts.hbs +103 -0
- package/dist/emitter/worker-templates/tool-index.ts.hbs +28 -0
- package/dist/emitter/worker-templates/tsconfig.json.hbs +17 -0
- package/dist/emitter/worker-templates/worker.ts.hbs +286 -0
- package/dist/emitter/worker-templates/wrangler.toml.hbs +19 -0
- package/dist/generator/spec-generator.d.ts +7 -0
- package/dist/generator/spec-generator.d.ts.map +1 -0
- package/dist/generator/spec-generator.js +51 -0
- package/dist/generator/spec-generator.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/har-filter.d.ts +9 -0
- package/dist/parser/har-filter.d.ts.map +1 -0
- package/dist/parser/har-filter.js +72 -0
- package/dist/parser/har-filter.js.map +1 -0
- package/dist/parser/har-loader.d.ts +3 -0
- package/dist/parser/har-loader.d.ts.map +1 -0
- package/dist/parser/har-loader.js +15 -0
- package/dist/parser/har-loader.js.map +1 -0
- package/dist/parser/har-normalizer.d.ts +21 -0
- package/dist/parser/har-normalizer.d.ts.map +1 -0
- package/dist/parser/har-normalizer.js +79 -0
- package/dist/parser/har-normalizer.js.map +1 -0
- package/dist/parser/index.d.ts +11 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +7 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/openapi-loader.d.ts +7 -0
- package/dist/parser/openapi-loader.d.ts.map +1 -0
- package/dist/parser/openapi-loader.js +309 -0
- package/dist/parser/openapi-loader.js.map +1 -0
- package/dist/parser/operation-extractor.d.ts +14 -0
- package/dist/parser/operation-extractor.d.ts.map +1 -0
- package/dist/parser/operation-extractor.js +156 -0
- package/dist/parser/operation-extractor.js.map +1 -0
- package/dist/parser/overlay-loader.d.ts +11 -0
- package/dist/parser/overlay-loader.d.ts.map +1 -0
- package/dist/parser/overlay-loader.js +185 -0
- package/dist/parser/overlay-loader.js.map +1 -0
- package/dist/parser/postman-loader.d.ts +10 -0
- package/dist/parser/postman-loader.d.ts.map +1 -0
- package/dist/parser/postman-loader.js +107 -0
- package/dist/parser/postman-loader.js.map +1 -0
- package/dist/parser/schema-converter.d.ts +13 -0
- package/dist/parser/schema-converter.d.ts.map +1 -0
- package/dist/parser/schema-converter.js +118 -0
- package/dist/parser/schema-converter.js.map +1 -0
- package/dist/plugins/adapter.d.ts +41 -0
- package/dist/plugins/adapter.d.ts.map +1 -0
- package/dist/plugins/adapter.js +16 -0
- package/dist/plugins/adapter.js.map +1 -0
- package/dist/plugins/loader.d.ts +26 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +59 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/pricing.d.ts +56 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +134 -0
- package/dist/pricing.js.map +1 -0
- package/dist/providers/index.d.ts +16 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +57 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/recorder/browser-recorder.d.ts +23 -0
- package/dist/recorder/browser-recorder.d.ts.map +1 -0
- package/dist/recorder/browser-recorder.js +206 -0
- package/dist/recorder/browser-recorder.js.map +1 -0
- package/dist/rescan/diff-engine.d.ts +6 -0
- package/dist/rescan/diff-engine.d.ts.map +1 -0
- package/dist/rescan/diff-engine.js +313 -0
- package/dist/rescan/diff-engine.js.map +1 -0
- package/dist/rescan/index.d.ts +4 -0
- package/dist/rescan/index.d.ts.map +1 -0
- package/dist/rescan/index.js +3 -0
- package/dist/rescan/index.js.map +1 -0
- package/dist/rescan/rescan-runner.d.ts +43 -0
- package/dist/rescan/rescan-runner.d.ts.map +1 -0
- package/dist/rescan/rescan-runner.js +70 -0
- package/dist/rescan/rescan-runner.js.map +1 -0
- package/dist/rescan/rescan-scheduler.d.ts +42 -0
- package/dist/rescan/rescan-scheduler.d.ts.map +1 -0
- package/dist/rescan/rescan-scheduler.js +180 -0
- package/dist/rescan/rescan-scheduler.js.map +1 -0
- package/dist/site-transformer/browser-tools.d.ts +11 -0
- package/dist/site-transformer/browser-tools.d.ts.map +1 -0
- package/dist/site-transformer/browser-tools.js +60 -0
- package/dist/site-transformer/browser-tools.js.map +1 -0
- package/dist/site-transformer/index.d.ts +3 -0
- package/dist/site-transformer/index.d.ts.map +1 -0
- package/dist/site-transformer/index.js +3 -0
- package/dist/site-transformer/index.js.map +1 -0
- package/dist/site-transformer/selector-healer.d.ts +9 -0
- package/dist/site-transformer/selector-healer.d.ts.map +1 -0
- package/dist/site-transformer/selector-healer.js +107 -0
- package/dist/site-transformer/selector-healer.js.map +1 -0
- package/dist/site-transformer/tool-generator.d.ts +14 -0
- package/dist/site-transformer/tool-generator.d.ts.map +1 -0
- package/dist/site-transformer/tool-generator.js +246 -0
- package/dist/site-transformer/tool-generator.js.map +1 -0
- package/dist/transformer/auth-detector.d.ts +29 -0
- package/dist/transformer/auth-detector.d.ts.map +1 -0
- package/dist/transformer/auth-detector.js +104 -0
- package/dist/transformer/auth-detector.js.map +1 -0
- package/dist/transformer/catalog-builder.d.ts +19 -0
- package/dist/transformer/catalog-builder.d.ts.map +1 -0
- package/dist/transformer/catalog-builder.js +57 -0
- package/dist/transformer/catalog-builder.js.map +1 -0
- package/dist/transformer/client-compat.d.ts +7 -0
- package/dist/transformer/client-compat.d.ts.map +1 -0
- package/dist/transformer/client-compat.js +45 -0
- package/dist/transformer/client-compat.js.map +1 -0
- package/dist/transformer/har-clusterer.d.ts +10 -0
- package/dist/transformer/har-clusterer.d.ts.map +1 -0
- package/dist/transformer/har-clusterer.js +28 -0
- package/dist/transformer/har-clusterer.js.map +1 -0
- package/dist/transformer/har-dedup.d.ts +11 -0
- package/dist/transformer/har-dedup.d.ts.map +1 -0
- package/dist/transformer/har-dedup.js +82 -0
- package/dist/transformer/har-dedup.js.map +1 -0
- package/dist/transformer/har-schema-inferrer.d.ts +16 -0
- package/dist/transformer/har-schema-inferrer.d.ts.map +1 -0
- package/dist/transformer/har-schema-inferrer.js +91 -0
- package/dist/transformer/har-schema-inferrer.js.map +1 -0
- package/dist/transformer/har-to-operations.d.ts +14 -0
- package/dist/transformer/har-to-operations.d.ts.map +1 -0
- package/dist/transformer/har-to-operations.js +193 -0
- package/dist/transformer/har-to-operations.js.map +1 -0
- package/dist/transformer/index.d.ts +9 -0
- package/dist/transformer/index.d.ts.map +1 -0
- package/dist/transformer/index.js +7 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/transformer/llm-namer.d.ts +7 -0
- package/dist/transformer/llm-namer.d.ts.map +1 -0
- package/dist/transformer/llm-namer.js +60 -0
- package/dist/transformer/llm-namer.js.map +1 -0
- package/dist/transformer/naming.d.ts +5 -0
- package/dist/transformer/naming.d.ts.map +1 -0
- package/dist/transformer/naming.js +31 -0
- package/dist/transformer/naming.js.map +1 -0
- package/dist/transformer/operation-filter.d.ts +14 -0
- package/dist/transformer/operation-filter.d.ts.map +1 -0
- package/dist/transformer/operation-filter.js +53 -0
- package/dist/transformer/operation-filter.js.map +1 -0
- package/dist/transformer/resource-builder.d.ts +13 -0
- package/dist/transformer/resource-builder.d.ts.map +1 -0
- package/dist/transformer/resource-builder.js +87 -0
- package/dist/transformer/resource-builder.js.map +1 -0
- package/dist/transformer/schema-merger.d.ts +15 -0
- package/dist/transformer/schema-merger.d.ts.map +1 -0
- package/dist/transformer/schema-merger.js +66 -0
- package/dist/transformer/schema-merger.js.map +1 -0
- package/dist/transformer/stainless-config.d.ts +75 -0
- package/dist/transformer/stainless-config.d.ts.map +1 -0
- package/dist/transformer/stainless-config.js +59 -0
- package/dist/transformer/stainless-config.js.map +1 -0
- package/dist/transformer/stainless-translator.d.ts +61 -0
- package/dist/transformer/stainless-translator.d.ts.map +1 -0
- package/dist/transformer/stainless-translator.js +375 -0
- package/dist/transformer/stainless-translator.js.map +1 -0
- package/dist/transformer/tool-builder.d.ts +4 -0
- package/dist/transformer/tool-builder.d.ts.map +1 -0
- package/dist/transformer/tool-builder.js +119 -0
- package/dist/transformer/tool-builder.js.map +1 -0
- package/dist/types/index.d.ts +140 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/site.d.ts +285 -0
- package/dist/types/site.d.ts.map +1 -0
- package/dist/types/site.js +9 -0
- package/dist/types/site.js.map +1 -0
- package/dist/utils/fail.d.ts +49 -0
- package/dist/utils/fail.d.ts.map +1 -0
- package/dist/utils/fail.js +223 -0
- package/dist/utils/fail.js.map +1 -0
- package/dist/utils/fs.d.ts +6 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +29 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/interactive.d.ts +7 -0
- package/dist/utils/interactive.d.ts.map +1 -0
- package/dist/utils/interactive.js +31 -0
- package/dist/utils/interactive.js.map +1 -0
- package/dist/utils/logger.d.ts +2 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +3 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/sanitize.d.ts +29 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +45 -0
- package/dist/utils/sanitize.js.map +1 -0
- package/dist/utils/watcher.d.ts +12 -0
- package/dist/utils/watcher.d.ts.map +1 -0
- package/dist/utils/watcher.js +37 -0
- package/dist/utils/watcher.js.map +1 -0
- 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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"}
|