@kubb/plugin-mcp 5.0.0-alpha.29 → 5.0.0-alpha.30
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/index.cjs +75 -101
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +13 -3
- package/dist/index.js +77 -103
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/src/generators/mcpGenerator.tsx +15 -24
- package/src/generators/serverGenerator.tsx +16 -24
- package/src/generators/serverGeneratorLegacy.tsx +16 -22
- package/src/plugin.ts +25 -45
- package/src/types.ts +11 -0
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import "./chunk--u3MIqq1.js";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { caseParams, createFunctionParameter, createFunctionParameters, createOperationParams, createParameterGroup
|
|
3
|
+
import { caseParams, createFunctionParameter, createFunctionParameters, createOperationParams, createParameterGroup } from "@kubb/ast";
|
|
4
4
|
import { functionPrinter, pluginTsName } from "@kubb/plugin-ts";
|
|
5
5
|
import { Const, File, Function as Function$1 } from "@kubb/react-fabric";
|
|
6
6
|
import { Fragment, jsx, jsxs } from "@kubb/react-fabric/jsx-runtime";
|
|
7
|
-
import { createPlugin, defineGenerator, definePresets, defineResolver,
|
|
7
|
+
import { createPlugin, defineGenerator, definePresets, defineResolver, getPreset, mergeGenerators } from "@kubb/core";
|
|
8
8
|
import { pluginZodName } from "@kubb/plugin-zod";
|
|
9
9
|
import { pluginClientName } from "@kubb/plugin-client";
|
|
10
10
|
import { source } from "@kubb/plugin-client/templates/clients/axios.source";
|
|
@@ -480,42 +480,40 @@ server.registerTool(${JSON.stringify(tool.name)}, {
|
|
|
480
480
|
//#region src/generators/mcpGenerator.tsx
|
|
481
481
|
const mcpGenerator = defineGenerator({
|
|
482
482
|
name: "mcp",
|
|
483
|
-
|
|
484
|
-
|
|
483
|
+
operation(node, options) {
|
|
484
|
+
const { resolver, driver, root } = this;
|
|
485
485
|
const { output, client, paramsCasing, group } = options;
|
|
486
|
-
const root = path.resolve(config.root, config.output.path);
|
|
487
486
|
const pluginTs = driver.getPlugin(pluginTsName);
|
|
488
487
|
if (!pluginTs?.resolver) return null;
|
|
489
|
-
const
|
|
490
|
-
const casedParams = caseParams(transformedNode.parameters, paramsCasing);
|
|
488
|
+
const casedParams = caseParams(node.parameters, paramsCasing);
|
|
491
489
|
const pathParams = casedParams.filter((p) => p.in === "path");
|
|
492
490
|
const queryParams = casedParams.filter((p) => p.in === "query");
|
|
493
491
|
const headerParams = casedParams.filter((p) => p.in === "header");
|
|
494
492
|
const importedTypeNames = [
|
|
495
|
-
...pathParams.map((p) => pluginTs.resolver.resolvePathParamsName(
|
|
496
|
-
...queryParams.map((p) => pluginTs.resolver.resolveQueryParamsName(
|
|
497
|
-
...headerParams.map((p) => pluginTs.resolver.resolveHeaderParamsName(
|
|
498
|
-
|
|
499
|
-
pluginTs.resolver.resolveResponseName(
|
|
500
|
-
...
|
|
493
|
+
...pathParams.map((p) => pluginTs.resolver.resolvePathParamsName(node, p)),
|
|
494
|
+
...queryParams.map((p) => pluginTs.resolver.resolveQueryParamsName(node, p)),
|
|
495
|
+
...headerParams.map((p) => pluginTs.resolver.resolveHeaderParamsName(node, p)),
|
|
496
|
+
node.requestBody?.schema ? pluginTs.resolver.resolveDataName(node) : void 0,
|
|
497
|
+
pluginTs.resolver.resolveResponseName(node),
|
|
498
|
+
...node.responses.filter((r) => Number(r.statusCode) >= 400).map((r) => pluginTs.resolver.resolveResponseStatusName(node, r.statusCode))
|
|
501
499
|
].filter(Boolean);
|
|
502
500
|
const meta = {
|
|
503
|
-
name: resolver.resolveName(
|
|
501
|
+
name: resolver.resolveName(node.operationId),
|
|
504
502
|
file: resolver.resolveFile({
|
|
505
|
-
name:
|
|
503
|
+
name: node.operationId,
|
|
506
504
|
extname: ".ts",
|
|
507
|
-
tag:
|
|
508
|
-
path:
|
|
505
|
+
tag: node.tags[0] ?? "default",
|
|
506
|
+
path: node.path
|
|
509
507
|
}, {
|
|
510
508
|
root,
|
|
511
509
|
output,
|
|
512
510
|
group
|
|
513
511
|
}),
|
|
514
512
|
fileTs: pluginTs.resolver.resolveFile({
|
|
515
|
-
name:
|
|
513
|
+
name: node.operationId,
|
|
516
514
|
extname: ".ts",
|
|
517
|
-
tag:
|
|
518
|
-
path:
|
|
515
|
+
tag: node.tags[0] ?? "default",
|
|
516
|
+
path: node.path
|
|
519
517
|
}, {
|
|
520
518
|
root,
|
|
521
519
|
output: pluginTs.options?.output ?? output,
|
|
@@ -587,7 +585,7 @@ const mcpGenerator = defineGenerator({
|
|
|
587
585
|
] }),
|
|
588
586
|
/* @__PURE__ */ jsx(McpHandler, {
|
|
589
587
|
name: meta.name,
|
|
590
|
-
node
|
|
588
|
+
node,
|
|
591
589
|
resolver: pluginTs.resolver,
|
|
592
590
|
baseURL: client.baseURL,
|
|
593
591
|
dataReturnType: client.dataReturnType || "data",
|
|
@@ -608,10 +606,9 @@ const mcpGenerator = defineGenerator({
|
|
|
608
606
|
*/
|
|
609
607
|
const serverGenerator = defineGenerator({
|
|
610
608
|
name: "operations",
|
|
611
|
-
|
|
612
|
-
|
|
609
|
+
operations(nodes, options) {
|
|
610
|
+
const { adapter, config, resolver, plugin, driver, root } = this;
|
|
613
611
|
const { output, paramsCasing, group } = options;
|
|
614
|
-
const root = path.resolve(config.root, config.output.path);
|
|
615
612
|
const pluginZod = driver.getPlugin(pluginZodName);
|
|
616
613
|
if (!pluginZod?.resolver) return;
|
|
617
614
|
const name = "server";
|
|
@@ -626,46 +623,45 @@ const serverGenerator = defineGenerator({
|
|
|
626
623
|
meta: { pluginName: plugin.name }
|
|
627
624
|
};
|
|
628
625
|
const operationsMapped = nodes.map((node) => {
|
|
629
|
-
const
|
|
630
|
-
const casedParams = caseParams(transformedNode.parameters, paramsCasing);
|
|
626
|
+
const casedParams = caseParams(node.parameters, paramsCasing);
|
|
631
627
|
const pathParams = casedParams.filter((p) => p.in === "path");
|
|
632
628
|
const queryParams = casedParams.filter((p) => p.in === "query");
|
|
633
629
|
const headerParams = casedParams.filter((p) => p.in === "header");
|
|
634
630
|
const mcpFile = resolver.resolveFile({
|
|
635
|
-
name:
|
|
631
|
+
name: node.operationId,
|
|
636
632
|
extname: ".ts",
|
|
637
|
-
tag:
|
|
638
|
-
path:
|
|
633
|
+
tag: node.tags[0] ?? "default",
|
|
634
|
+
path: node.path
|
|
639
635
|
}, {
|
|
640
636
|
root,
|
|
641
637
|
output,
|
|
642
638
|
group
|
|
643
639
|
});
|
|
644
640
|
const zodFile = pluginZod.resolver.resolveFile({
|
|
645
|
-
name:
|
|
641
|
+
name: node.operationId,
|
|
646
642
|
extname: ".ts",
|
|
647
|
-
tag:
|
|
648
|
-
path:
|
|
643
|
+
tag: node.tags[0] ?? "default",
|
|
644
|
+
path: node.path
|
|
649
645
|
}, {
|
|
650
646
|
root,
|
|
651
647
|
output: pluginZod.options?.output ?? output,
|
|
652
648
|
group: pluginZod.options?.group
|
|
653
649
|
});
|
|
654
|
-
const requestName =
|
|
655
|
-
const successStatus = findSuccessStatusCode(
|
|
656
|
-
const responseName = successStatus ? pluginZod.resolver.resolveResponseStatusName(
|
|
650
|
+
const requestName = node.requestBody?.schema ? pluginZod.resolver.resolveDataName(node) : void 0;
|
|
651
|
+
const successStatus = findSuccessStatusCode(node.responses);
|
|
652
|
+
const responseName = successStatus ? pluginZod.resolver.resolveResponseStatusName(node, successStatus) : void 0;
|
|
657
653
|
const resolveParams = (params) => params.map((p) => ({
|
|
658
654
|
name: p.name,
|
|
659
|
-
schemaName: pluginZod.resolver.resolveParamName(
|
|
655
|
+
schemaName: pluginZod.resolver.resolveParamName(node, p)
|
|
660
656
|
}));
|
|
661
657
|
return {
|
|
662
658
|
tool: {
|
|
663
|
-
name:
|
|
664
|
-
title:
|
|
665
|
-
description:
|
|
659
|
+
name: node.operationId,
|
|
660
|
+
title: node.summary || void 0,
|
|
661
|
+
description: node.description || `Make a ${node.method.toUpperCase()} request to ${node.path}`
|
|
666
662
|
},
|
|
667
663
|
mcp: {
|
|
668
|
-
name: resolver.resolveName(
|
|
664
|
+
name: resolver.resolveName(node.operationId),
|
|
669
665
|
file: mcpFile
|
|
670
666
|
},
|
|
671
667
|
zod: {
|
|
@@ -676,7 +672,7 @@ const serverGenerator = defineGenerator({
|
|
|
676
672
|
responseName,
|
|
677
673
|
file: zodFile
|
|
678
674
|
},
|
|
679
|
-
node
|
|
675
|
+
node
|
|
680
676
|
};
|
|
681
677
|
});
|
|
682
678
|
const imports = operationsMapped.flatMap(({ mcp, zod }) => {
|
|
@@ -764,10 +760,9 @@ const serverGenerator = defineGenerator({
|
|
|
764
760
|
*/
|
|
765
761
|
const serverGeneratorLegacy = defineGenerator({
|
|
766
762
|
name: "operations",
|
|
767
|
-
|
|
768
|
-
|
|
763
|
+
operations(nodes, options) {
|
|
764
|
+
const { adapter, config, resolver, plugin, driver, root } = this;
|
|
769
765
|
const { output, paramsCasing, group } = options;
|
|
770
|
-
const root = path.resolve(config.root, config.output.path);
|
|
771
766
|
const pluginZod = driver.getPlugin(pluginZodName);
|
|
772
767
|
if (!pluginZod?.resolver) return;
|
|
773
768
|
const name = "server";
|
|
@@ -782,42 +777,41 @@ const serverGeneratorLegacy = defineGenerator({
|
|
|
782
777
|
meta: { pluginName: plugin.name }
|
|
783
778
|
};
|
|
784
779
|
const operationsMapped = nodes.map((node) => {
|
|
785
|
-
const
|
|
786
|
-
const casedParams = caseParams(transformedNode.parameters, paramsCasing);
|
|
780
|
+
const casedParams = caseParams(node.parameters, paramsCasing);
|
|
787
781
|
const queryParams = casedParams.filter((p) => p.in === "query");
|
|
788
782
|
const headerParams = casedParams.filter((p) => p.in === "header");
|
|
789
783
|
const mcpFile = resolver.resolveFile({
|
|
790
|
-
name:
|
|
784
|
+
name: node.operationId,
|
|
791
785
|
extname: ".ts",
|
|
792
|
-
tag:
|
|
793
|
-
path:
|
|
786
|
+
tag: node.tags[0] ?? "default",
|
|
787
|
+
path: node.path
|
|
794
788
|
}, {
|
|
795
789
|
root,
|
|
796
790
|
output,
|
|
797
791
|
group
|
|
798
792
|
});
|
|
799
793
|
const zodFile = pluginZod?.resolver.resolveFile({
|
|
800
|
-
name:
|
|
794
|
+
name: node.operationId,
|
|
801
795
|
extname: ".ts",
|
|
802
|
-
tag:
|
|
803
|
-
path:
|
|
796
|
+
tag: node.tags[0] ?? "default",
|
|
797
|
+
path: node.path
|
|
804
798
|
}, {
|
|
805
799
|
root,
|
|
806
800
|
output: pluginZod?.options?.output ?? output,
|
|
807
801
|
group: pluginZod?.options?.group
|
|
808
802
|
});
|
|
809
|
-
const requestName =
|
|
810
|
-
const responseName = pluginZod?.resolver.resolveResponseName(
|
|
811
|
-
const zodQueryParams = queryParams.length ? pluginZod?.resolver.resolveQueryParamsName(
|
|
812
|
-
const zodHeaderParams = headerParams.length ? pluginZod?.resolver.resolveHeaderParamsName(
|
|
803
|
+
const requestName = node.requestBody?.schema ? pluginZod?.resolver.resolveDataName(node) : void 0;
|
|
804
|
+
const responseName = pluginZod?.resolver.resolveResponseName(node);
|
|
805
|
+
const zodQueryParams = queryParams.length ? pluginZod?.resolver.resolveQueryParamsName(node, queryParams[0]) : void 0;
|
|
806
|
+
const zodHeaderParams = headerParams.length ? pluginZod?.resolver.resolveHeaderParamsName(node, headerParams[0]) : void 0;
|
|
813
807
|
return {
|
|
814
808
|
tool: {
|
|
815
|
-
name:
|
|
816
|
-
title:
|
|
817
|
-
description:
|
|
809
|
+
name: node.operationId,
|
|
810
|
+
title: node.summary || void 0,
|
|
811
|
+
description: node.description || `Make a ${node.method.toUpperCase()} request to ${node.path}`
|
|
818
812
|
},
|
|
819
813
|
mcp: {
|
|
820
|
-
name: resolver.resolveName(
|
|
814
|
+
name: resolver.resolveName(node.operationId),
|
|
821
815
|
file: mcpFile
|
|
822
816
|
},
|
|
823
817
|
zod: {
|
|
@@ -828,7 +822,7 @@ const serverGeneratorLegacy = defineGenerator({
|
|
|
828
822
|
responseName,
|
|
829
823
|
file: zodFile
|
|
830
824
|
},
|
|
831
|
-
node
|
|
825
|
+
node
|
|
832
826
|
};
|
|
833
827
|
});
|
|
834
828
|
const imports = operationsMapped.flatMap(({ mcp, zod }) => {
|
|
@@ -904,6 +898,9 @@ const serverGeneratorLegacy = defineGenerator({
|
|
|
904
898
|
}
|
|
905
899
|
});
|
|
906
900
|
//#endregion
|
|
901
|
+
//#region package.json
|
|
902
|
+
var version = "5.0.0-alpha.30";
|
|
903
|
+
//#endregion
|
|
907
904
|
//#region src/resolvers/resolverMcp.ts
|
|
908
905
|
/**
|
|
909
906
|
* Resolver for `@kubb/plugin-mcp` that provides the default naming
|
|
@@ -965,8 +962,10 @@ const pluginMcp = createPlugin((options) => {
|
|
|
965
962
|
transformer: userTransformer,
|
|
966
963
|
generators: userGenerators
|
|
967
964
|
});
|
|
965
|
+
const mergedGenerator = mergeGenerators(preset.generators ?? []);
|
|
968
966
|
return {
|
|
969
967
|
name: pluginMcpName,
|
|
968
|
+
version,
|
|
970
969
|
get resolver() {
|
|
971
970
|
return preset.resolver;
|
|
972
971
|
},
|
|
@@ -976,6 +975,9 @@ const pluginMcp = createPlugin((options) => {
|
|
|
976
975
|
get options() {
|
|
977
976
|
return {
|
|
978
977
|
output,
|
|
978
|
+
exclude,
|
|
979
|
+
include,
|
|
980
|
+
override,
|
|
979
981
|
group: group ? {
|
|
980
982
|
...group,
|
|
981
983
|
name: group.name ? group.name : (ctx) => {
|
|
@@ -997,12 +999,19 @@ const pluginMcp = createPlugin((options) => {
|
|
|
997
999
|
};
|
|
998
1000
|
},
|
|
999
1001
|
pre: [pluginTsName, pluginZodName].filter(Boolean),
|
|
1000
|
-
async
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1002
|
+
async schema(node, options) {
|
|
1003
|
+
return mergedGenerator.schema?.call(this, node, options);
|
|
1004
|
+
},
|
|
1005
|
+
async operation(node, options) {
|
|
1006
|
+
return mergedGenerator.operation?.call(this, node, options);
|
|
1007
|
+
},
|
|
1008
|
+
async operations(nodes, options) {
|
|
1009
|
+
return mergedGenerator.operations?.call(this, nodes, options);
|
|
1010
|
+
},
|
|
1011
|
+
async buildStart() {
|
|
1012
|
+
const { adapter, driver } = this;
|
|
1013
|
+
const root = this.root;
|
|
1014
|
+
const baseURL = adapter?.rootNode?.meta?.baseURL;
|
|
1006
1015
|
if (baseURL) this.plugin.options.client.baseURL = this.plugin.options.client.baseURL || baseURL;
|
|
1007
1016
|
const hasClientPlugin = !!driver.getPlugin(pluginClientName);
|
|
1008
1017
|
if (this.plugin.options.client.bundle && !hasClientPlugin && !this.plugin.options.client.importPath) await this.addFile({
|
|
@@ -1029,42 +1038,7 @@ const pluginMcp = createPlugin((options) => {
|
|
|
1029
1038
|
imports: [],
|
|
1030
1039
|
exports: []
|
|
1031
1040
|
});
|
|
1032
|
-
|
|
1033
|
-
const generatorContext = {
|
|
1034
|
-
generators: preset.generators,
|
|
1035
|
-
plugin,
|
|
1036
|
-
resolver,
|
|
1037
|
-
exclude,
|
|
1038
|
-
include,
|
|
1039
|
-
override,
|
|
1040
|
-
fabric,
|
|
1041
|
-
adapter,
|
|
1042
|
-
config,
|
|
1043
|
-
driver
|
|
1044
|
-
};
|
|
1045
|
-
await walk(rootNode, {
|
|
1046
|
-
depth: "shallow",
|
|
1047
|
-
async schema(schemaNode) {
|
|
1048
|
-
await runGeneratorSchema(schemaNode, generatorContext);
|
|
1049
|
-
},
|
|
1050
|
-
async operation(operationNode) {
|
|
1051
|
-
if (resolver.resolveOptions(operationNode, {
|
|
1052
|
-
options: plugin.options,
|
|
1053
|
-
exclude,
|
|
1054
|
-
include,
|
|
1055
|
-
override
|
|
1056
|
-
}) !== null) collectedOperations.push(operationNode);
|
|
1057
|
-
await runGeneratorOperation(operationNode, generatorContext);
|
|
1058
|
-
}
|
|
1059
|
-
});
|
|
1060
|
-
await runGeneratorOperations(collectedOperations, generatorContext);
|
|
1061
|
-
const barrelFiles = await getBarrelFiles(this.fabric.files, {
|
|
1062
|
-
type: output.barrelType ?? "named",
|
|
1063
|
-
root,
|
|
1064
|
-
output,
|
|
1065
|
-
meta: { pluginName: this.plugin.name }
|
|
1066
|
-
});
|
|
1067
|
-
await this.upsertFile(...barrelFiles);
|
|
1041
|
+
await this.openInStudio({ ast: true });
|
|
1068
1042
|
}
|
|
1069
1043
|
};
|
|
1070
1044
|
});
|