@kubb/plugin-mcp 5.0.0-beta.15 → 5.0.0-beta.22
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 +24 -33
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +24 -33
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
- package/src/components/McpHandler.tsx +1 -1
- package/src/generators/serverGenerator.tsx +6 -6
- package/src/utils.ts +14 -30
package/dist/index.cjs
CHANGED
|
@@ -290,12 +290,13 @@ var URLPath = class {
|
|
|
290
290
|
* @example
|
|
291
291
|
* new URLPath('/pet/{petId}').toTemplateString() // '`/pet/${petId}`'
|
|
292
292
|
*/
|
|
293
|
-
toTemplateString({ prefix
|
|
294
|
-
|
|
293
|
+
toTemplateString({ prefix, replacer } = {}) {
|
|
294
|
+
const result = this.path.split(/\{([^}]+)\}/).map((part, i) => {
|
|
295
295
|
if (i % 2 === 0) return part;
|
|
296
296
|
const param = this.#transformParam(part);
|
|
297
297
|
return `\${${replacer ? replacer(param) : param}}`;
|
|
298
|
-
}).join("")
|
|
298
|
+
}).join("");
|
|
299
|
+
return `\`${prefix ?? ""}${result}\``;
|
|
299
300
|
}
|
|
300
301
|
/**
|
|
301
302
|
* Extracts all `{param}` segments from the path and returns them as a key-value map.
|
|
@@ -546,33 +547,23 @@ function zodGroupExpr(entry) {
|
|
|
546
547
|
* Used as fallback when no named zod schema is available for a path parameter.
|
|
547
548
|
*/
|
|
548
549
|
function zodExprFromSchemaNode(schema) {
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
case "enum": {
|
|
550
|
+
const baseExpr = (() => {
|
|
551
|
+
if (schema.type === "enum") {
|
|
552
552
|
const rawValues = schema.namedEnumValues?.length ? schema.namedEnumValues.map((v) => v.value) : (schema.enumValues ?? []).filter((v) => v !== null);
|
|
553
|
-
if (rawValues.length > 0 && rawValues.every((v) => typeof v === "string"))
|
|
554
|
-
|
|
553
|
+
if (rawValues.length > 0 && rawValues.every((v) => typeof v === "string")) return `z.enum([${rawValues.map((v) => JSON.stringify(v)).join(", ")}])`;
|
|
554
|
+
if (rawValues.length > 0) {
|
|
555
555
|
const literals = rawValues.map((v) => `z.literal(${JSON.stringify(v)})`);
|
|
556
|
-
|
|
557
|
-
}
|
|
558
|
-
|
|
556
|
+
return literals.length === 1 ? literals[0] : `z.union([${literals.join(", ")}])`;
|
|
557
|
+
}
|
|
558
|
+
return "z.string()";
|
|
559
559
|
}
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
expr = "z.boolean()";
|
|
568
|
-
break;
|
|
569
|
-
case "array":
|
|
570
|
-
expr = "z.array(z.unknown())";
|
|
571
|
-
break;
|
|
572
|
-
default: expr = "z.string()";
|
|
573
|
-
}
|
|
574
|
-
if (schema.nullable) expr = `${expr}.nullable()`;
|
|
575
|
-
return expr;
|
|
560
|
+
if (schema.type === "integer") return "z.coerce.number()";
|
|
561
|
+
if (schema.type === "number") return "z.number()";
|
|
562
|
+
if (schema.type === "boolean") return "z.boolean()";
|
|
563
|
+
if (schema.type === "array") return "z.array(z.unknown())";
|
|
564
|
+
return "z.string()";
|
|
565
|
+
})();
|
|
566
|
+
return schema.nullable ? `${baseExpr}.nullable()` : baseExpr;
|
|
576
567
|
}
|
|
577
568
|
//#endregion
|
|
578
569
|
//#region src/components/Server.tsx
|
|
@@ -797,7 +788,7 @@ const serverGenerator = (0, _kubb_core.defineGenerator)({
|
|
|
797
788
|
name: "operations",
|
|
798
789
|
renderer: _kubb_renderer_jsx.jsxRendererSync,
|
|
799
790
|
operations(nodes, ctx) {
|
|
800
|
-
const { config, resolver, plugin, driver, root
|
|
791
|
+
const { config, resolver, plugin, driver, root } = ctx;
|
|
801
792
|
const { output, paramsCasing, group } = ctx.options;
|
|
802
793
|
const pluginZod = driver.getPlugin(_kubb_plugin_zod.pluginZodName);
|
|
803
794
|
if (!pluginZod) return;
|
|
@@ -886,11 +877,11 @@ const serverGenerator = (0, _kubb_core.defineGenerator)({
|
|
|
886
877
|
baseName: serverFile.baseName,
|
|
887
878
|
path: serverFile.path,
|
|
888
879
|
meta: serverFile.meta,
|
|
889
|
-
banner: resolver.resolveBanner(
|
|
880
|
+
banner: resolver.resolveBanner(ctx.meta, {
|
|
890
881
|
output,
|
|
891
882
|
config
|
|
892
883
|
}),
|
|
893
|
-
footer: resolver.resolveFooter(
|
|
884
|
+
footer: resolver.resolveFooter(ctx.meta, {
|
|
894
885
|
output,
|
|
895
886
|
config
|
|
896
887
|
}),
|
|
@@ -910,8 +901,8 @@ const serverGenerator = (0, _kubb_core.defineGenerator)({
|
|
|
910
901
|
imports,
|
|
911
902
|
/* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(Server, {
|
|
912
903
|
name,
|
|
913
|
-
serverName:
|
|
914
|
-
serverVersion:
|
|
904
|
+
serverName: ctx.meta.title ?? "server",
|
|
905
|
+
serverVersion: ctx.meta.version ?? "0.0.0",
|
|
915
906
|
paramsCasing,
|
|
916
907
|
operations: operationsMapped
|
|
917
908
|
})
|
|
@@ -925,7 +916,7 @@ const serverGenerator = (0, _kubb_core.defineGenerator)({
|
|
|
925
916
|
children: `
|
|
926
917
|
{
|
|
927
918
|
"mcpServers": {
|
|
928
|
-
"${
|
|
919
|
+
"${ctx.meta.title || "server"}": {
|
|
929
920
|
"type": "stdio",
|
|
930
921
|
"command": "npx",
|
|
931
922
|
"args": ["tsx", "${node_path.default.relative(node_path.default.dirname(jsonFile.path), serverFile.path)}"]
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["#options","#transformParam","#eachParam","ast","ast","File","Function","File","Const","ast","Function","jsxRendererSync","pluginTsName","File","path","jsxRendererSync","pluginZodName","path","File","pluginTsName","pluginZodName","path","pluginClientName","ast","fetchClientSource","axiosClientSource","configSource"],"sources":["../../../internals/utils/src/casing.ts","../../../internals/utils/src/reserved.ts","../../../internals/utils/src/urlPath.ts","../../../internals/shared/src/operation.ts","../../../internals/shared/src/params.ts","../src/components/McpHandler.tsx","../src/utils.ts","../src/components/Server.tsx","../src/generators/mcpGenerator.tsx","../src/generators/serverGenerator.tsx","../src/resolvers/resolverMcp.ts","../src/plugin.ts"],"sourcesContent":["type Options = {\n /**\n * When `true`, dot-separated segments are split on `.` and joined with `/` after casing.\n */\n isFile?: boolean\n /**\n * Text prepended before casing is applied.\n */\n prefix?: string\n /**\n * Text appended before casing is applied.\n */\n suffix?: string\n}\n\n/**\n * Shared implementation for camelCase and PascalCase conversion.\n * Splits on common word boundaries (spaces, hyphens, underscores, dots, slashes, colons)\n * and capitalizes each word according to `pascal`.\n *\n * When `pascal` is `true` the first word is also capitalized (PascalCase), otherwise only subsequent words are.\n */\nfunction toCamelOrPascal(text: string, pascal: boolean): string {\n const normalized = text\n .trim()\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .replace(/(\\d)([a-z])/g, '$1 $2')\n\n const words = normalized.split(/[\\s\\-_./\\\\:]+/).filter(Boolean)\n\n return words\n .map((word, i) => {\n const allUpper = word.length > 1 && word === word.toUpperCase()\n if (allUpper) return word\n if (i === 0 && !pascal) return word.charAt(0).toLowerCase() + word.slice(1)\n return word.charAt(0).toUpperCase() + word.slice(1)\n })\n .join('')\n .replace(/[^a-zA-Z0-9]/g, '')\n}\n\n/**\n * Splits `text` on `.` and applies `transformPart` to each segment.\n * The last segment receives `isLast = true`, all earlier segments receive `false`.\n * Segments are joined with `/` to form a file path.\n *\n * Only splits on dots followed by a letter so that version numbers\n * embedded in operationIds (e.g. `v2025.0`) are kept intact.\n */\nfunction applyToFileParts(text: string, transformPart: (part: string, isLast: boolean) => string): string {\n const parts = text.split(/\\.(?=[a-zA-Z])/)\n return parts.map((part, i) => transformPart(part, i === parts.length - 1)).join('/')\n}\n\n/**\n * Converts `text` to camelCase.\n * When `isFile` is `true`, dot-separated segments are each cased independently and joined with `/`.\n *\n * @example\n * camelCase('hello-world') // 'helloWorld'\n * camelCase('pet.petId', { isFile: true }) // 'pet/petId'\n */\nexport function camelCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n if (isFile) {\n return applyToFileParts(text, (part, isLast) => camelCase(part, isLast ? { prefix, suffix } : {}))\n }\n\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, false)\n}\n\n/**\n * Converts `text` to PascalCase.\n * When `isFile` is `true`, the last dot-separated segment is PascalCased and earlier segments are camelCased.\n *\n * @example\n * pascalCase('hello-world') // 'HelloWorld'\n * pascalCase('pet.petId', { isFile: true }) // 'pet/PetId'\n */\nexport function pascalCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n if (isFile) {\n return applyToFileParts(text, (part, isLast) => (isLast ? pascalCase(part, { prefix, suffix }) : camelCase(part)))\n }\n\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, true)\n}\n\n/**\n * Converts `text` to snake_case.\n *\n * @example\n * snakeCase('helloWorld') // 'hello_world'\n * snakeCase('Hello-World') // 'hello_world'\n */\nexport function snakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n const processed = `${prefix} ${text} ${suffix}`.trim()\n return processed\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s\\-.]+/g, '_')\n .replace(/[^a-zA-Z0-9_]/g, '')\n .toLowerCase()\n .split('_')\n .filter(Boolean)\n .join('_')\n}\n\n/**\n * Converts `text` to SCREAMING_SNAKE_CASE.\n *\n * @example\n * screamingSnakeCase('helloWorld') // 'HELLO_WORLD'\n */\nexport function screamingSnakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n return snakeCase(text, { prefix, suffix }).toUpperCase()\n}\n","/**\n * JavaScript and Java reserved words.\n * @link https://github.com/jonschlinkert/reserved/blob/master/index.js\n */\nconst reservedWords = new Set([\n 'abstract',\n 'arguments',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'eval',\n 'export',\n 'extends',\n 'false',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'function',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'in',\n 'instanceof',\n 'int',\n 'interface',\n 'let',\n 'long',\n 'native',\n 'new',\n 'null',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'volatile',\n 'while',\n 'with',\n 'yield',\n 'Array',\n 'Date',\n 'hasOwnProperty',\n 'Infinity',\n 'isFinite',\n 'isNaN',\n 'isPrototypeOf',\n 'length',\n 'Math',\n 'name',\n 'NaN',\n 'Number',\n 'Object',\n 'prototype',\n 'String',\n 'toString',\n 'undefined',\n 'valueOf',\n] as const)\n\n/**\n * Returns `true` when `name` is a syntactically valid JavaScript variable name.\n *\n * @example\n * ```ts\n * isValidVarName('status') // true\n * isValidVarName('class') // false (reserved word)\n * isValidVarName('42foo') // false (starts with digit)\n * ```\n */\nexport function isValidVarName(name: string): boolean {\n if (!name || reservedWords.has(name as 'valueOf')) {\n return false\n }\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name)\n}\n","import { camelCase } from './casing.ts'\nimport { isValidVarName } from './reserved.ts'\n\nexport type URLObject = {\n /**\n * The resolved URL string (Express-style or template literal, depending on context).\n */\n url: string\n /**\n * Extracted path parameters as a key-value map, or `undefined` when the path has none.\n */\n params?: Record<string, string>\n}\n\ntype ObjectOptions = {\n /**\n * Controls whether the `url` is rendered as an Express path or a template literal.\n * @default 'path'\n */\n type?: 'path' | 'template'\n /**\n * Optional transform applied to each extracted parameter name.\n */\n replacer?: (pathParam: string) => string\n /**\n * When `true`, the result is serialized to a string expression instead of a plain object.\n */\n stringify?: boolean\n}\n\n/**\n * Supported identifier casing strategies for path parameters.\n */\ntype PathCasing = 'camelcase'\n\ntype Options = {\n /**\n * Casing strategy applied to path parameter names.\n * @default undefined (original identifier preserved)\n */\n casing?: PathCasing\n}\n\n/**\n * Parses and transforms an OpenAPI/Swagger path string into various URL formats.\n *\n * @example\n * const p = new URLPath('/pet/{petId}')\n * p.URL // '/pet/:petId'\n * p.template // '`/pet/${petId}`'\n */\nexport class URLPath {\n /**\n * The raw OpenAPI/Swagger path string, e.g. `/pet/{petId}`.\n */\n path: string\n\n #options: Options\n\n constructor(path: string, options: Options = {}) {\n this.path = path\n this.#options = options\n }\n\n /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').URL // '/pet/:petId'\n * ```\n */\n get URL(): string {\n return this.toURLPath()\n }\n\n /** Returns `true` when `path` is a fully-qualified URL (e.g. starts with `https://`).\n *\n * @example\n * ```ts\n * new URLPath('https://petstore.swagger.io/v2/pet').isURL // true\n * new URLPath('/pet/{petId}').isURL // false\n * ```\n */\n get isURL(): boolean {\n try {\n return !!new URL(this.path).href\n } catch {\n return false\n }\n }\n\n /**\n * Converts the OpenAPI path to a TypeScript template literal string.\n *\n * @example\n * new URLPath('/pet/{petId}').template // '`/pet/${petId}`'\n * new URLPath('/account/monetary-accountID').template // '`/account/${monetaryAccountId}`'\n */\n get template(): string {\n return this.toTemplateString()\n }\n\n /** Returns the path and its extracted params as a structured `URLObject`, or as a stringified expression when `stringify` is set.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').object\n * // { url: '/pet/:petId', params: { petId: 'petId' } }\n * ```\n */\n get object(): URLObject | string {\n return this.toObject()\n }\n\n /** Returns a map of path parameter names, or `undefined` when the path has no parameters.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').params // { petId: 'petId' }\n * new URLPath('/pet').params // undefined\n * ```\n */\n get params(): Record<string, string> | undefined {\n return this.toParamsObject()\n }\n\n #transformParam(raw: string): string {\n const param = isValidVarName(raw) ? raw : camelCase(raw)\n return this.#options.casing === 'camelcase' ? camelCase(param) : param\n }\n\n /**\n * Iterates over every `{param}` token in `path`, calling `fn` with the raw token and transformed name.\n */\n #eachParam(fn: (raw: string, param: string) => void): void {\n for (const match of this.path.matchAll(/\\{([^}]+)\\}/g)) {\n const raw = match[1]!\n fn(raw, this.#transformParam(raw))\n }\n }\n\n toObject({ type = 'path', replacer, stringify }: ObjectOptions = {}): URLObject | string {\n const object = {\n url: type === 'path' ? this.toURLPath() : this.toTemplateString({ replacer }),\n params: this.toParamsObject(),\n }\n\n if (stringify) {\n if (type === 'template') {\n return JSON.stringify(object).replaceAll(\"'\", '').replaceAll(`\"`, '')\n }\n\n if (object.params) {\n return `{ url: '${object.url}', params: ${JSON.stringify(object.params).replaceAll(\"'\", '').replaceAll(`\"`, '')} }`\n }\n\n return `{ url: '${object.url}' }`\n }\n\n return object\n }\n\n /**\n * Converts the OpenAPI path to a TypeScript template literal string.\n * An optional `replacer` can transform each extracted parameter name before interpolation.\n *\n * @example\n * new URLPath('/pet/{petId}').toTemplateString() // '`/pet/${petId}`'\n */\n toTemplateString({ prefix = '', replacer }: { prefix?: string; replacer?: (pathParam: string) => string } = {}): string {\n const parts = this.path.split(/\\{([^}]+)\\}/)\n const result = parts\n .map((part, i) => {\n if (i % 2 === 0) return part\n const param = this.#transformParam(part)\n return `\\${${replacer ? replacer(param) : param}}`\n })\n .join('')\n\n return `\\`${prefix}${result}\\``\n }\n\n /**\n * Extracts all `{param}` segments from the path and returns them as a key-value map.\n * An optional `replacer` transforms each parameter name in both key and value positions.\n * Returns `undefined` when no path parameters are found.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}/tag/{tagId}').toParamsObject()\n * // { petId: 'petId', tagId: 'tagId' }\n * ```\n */\n toParamsObject(replacer?: (pathParam: string) => string): Record<string, string> | undefined {\n const params: Record<string, string> = {}\n\n this.#eachParam((_raw, param) => {\n const key = replacer ? replacer(param) : param\n params[key] = key\n })\n\n return Object.keys(params).length > 0 ? params : undefined\n }\n\n /** Converts the OpenAPI path to Express-style colon syntax.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').toURLPath() // '/pet/:petId'\n * ```\n */\n toURLPath(): string {\n return this.path.replace(/\\{([^}]+)\\}/g, ':$1')\n }\n}\n","import { URLPath } from '@internals/utils'\nimport { ast } from '@kubb/core'\n\nexport type ContentTypeInfo = {\n contentTypes: string[]\n isMultipleContentTypes: boolean\n contentTypeUnion: string\n defaultContentType: string\n hasFormData: boolean\n}\n\nexport type RequestConfigResolver = {\n resolveDataName(node: ast.OperationNode): string\n}\n\nexport type ResponseStatusNameResolver = {\n resolveResponseStatusName(node: ast.OperationNode, statusCode: ast.StatusCode): string\n}\n\nexport type ResponseNameResolver = ResponseStatusNameResolver & {\n resolveResponseName(node: ast.OperationNode): string\n}\n\nexport type OperationTypeNameResolver = RequestConfigResolver &\n ResponseNameResolver & {\n resolvePathParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n resolveQueryParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n resolveHeaderParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n }\n\nexport type OperationCommentLink = 'pathTemplate' | 'urlPath' | false | ((node: ast.OperationNode) => string | undefined)\n\nexport type BuildOperationCommentsOptions = {\n link?: OperationCommentLink\n linkPosition?: 'beforeDeprecated' | 'afterDeprecated'\n splitLines?: boolean\n}\n\ntype ResponseLike = {\n statusCode: ast.StatusCode | number | string\n}\n\nexport type OperationParameterGroups = Record<ast.ParameterNode['in'], Array<ast.ParameterNode>>\n\nexport type ResolveOperationTypeNameOptions = {\n paramsCasing?: 'camelcase'\n responseStatusNames?: boolean | 'error'\n exclude?: ReadonlyArray<string | undefined>\n order?: 'params-first' | 'body-response-first'\n}\n\nfunction getOperationLink(node: ast.OperationNode, link: OperationCommentLink): string | undefined {\n if (!link) {\n return undefined\n }\n\n if (typeof link === 'function') {\n return link(node)\n }\n\n if (link === 'urlPath') {\n return node.path ? `{@link ${new URLPath(node.path).URL}}` : undefined\n }\n\n return `{@link ${node.path.replaceAll('{', ':').replaceAll('}', '')}}`\n}\n\nexport function getContentTypeInfo(node: ast.OperationNode): ContentTypeInfo {\n const contentTypes = node.requestBody?.content?.map((e) => e.contentType) ?? []\n const isMultipleContentTypes = contentTypes.length > 1\n\n return {\n contentTypes,\n isMultipleContentTypes,\n contentTypeUnion: isMultipleContentTypes ? contentTypes.map((ct) => JSON.stringify(ct)).join(' | ') : '',\n defaultContentType: contentTypes[0] ?? 'application/json',\n hasFormData: contentTypes.some((ct) => ct === 'multipart/form-data'),\n }\n}\n\nexport function buildRequestConfigType(node: ast.OperationNode, resolver: RequestConfigResolver): string {\n const requestName = node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : undefined\n const { isMultipleContentTypes, contentTypeUnion } = getContentTypeInfo(node)\n const configType = requestName ? `Partial<RequestConfig<${requestName}>>` : 'Partial<RequestConfig>'\n const configProps = ['client?: Client', isMultipleContentTypes ? `contentType?: ${contentTypeUnion}` : undefined].filter(Boolean).join('; ')\n\n return `${configType} & { ${configProps} }`\n}\n\nexport function buildOperationComments(node: ast.OperationNode, options: BuildOperationCommentsOptions = {}): Array<string> {\n const { link = 'pathTemplate', linkPosition = 'afterDeprecated', splitLines = false } = options\n const linkComment = getOperationLink(node, link)\n const comments =\n linkPosition === 'beforeDeprecated'\n ? [node.description && `@description ${node.description}`, node.summary && `@summary ${node.summary}`, linkComment, node.deprecated && '@deprecated']\n : [node.description && `@description ${node.description}`, node.summary && `@summary ${node.summary}`, node.deprecated && '@deprecated', linkComment]\n\n const filteredComments = comments.filter((comment): comment is string => Boolean(comment))\n\n if (!splitLines) {\n return filteredComments\n }\n\n return filteredComments.flatMap((text) => text.split(/\\r?\\n/).map((line) => line.trim())).filter((comment): comment is string => Boolean(comment))\n}\n\nexport function getOperationParameters(node: ast.OperationNode, options: { paramsCasing?: 'camelcase' } = {}): OperationParameterGroups {\n const params = ast.caseParams(node.parameters, options.paramsCasing)\n\n return {\n path: params.filter((param) => param.in === 'path'),\n query: params.filter((param) => param.in === 'query'),\n header: params.filter((param) => param.in === 'header'),\n cookie: params.filter((param) => param.in === 'cookie'),\n }\n}\n\nexport function getStatusCodeNumber(statusCode: ast.StatusCode | number | string): number | undefined {\n const code = Number(statusCode)\n\n return Number.isNaN(code) ? undefined : code\n}\n\nexport function isSuccessStatusCode(statusCode: ast.StatusCode | number | string): boolean {\n const code = getStatusCodeNumber(statusCode)\n\n return code !== undefined && code >= 200 && code < 300\n}\n\nexport function isErrorStatusCode(statusCode: ast.StatusCode | number | string): boolean {\n const code = getStatusCodeNumber(statusCode)\n\n return code !== undefined && code >= 400\n}\n\nexport function getSuccessResponses<TResponse extends ResponseLike>(responses: ReadonlyArray<TResponse>): Array<TResponse> {\n return responses.filter((response) => isSuccessStatusCode(response.statusCode))\n}\n\nexport function getOperationSuccessResponses(node: ast.OperationNode): Array<ast.ResponseNode> {\n return getSuccessResponses(node.responses)\n}\n\nexport function getPrimarySuccessResponse(node: ast.OperationNode): ast.ResponseNode | undefined {\n return getOperationSuccessResponses(node)[0]\n}\n\nexport function resolveErrorNames(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string[] {\n return node.responses\n .filter((response) => isErrorStatusCode(response.statusCode))\n .map((response) => resolver.resolveResponseStatusName(node, response.statusCode))\n}\n\nexport function resolveStatusCodeNames(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string[] {\n return node.responses.map((response) => resolver.resolveResponseStatusName(node, response.statusCode))\n}\n\nconst typeNamesByResolver = new WeakMap<OperationTypeNameResolver, Map<string, string[]>>()\n\nexport function resolveOperationTypeNames(\n node: ast.OperationNode,\n resolver: OperationTypeNameResolver,\n options: ResolveOperationTypeNameOptions = {},\n): string[] {\n const cacheKey = `${node.operationId}\\0${options.paramsCasing ?? ''}\\0${options.order ?? ''}\\0${options.responseStatusNames ?? ''}\\0${(options.exclude ?? []).join(',')}`\n let byResolver = typeNamesByResolver.get(resolver)\n if (byResolver) {\n const cached = byResolver.get(cacheKey)\n if (cached) return cached\n } else {\n byResolver = new Map()\n typeNamesByResolver.set(resolver, byResolver)\n }\n\n const { path, query, header } = getOperationParameters(node, { paramsCasing: options.paramsCasing })\n const responseStatusNames =\n options.responseStatusNames === 'error'\n ? resolveErrorNames(node, resolver)\n : options.responseStatusNames === false\n ? []\n : resolveStatusCodeNames(node, resolver)\n const exclude = new Set(options.exclude ?? [])\n const paramNames = [\n ...path.map((param) => resolver.resolvePathParamsName(node, param)),\n ...query.map((param) => resolver.resolveQueryParamsName(node, param)),\n ...header.map((param) => resolver.resolveHeaderParamsName(node, param)),\n ]\n const bodyAndResponseNames = [node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : undefined, resolver.resolveResponseName(node)]\n const names =\n options.order === 'body-response-first'\n ? [...bodyAndResponseNames, ...paramNames, ...responseStatusNames]\n : [...paramNames, ...bodyAndResponseNames, ...responseStatusNames]\n\n const result = names.filter((name): name is string => Boolean(name) && !exclude.has(name))\n byResolver.set(cacheKey, result)\n return result\n}\n\nexport function resolveResponseTypes(node: ast.OperationNode, resolver: ResponseNameResolver): Array<[statusCode: number | 'default', typeName: string]> {\n const types: Array<[number | 'default', string]> = []\n\n for (const response of node.responses) {\n if (response.statusCode === 'default') {\n types.push(['default', resolver.resolveResponseName(node)])\n continue\n }\n\n const code = getStatusCodeNumber(response.statusCode)\n if (code === undefined) {\n continue\n }\n\n types.push([code, isSuccessStatusCode(code) ? resolver.resolveResponseName(node) : resolver.resolveResponseStatusName(node, response.statusCode)])\n }\n\n return types\n}\n\nexport function findSuccessStatusCode(responses: Array<{ statusCode: ast.StatusCode | number | string }>): ast.StatusCode | undefined {\n for (const response of responses) {\n if (isSuccessStatusCode(response.statusCode)) {\n return response.statusCode as ast.StatusCode\n }\n }\n\n return undefined\n}\n","export function buildParamsMapping<TParam extends { name: string }>(\n originalParams: ReadonlyArray<TParam>,\n mappedParams: ReadonlyArray<TParam>,\n): Record<string, string> | undefined {\n const mapping: Record<string, string> = {}\n let hasChanged = false\n\n originalParams.forEach((param, i) => {\n const mappedName = mappedParams[i]?.name ?? param.name\n mapping[param.name] = mappedName\n\n if (param.name !== mappedName) {\n hasChanged = true\n }\n })\n\n return hasChanged ? mapping : undefined\n}\n\nexport function buildTransformedParamsMapping<TParam extends { name: string }>(\n params: ReadonlyArray<TParam>,\n transformName: (name: string) => string,\n): Record<string, string> | undefined {\n if (!params.length) {\n return undefined\n }\n\n return buildParamsMapping(\n params,\n params.map((param) => ({ ...param, name: transformName(param.name) })),\n )\n}\n","import { buildOperationComments, buildTransformedParamsMapping, getOperationParameters } from '@internals/shared'\nimport { camelCase, isValidVarName, URLPath } from '@internals/utils'\nimport { ast } from '@kubb/core'\nimport type { ResolverTs } from '@kubb/plugin-ts'\nimport { functionPrinter } from '@kubb/plugin-ts'\nimport { File, Function } from '@kubb/renderer-jsx'\nimport type { KubbReactNode } from '@kubb/renderer-jsx/types'\nimport type { PluginMcp } from '../types.ts'\n\ntype Props = {\n /**\n * Name of the handler function.\n */\n name: string\n /**\n * AST operation node.\n */\n node: ast.OperationNode\n /**\n * TypeScript resolver for resolving param/data/response type names.\n */\n resolver: ResolverTs\n /**\n * Base URL prepended to every generated request URL.\n */\n baseURL: string | undefined\n /**\n * Return type when calling fetch.\n * - 'data' returns response data only.\n * - 'full' returns the full response object.\n * @default 'data'\n */\n dataReturnType: PluginMcp['resolvedOptions']['client']['dataReturnType']\n /**\n * How to style your params.\n */\n paramsCasing?: PluginMcp['resolvedOptions']['paramsCasing']\n}\n\n/**\n * Generate a remapping statement: `const mappedX = x ? { \"orig\": x.camel, ... } : undefined`\n */\nfunction buildRemappingCode(mapping: Record<string, string>, varName: string, sourceName: string): string {\n const pairs = Object.entries(mapping)\n .map(([orig, camel]) => `\"${orig}\": ${sourceName}.${camel}`)\n .join(', ')\n return `const ${varName} = ${sourceName} ? { ${pairs} } : undefined`\n}\n\nconst declarationPrinter = functionPrinter({ mode: 'declaration' })\n\nexport function McpHandler({ name, node, resolver, baseURL, dataReturnType, paramsCasing }: Props): KubbReactNode {\n const urlPath = new URLPath(node.path)\n const contentType = node.requestBody?.content?.[0]?.contentType\n const isFormData = contentType === 'multipart/form-data'\n\n const { query: queryParams, header: headerParams } = getOperationParameters(node, { paramsCasing })\n const { path: originalPathParams, query: originalQueryParams, header: originalHeaderParams } = getOperationParameters(node)\n\n const requestName = node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : undefined\n const responseName = resolver.resolveResponseName(node)\n\n const errorResponses = node.responses.filter((r) => Number(r.statusCode) >= 400).map((r) => resolver.resolveResponseStatusName(node, r.statusCode))\n const errorType = errorResponses.length > 0 ? errorResponses.join(' | ') : 'Error'\n\n const TError = `ResponseErrorConfig<${errorType}>`\n const generics = [responseName, TError, requestName || 'unknown'].filter(Boolean)\n\n const paramsNode = ast.createOperationParams(node, {\n paramsType: 'object',\n pathParamsType: 'inline',\n resolver,\n paramsCasing,\n })\n const baseParamsSignature = declarationPrinter.print(paramsNode) ?? ''\n const paramsSignature = baseParamsSignature\n ? `${baseParamsSignature}, request: RequestHandlerExtra<ServerRequest, ServerNotification>`\n : 'request: RequestHandlerExtra<ServerRequest, ServerNotification>'\n\n const pathParamsMapping = paramsCasing ? buildTransformedParamsMapping(originalPathParams, camelCase) : undefined\n const queryParamsMapping = paramsCasing ? buildTransformedParamsMapping(originalQueryParams, camelCase) : undefined\n const headerParamsMapping = paramsCasing ? buildTransformedParamsMapping(originalHeaderParams, camelCase) : undefined\n\n const contentTypeHeader =\n contentType && contentType !== 'application/json' && contentType !== 'multipart/form-data' ? `'Content-Type': '${contentType}'` : undefined\n const headers = [headerParams.length ? (headerParamsMapping ? '...mappedHeaders' : '...headers') : undefined, contentTypeHeader].filter(Boolean)\n\n const fetchConfig: string[] = []\n fetchConfig.push(`method: ${JSON.stringify(node.method.toUpperCase())}`)\n fetchConfig.push(`url: ${urlPath.template}`)\n if (baseURL) fetchConfig.push(`baseURL: \\`${baseURL}\\``)\n if (queryParams.length) fetchConfig.push(queryParamsMapping ? 'params: mappedParams' : 'params')\n if (requestName) fetchConfig.push(`data: ${isFormData ? 'formData as FormData' : 'requestData'}`)\n if (headers.length) fetchConfig.push(`headers: { ${headers.join(', ')} }`)\n\n const callToolResult =\n dataReturnType === 'data'\n ? `return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(res.data)\n }\n ],\n structuredContent: { data: res.data }\n }`\n : `return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(res)\n }\n ],\n structuredContent: { data: res.data }\n }`\n\n return (\n <File.Source name={name} isExportable isIndexable>\n <Function\n name={name}\n async\n export\n params={paramsSignature}\n JSDoc={{\n comments: buildOperationComments(node),\n }}\n returnType={'Promise<CallToolResult>'}\n >\n {''}\n <br />\n <br />\n {pathParamsMapping &&\n Object.entries(pathParamsMapping)\n .filter(([originalName, camelCaseName]) => originalName !== camelCaseName && isValidVarName(originalName))\n .map(([originalName, camelCaseName]) => `const ${originalName} = ${camelCaseName}`)\n .join('\\n')}\n {pathParamsMapping && (\n <>\n <br />\n <br />\n </>\n )}\n {queryParamsMapping && queryParams.length > 0 && (\n <>\n {buildRemappingCode(queryParamsMapping, 'mappedParams', 'params')}\n <br />\n <br />\n </>\n )}\n {headerParamsMapping && headerParams.length > 0 && (\n <>\n {buildRemappingCode(headerParamsMapping, 'mappedHeaders', 'headers')}\n <br />\n <br />\n </>\n )}\n {requestName && 'const requestData = data'}\n <br />\n {isFormData && requestName && 'const formData = buildFormData(requestData)'}\n <br />\n {`const res = await fetch<${generics.join(', ')}>({ ${fetchConfig.join(', ')} }, request)`}\n <br />\n {callToolResult}\n </Function>\n </File.Source>\n )\n}\n","import type { ast } from '@kubb/core'\n\nexport type ZodParam = {\n name: string\n schemaName: string\n}\n\n/**\n * Render a group param value — compose individual schemas into `z.object({ ... })`,\n * or use a schema name string directly.\n */\nexport function zodGroupExpr(entry: string | Array<ZodParam>): string {\n if (typeof entry === 'string') {\n return entry\n }\n const entries = entry.map((p) => `${JSON.stringify(p.name)}: ${p.schemaName}`)\n return `z.object({ ${entries.join(', ')} })`\n}\n\n/**\n * Convert a SchemaNode type to an inline Zod expression string.\n * Used as fallback when no named zod schema is available for a path parameter.\n */\nexport function zodExprFromSchemaNode(schema: ast.SchemaNode): string {\n let expr: string\n switch (schema.type) {\n case 'enum': {\n // namedEnumValues takes priority over enumValues\n const rawValues: Array<string | number | boolean> = schema.namedEnumValues?.length\n ? schema.namedEnumValues.map((v) => v.value)\n : (schema.enumValues ?? []).filter((v): v is string | number | boolean => v !== null)\n\n if (rawValues.length > 0 && rawValues.every((v) => typeof v === 'string')) {\n expr = `z.enum([${rawValues.map((v) => JSON.stringify(v)).join(', ')}])`\n } else if (rawValues.length > 0) {\n const literals = rawValues.map((v) => `z.literal(${JSON.stringify(v)})`)\n expr = literals.length === 1 ? literals[0]! : `z.union([${literals.join(', ')}])`\n } else {\n expr = 'z.string()'\n }\n break\n }\n case 'integer':\n expr = 'z.coerce.number()'\n break\n case 'number':\n expr = 'z.number()'\n break\n case 'boolean':\n expr = 'z.boolean()'\n break\n case 'array':\n expr = 'z.array(z.unknown())'\n break\n default:\n expr = 'z.string()'\n }\n\n if (schema.nullable) {\n expr = `${expr}.nullable()`\n }\n\n return expr\n}\n","import { getOperationParameters } from '@internals/shared'\nimport { ast } from '@kubb/core'\nimport { functionPrinter } from '@kubb/plugin-ts'\nimport { Const, File, Function } from '@kubb/renderer-jsx'\nimport type { KubbReactNode } from '@kubb/renderer-jsx/types'\nimport type { PluginMcp } from '../types.ts'\nimport type { ZodParam } from '../utils.ts'\nimport { zodExprFromSchemaNode, zodGroupExpr } from '../utils.ts'\n\ntype Props = {\n /**\n * Variable name for the MCP server instance (e.g. 'server').\n */\n name: string\n /**\n * Human-readable server name passed to `new McpServer({ name })`.\n */\n serverName: string\n /**\n * Semantic version string passed to `new McpServer({ version })`.\n */\n serverVersion: string\n /**\n * How to style your params.\n */\n paramsCasing?: PluginMcp['resolvedOptions']['paramsCasing']\n /**\n * Operations to register as MCP tools, each carrying its handler,\n * zod schema, and AST node metadata.\n */\n operations: Array<{\n tool: {\n name: string\n title?: string\n description: string\n }\n mcp: {\n name: string\n file: ast.FileNode\n }\n zod: {\n pathParams: Array<ZodParam>\n /**\n * Query params — individual schemas to compose into `z.object({ ... })`.\n */\n queryParams?: string | Array<ZodParam>\n /**\n * Header params — individual schemas to compose into `z.object({ ... })`.\n */\n headerParams?: string | Array<ZodParam>\n requestName?: string\n responseName?: string\n }\n node: ast.OperationNode\n }>\n}\n\nconst keysPrinter = functionPrinter({ mode: 'keys' })\n\nexport function Server({ name, serverName, serverVersion, paramsCasing, operations }: Props): KubbReactNode {\n return (\n <File.Source name={name} isExportable isIndexable>\n <Const name={'server'} export>\n {`\n new McpServer({\n name: '${serverName}',\n version: '${serverVersion}',\n})\n `}\n </Const>\n\n {operations\n .map(({ tool, mcp, zod, node }) => {\n const { path: pathParams } = getOperationParameters(node, { paramsCasing })\n\n const pathEntries: Array<{ key: string; value: string }> = []\n const otherEntries: Array<{ key: string; value: string }> = []\n\n for (const p of pathParams) {\n const zodParam = zod.pathParams.find((zp) => zp.name === p.name)\n pathEntries.push({ key: p.name, value: zodParam ? zodParam.schemaName : zodExprFromSchemaNode(p.schema) })\n }\n\n if (zod.requestName) {\n otherEntries.push({ key: 'data', value: zod.requestName })\n }\n\n if (zod.queryParams) {\n otherEntries.push({ key: 'params', value: zodGroupExpr(zod.queryParams) })\n }\n\n if (zod.headerParams) {\n otherEntries.push({ key: 'headers', value: zodGroupExpr(zod.headerParams) })\n }\n\n otherEntries.sort((a, b) => a.key.localeCompare(b.key))\n const entries = [...pathEntries, ...otherEntries]\n\n const paramsNode = entries.length\n ? ast.createFunctionParameters({\n params: [\n ast.createParameterGroup({\n properties: entries.map((e) => ast.createFunctionParameter({ name: e.key, optional: false })),\n }),\n ],\n })\n : undefined\n\n const destructured = paramsNode ? (keysPrinter.print(paramsNode) ?? '') : ''\n const inputSchema = entries.length ? `{ ${entries.map((e) => `${e.key}: ${e.value}`).join(', ')} }` : undefined\n const outputSchema = zod.responseName\n\n const config = [\n tool.title ? `title: ${JSON.stringify(tool.title)}` : null,\n `description: ${JSON.stringify(tool.description)}`,\n outputSchema ? `outputSchema: { data: ${outputSchema} }` : null,\n ]\n .filter(Boolean)\n .join(',\\n ')\n\n if (inputSchema) {\n return `\nserver.registerTool(${JSON.stringify(tool.name)}, {\n ${config},\n inputSchema: ${inputSchema},\n}, async (${destructured}, request) => {\n return ${mcp.name}(${destructured}, request)\n})\n `\n }\n\n return `\nserver.registerTool(${JSON.stringify(tool.name)}, {\n ${config},\n}, async (request) => {\n return ${mcp.name}(request)\n})\n `\n })\n .filter(Boolean)}\n\n <Function name=\"startServer\" async export>\n {`try {\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n } catch (error) {\n console.error('Failed to start server:', error)\n process.exit(1)\n }`}\n </Function>\n </File.Source>\n )\n}\n","import path from 'node:path'\nimport { resolveOperationTypeNames } from '@internals/shared'\nimport { defineGenerator } from '@kubb/core'\nimport { pluginTsName } from '@kubb/plugin-ts'\nimport { File, jsxRendererSync } from '@kubb/renderer-jsx'\nimport { McpHandler } from '../components/McpHandler.tsx'\nimport type { PluginMcp } from '../types.ts'\n\nexport const mcpGenerator = defineGenerator<PluginMcp>({\n name: 'mcp',\n renderer: jsxRendererSync,\n operation(node, ctx) {\n const { resolver, driver, root } = ctx\n const { output, client, paramsCasing, group } = ctx.options\n\n const pluginTs = driver.getPlugin(pluginTsName)\n\n if (!pluginTs) {\n return null\n }\n\n const tsResolver = driver.getResolver(pluginTsName)\n\n const importedTypeNames = resolveOperationTypeNames(node, tsResolver, { paramsCasing, responseStatusNames: 'error' })\n\n const meta = {\n name: resolver.resolveHandlerName(node),\n file: resolver.resolveFile({ name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path }, { root, output, group }),\n fileTs: tsResolver.resolveFile(\n { name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path },\n {\n root,\n output: pluginTs.options?.output ?? output,\n group: pluginTs.options?.group,\n },\n ),\n } as const\n\n return (\n <File baseName={meta.file.baseName} path={meta.file.path} meta={meta.file.meta}>\n {meta.fileTs && importedTypeNames.length > 0 && (\n <File.Import name={Array.from(new Set(importedTypeNames)).sort()} root={meta.file.path} path={meta.fileTs.path} isTypeOnly />\n )}\n <File.Import name={['CallToolResult', 'ServerNotification', 'ServerRequest']} path={'@modelcontextprotocol/sdk/types'} isTypeOnly />\n <File.Import name={['RequestHandlerExtra']} path={'@modelcontextprotocol/sdk/shared/protocol'} isTypeOnly />\n <File.Import name={['buildFormData']} root={meta.file.path} path={path.resolve(root, '.kubb/config.ts')} />\n {client.importPath ? (\n <>\n <File.Import name={['Client', 'RequestConfig', 'ResponseErrorConfig']} path={client.importPath} isTypeOnly />\n <File.Import name={'fetch'} path={client.importPath} />\n {client.dataReturnType === 'full' && <File.Import name={['ResponseConfig']} path={client.importPath} isTypeOnly />}\n </>\n ) : (\n <>\n <File.Import\n name={['Client', 'RequestConfig', 'ResponseErrorConfig']}\n root={meta.file.path}\n path={path.resolve(root, '.kubb/fetch.ts')}\n isTypeOnly\n />\n <File.Import name={['fetch']} root={meta.file.path} path={path.resolve(root, '.kubb/fetch.ts')} />\n {client.dataReturnType === 'full' && (\n <File.Import name={['ResponseConfig']} root={meta.file.path} path={path.resolve(root, '.kubb/fetch.ts')} isTypeOnly />\n )}\n </>\n )}\n\n <McpHandler\n name={meta.name}\n node={node}\n resolver={tsResolver}\n baseURL={client.baseURL}\n dataReturnType={client.dataReturnType || 'data'}\n paramsCasing={paramsCasing}\n />\n </File>\n )\n },\n})\n","import path from 'node:path'\nimport { findSuccessStatusCode, getOperationParameters } from '@internals/shared'\nimport { defineGenerator } from '@kubb/core'\nimport { pluginZodName } from '@kubb/plugin-zod'\nimport { File, jsxRendererSync } from '@kubb/renderer-jsx'\nimport { Server } from '../components/Server.tsx'\nimport type { PluginMcp } from '../types.ts'\n\n/**\n * Default v5 server generator for `@kubb/plugin-mcp`.\n *\n * Uses individual zod schemas for each param (e.g. `createPetsPathUuidSchema`, `createPetsQueryOffsetSchema`)\n * and `resolveResponseStatusName` for per-status response schemas.\n * Query and header params are composed into `z.object({ ... })` from individual schemas.\n */\nexport const serverGenerator = defineGenerator<PluginMcp>({\n name: 'operations',\n renderer: jsxRendererSync,\n operations(nodes, ctx) {\n const { config, resolver, plugin, driver, root, inputNode } = ctx\n const { output, paramsCasing, group } = ctx.options\n\n const pluginZod = driver.getPlugin(pluginZodName)\n\n if (!pluginZod) {\n return\n }\n\n const zodResolver = driver.getResolver(pluginZodName)\n\n const name = 'server'\n const serverFilePath = path.resolve(root, output.path, 'server.ts')\n const serverFile = {\n baseName: 'server.ts' as const,\n path: serverFilePath,\n meta: { pluginName: plugin.name },\n }\n\n const jsonFilePath = path.resolve(root, output.path, '.mcp.json')\n const jsonFile = {\n baseName: '.mcp.json' as const,\n path: jsonFilePath,\n meta: { pluginName: plugin.name },\n }\n\n const operationsMapped = nodes.map((node) => {\n const { path: pathParams, query: queryParams, header: headerParams } = getOperationParameters(node, { paramsCasing })\n\n const mcpFile = resolver.resolveFile({ name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path }, { root, output, group })\n\n const zodFile = zodResolver.resolveFile(\n { name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path },\n {\n root,\n output: pluginZod.options?.output ?? output,\n group: pluginZod.options?.group,\n },\n )\n\n const requestName = node.requestBody?.content?.[0]?.schema ? zodResolver.resolveDataName(node) : undefined\n const successStatus = findSuccessStatusCode(node.responses)\n const responseName = successStatus ? zodResolver.resolveResponseStatusName(node, successStatus) : undefined\n\n const resolveParams = (params: typeof pathParams) => params.map((p) => ({ name: p.name, schemaName: zodResolver.resolveParamName(node, p) }))\n\n return {\n tool: {\n name: node.operationId,\n title: node.summary || undefined,\n description: node.description || `Make a ${node.method.toUpperCase()} request to ${node.path}`,\n },\n mcp: {\n name: resolver.resolveHandlerName(node),\n file: mcpFile,\n },\n zod: {\n pathParams: resolveParams(pathParams),\n queryParams: queryParams.length ? resolveParams(queryParams) : undefined,\n headerParams: headerParams.length ? resolveParams(headerParams) : undefined,\n requestName,\n responseName,\n file: zodFile,\n },\n node: node,\n }\n })\n\n const imports = operationsMapped.flatMap(({ mcp, zod }) => {\n const zodNames = [\n ...zod.pathParams.map((p) => p.schemaName),\n ...(zod.queryParams ?? []).map((p) => p.schemaName),\n ...(zod.headerParams ?? []).map((p) => p.schemaName),\n zod.requestName,\n zod.responseName,\n ].filter((name): name is string => Boolean(name))\n\n const uniqueNames = [...new Set(zodNames)].sort()\n\n return [\n <File.Import key={mcp.name} name={[mcp.name]} root={serverFile.path} path={mcp.file.path} />,\n uniqueNames.length > 0 && <File.Import key={`zod-${mcp.name}`} name={uniqueNames} root={serverFile.path} path={zod.file.path} />,\n ].filter(Boolean)\n })\n\n return (\n <>\n <File\n baseName={serverFile.baseName}\n path={serverFile.path}\n meta={serverFile.meta}\n banner={resolver.resolveBanner(inputNode, { output, config })}\n footer={resolver.resolveFooter(inputNode, { output, config })}\n >\n <File.Import name={['McpServer']} path={'@modelcontextprotocol/sdk/server/mcp'} />\n <File.Import name={['z']} path={'zod'} />\n <File.Import name={['StdioServerTransport']} path={'@modelcontextprotocol/sdk/server/stdio'} />\n\n {imports}\n <Server\n name={name}\n serverName={inputNode.meta?.title ?? 'server'}\n serverVersion={inputNode.meta?.version ?? '0.0.0'}\n paramsCasing={paramsCasing}\n operations={operationsMapped}\n />\n </File>\n\n <File baseName={jsonFile.baseName} path={jsonFile.path} meta={jsonFile.meta}>\n <File.Source name={name}>\n {`\n {\n \"mcpServers\": {\n \"${inputNode.meta?.title || 'server'}\": {\n \"type\": \"stdio\",\n \"command\": \"npx\",\n \"args\": [\"tsx\", \"${path.relative(path.dirname(jsonFile.path), serverFile.path)}\"]\n }\n }\n }\n `}\n </File.Source>\n </File>\n </>\n )\n },\n})\n","import { camelCase } from '@internals/utils'\nimport { defineResolver } from '@kubb/core'\nimport type { PluginMcp } from '../types.ts'\n\n/**\n * Naming convention resolver for MCP plugin.\n *\n * Provides default naming helpers using camelCase with a `handler` suffix for functions.\n *\n * @example\n * `resolverMcp.default('addPet', 'function') // → 'addPetHandler'`\n */\nexport const resolverMcp = defineResolver<PluginMcp>(() => ({\n name: 'default',\n pluginName: 'plugin-mcp',\n default(name, type) {\n if (type === 'file') {\n return camelCase(name, { isFile: true })\n }\n return camelCase(name, { suffix: 'handler' })\n },\n resolveName(name) {\n return this.default(name, 'function')\n },\n resolvePathName(name, type) {\n return this.default(name, type)\n },\n resolveHandlerName(node) {\n return this.resolveName(node.operationId)\n },\n}))\n","import path from 'node:path'\nimport { camelCase } from '@internals/utils'\n\nimport { ast, definePlugin, type Group } from '@kubb/core'\nimport { pluginClientName } from '@kubb/plugin-client'\nimport { source as axiosClientSource } from '@kubb/plugin-client/templates/clients/axios.source'\nimport { source as fetchClientSource } from '@kubb/plugin-client/templates/clients/fetch.source'\nimport { source as configSource } from '@kubb/plugin-client/templates/config.source'\nimport { pluginTsName } from '@kubb/plugin-ts'\nimport { pluginZodName } from '@kubb/plugin-zod'\nimport { mcpGenerator } from './generators/mcpGenerator.tsx'\nimport { serverGenerator } from './generators/serverGenerator.tsx'\nimport { resolverMcp } from './resolvers/resolverMcp.ts'\nimport type { PluginMcp } from './types.ts'\n\nexport const pluginMcpName = 'plugin-mcp' satisfies PluginMcp['name']\n\nexport const pluginMcp = definePlugin<PluginMcp>((options) => {\n const {\n output = { path: 'mcp', barrelType: 'named' },\n group,\n exclude = [],\n include,\n override = [],\n paramsCasing,\n client,\n resolver: userResolver,\n transformer: userTransformer,\n generators: userGenerators = [],\n } = options\n\n const clientName = client?.client ?? 'axios'\n const clientImportPath = client?.importPath ?? (!client?.bundle ? `@kubb/plugin-client/clients/${clientName}` : undefined)\n\n const groupConfig = group\n ? ({\n ...group,\n name: group.name\n ? group.name\n : (ctx: { group: string }) => {\n if (group.type === 'path') {\n return `${ctx.group.split('/')[1]}`\n }\n return `${camelCase(ctx.group)}Requests`\n },\n } satisfies Group)\n : undefined\n\n return {\n name: pluginMcpName,\n options,\n dependencies: [pluginTsName, pluginZodName],\n hooks: {\n 'kubb:plugin:setup'(ctx) {\n const resolver = userResolver ? { ...resolverMcp, ...userResolver } : resolverMcp\n\n ctx.setOptions({\n output,\n exclude,\n include,\n override,\n group: groupConfig,\n paramsCasing,\n client: {\n client: clientName,\n clientType: client?.clientType ?? 'function',\n importPath: clientImportPath,\n dataReturnType: client?.dataReturnType ?? 'data',\n bundle: client?.bundle,\n baseURL: client?.baseURL,\n paramsCasing: client?.paramsCasing,\n },\n resolver,\n })\n ctx.setResolver(resolver)\n if (userTransformer) {\n ctx.setTransformer(userTransformer)\n }\n ctx.addGenerator(mcpGenerator)\n ctx.addGenerator(serverGenerator)\n for (const gen of userGenerators) {\n ctx.addGenerator(gen)\n }\n\n const root = path.resolve(ctx.config.root, ctx.config.output.path)\n const hasClientPlugin = ctx.config.plugins?.some((p) => p.name === pluginClientName)\n\n if (client?.bundle && !hasClientPlugin && !clientImportPath) {\n ctx.injectFile({\n baseName: 'fetch.ts',\n path: path.resolve(root, '.kubb/fetch.ts'),\n sources: [\n ast.createSource({\n name: 'fetch',\n nodes: [ast.createText(clientName === 'fetch' ? fetchClientSource : axiosClientSource)],\n isExportable: true,\n isIndexable: true,\n }),\n ],\n })\n }\n\n if (!hasClientPlugin) {\n ctx.injectFile({\n baseName: 'config.ts',\n path: path.resolve(root, '.kubb/config.ts'),\n sources: [\n ast.createSource({\n name: 'config',\n nodes: [ast.createText(configSource)],\n isExportable: false,\n isIndexable: false,\n }),\n ],\n })\n }\n },\n },\n }\n})\n\nexport default pluginMcp\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,SAAS,gBAAgB,MAAc,QAAyB;CAS9D,OARmB,KAChB,MAAM,CACN,QAAQ,qBAAqB,QAAQ,CACrC,QAAQ,yBAAyB,QAAQ,CACzC,QAAQ,gBAAgB,QAEH,CAAC,MAAM,gBAAgB,CAAC,OAAO,QAE3C,CACT,KAAK,MAAM,MAAM;EAEhB,IADiB,KAAK,SAAS,KAAK,SAAS,KAAK,aAAa,EACjD,OAAO;EACrB,IAAI,MAAM,KAAK,CAAC,QAAQ,OAAO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE;EAC3E,OAAO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE;GACnD,CACD,KAAK,GAAG,CACR,QAAQ,iBAAiB,GAAG;;;;;;;;;;AAWjC,SAAS,iBAAiB,MAAc,eAAkE;CACxG,MAAM,QAAQ,KAAK,MAAM,iBAAiB;CAC1C,OAAO,MAAM,KAAK,MAAM,MAAM,cAAc,MAAM,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC,KAAK,IAAI;;;;;;;;;;AAWtF,SAAgB,UAAU,MAAc,EAAE,QAAQ,SAAS,IAAI,SAAS,OAAgB,EAAE,EAAU;CAClG,IAAI,QACF,OAAO,iBAAiB,OAAO,MAAM,WAAW,UAAU,MAAM,SAAS;EAAE;EAAQ;EAAQ,GAAG,EAAE,CAAC,CAAC;CAGpG,OAAO,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,MAAM;;;;;;;;AChE9D,MAAM,gBAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAU;;;;;;;;;;;AAYX,SAAgB,eAAe,MAAuB;CACpD,IAAI,CAAC,QAAQ,cAAc,IAAI,KAAkB,EAC/C,OAAO;CAET,OAAO,6BAA6B,KAAK,KAAK;;;;;;;;;;;;ACnDhD,IAAa,UAAb,MAAqB;;;;CAInB;CAEA;CAEA,YAAY,MAAc,UAAmB,EAAE,EAAE;EAC/C,KAAK,OAAO;EACZ,KAAKA,WAAW;;;;;;;;;CAUlB,IAAI,MAAc;EAChB,OAAO,KAAK,WAAW;;;;;;;;;;CAWzB,IAAI,QAAiB;EACnB,IAAI;GACF,OAAO,CAAC,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC;UACtB;GACN,OAAO;;;;;;;;;;CAWX,IAAI,WAAmB;EACrB,OAAO,KAAK,kBAAkB;;;;;;;;;;CAWhC,IAAI,SAA6B;EAC/B,OAAO,KAAK,UAAU;;;;;;;;;;CAWxB,IAAI,SAA6C;EAC/C,OAAO,KAAK,gBAAgB;;CAG9B,gBAAgB,KAAqB;EACnC,MAAM,QAAQ,eAAe,IAAI,GAAG,MAAM,UAAU,IAAI;EACxD,OAAO,KAAKA,SAAS,WAAW,cAAc,UAAU,MAAM,GAAG;;;;;CAMnE,WAAW,IAAgD;EACzD,KAAK,MAAM,SAAS,KAAK,KAAK,SAAS,eAAe,EAAE;GACtD,MAAM,MAAM,MAAM;GAClB,GAAG,KAAK,KAAKC,gBAAgB,IAAI,CAAC;;;CAItC,SAAS,EAAE,OAAO,QAAQ,UAAU,cAA6B,EAAE,EAAsB;EACvF,MAAM,SAAS;GACb,KAAK,SAAS,SAAS,KAAK,WAAW,GAAG,KAAK,iBAAiB,EAAE,UAAU,CAAC;GAC7E,QAAQ,KAAK,gBAAgB;GAC9B;EAED,IAAI,WAAW;GACb,IAAI,SAAS,YACX,OAAO,KAAK,UAAU,OAAO,CAAC,WAAW,KAAK,GAAG,CAAC,WAAW,KAAK,GAAG;GAGvE,IAAI,OAAO,QACT,OAAO,WAAW,OAAO,IAAI,aAAa,KAAK,UAAU,OAAO,OAAO,CAAC,WAAW,KAAK,GAAG,CAAC,WAAW,KAAK,GAAG,CAAC;GAGlH,OAAO,WAAW,OAAO,IAAI;;EAG/B,OAAO;;;;;;;;;CAUT,iBAAiB,EAAE,SAAS,IAAI,aAA4E,EAAE,EAAU;EAUtH,OAAO,KAAK,SATE,KAAK,KAAK,MAAM,cACV,CACjB,KAAK,MAAM,MAAM;GAChB,IAAI,IAAI,MAAM,GAAG,OAAO;GACxB,MAAM,QAAQ,KAAKA,gBAAgB,KAAK;GACxC,OAAO,MAAM,WAAW,SAAS,MAAM,GAAG,MAAM;IAChD,CACD,KAAK,GAEmB,CAAC;;;;;;;;;;;;;CAc9B,eAAe,UAA8E;EAC3F,MAAM,SAAiC,EAAE;EAEzC,KAAKC,YAAY,MAAM,UAAU;GAC/B,MAAM,MAAM,WAAW,SAAS,MAAM,GAAG;GACzC,OAAO,OAAO;IACd;EAEF,OAAO,OAAO,KAAK,OAAO,CAAC,SAAS,IAAI,SAAS,KAAA;;;;;;;;;CAUnD,YAAoB;EAClB,OAAO,KAAK,KAAK,QAAQ,gBAAgB,MAAM;;;;;ACjKnD,SAAS,iBAAiB,MAAyB,MAAgD;CACjG,IAAI,CAAC,MACH;CAGF,IAAI,OAAO,SAAS,YAClB,OAAO,KAAK,KAAK;CAGnB,IAAI,SAAS,WACX,OAAO,KAAK,OAAO,UAAU,IAAI,QAAQ,KAAK,KAAK,CAAC,IAAI,KAAK,KAAA;CAG/D,OAAO,UAAU,KAAK,KAAK,WAAW,KAAK,IAAI,CAAC,WAAW,KAAK,GAAG,CAAC;;AAyBtE,SAAgB,uBAAuB,MAAyB,UAAyC,EAAE,EAAiB;CAC1H,MAAM,EAAE,OAAO,gBAAgB,eAAe,mBAAmB,aAAa,UAAU;CACxF,MAAM,cAAc,iBAAiB,MAAM,KAAK;CAMhD,MAAM,oBAJJ,iBAAiB,qBACb;EAAC,KAAK,eAAe,gBAAgB,KAAK;EAAe,KAAK,WAAW,YAAY,KAAK;EAAW;EAAa,KAAK,cAAc;EAAc,GACnJ;EAAC,KAAK,eAAe,gBAAgB,KAAK;EAAe,KAAK,WAAW,YAAY,KAAK;EAAW,KAAK,cAAc;EAAe;EAAY,EAEvH,QAAQ,YAA+B,QAAQ,QAAQ,CAAC;CAE1F,IAAI,CAAC,YACH,OAAO;CAGT,OAAO,iBAAiB,SAAS,SAAS,KAAK,MAAM,QAAQ,CAAC,KAAK,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,YAA+B,QAAQ,QAAQ,CAAC;;AAGpJ,SAAgB,uBAAuB,MAAyB,UAA0C,EAAE,EAA4B;CACtI,MAAM,SAASC,WAAAA,IAAI,WAAW,KAAK,YAAY,QAAQ,aAAa;CAEpE,OAAO;EACL,MAAM,OAAO,QAAQ,UAAU,MAAM,OAAO,OAAO;EACnD,OAAO,OAAO,QAAQ,UAAU,MAAM,OAAO,QAAQ;EACrD,QAAQ,OAAO,QAAQ,UAAU,MAAM,OAAO,SAAS;EACvD,QAAQ,OAAO,QAAQ,UAAU,MAAM,OAAO,SAAS;EACxD;;AAGH,SAAgB,oBAAoB,YAAkE;CACpG,MAAM,OAAO,OAAO,WAAW;CAE/B,OAAO,OAAO,MAAM,KAAK,GAAG,KAAA,IAAY;;AAG1C,SAAgB,oBAAoB,YAAuD;CACzF,MAAM,OAAO,oBAAoB,WAAW;CAE5C,OAAO,SAAS,KAAA,KAAa,QAAQ,OAAO,OAAO;;AAGrD,SAAgB,kBAAkB,YAAuD;CACvF,MAAM,OAAO,oBAAoB,WAAW;CAE5C,OAAO,SAAS,KAAA,KAAa,QAAQ;;AAevC,SAAgB,kBAAkB,MAAyB,UAAgD;CACzG,OAAO,KAAK,UACT,QAAQ,aAAa,kBAAkB,SAAS,WAAW,CAAC,CAC5D,KAAK,aAAa,SAAS,0BAA0B,MAAM,SAAS,WAAW,CAAC;;AAGrF,SAAgB,uBAAuB,MAAyB,UAAgD;CAC9G,OAAO,KAAK,UAAU,KAAK,aAAa,SAAS,0BAA0B,MAAM,SAAS,WAAW,CAAC;;AAGxG,MAAM,sCAAsB,IAAI,SAA2D;AAE3F,SAAgB,0BACd,MACA,UACA,UAA2C,EAAE,EACnC;CACV,MAAM,WAAW,GAAG,KAAK,YAAY,IAAI,QAAQ,gBAAgB,GAAG,IAAI,QAAQ,SAAS,GAAG,IAAI,QAAQ,uBAAuB,GAAG,KAAK,QAAQ,WAAW,EAAE,EAAE,KAAK,IAAI;CACvK,IAAI,aAAa,oBAAoB,IAAI,SAAS;CAClD,IAAI,YAAY;EACd,MAAM,SAAS,WAAW,IAAI,SAAS;EACvC,IAAI,QAAQ,OAAO;QACd;EACL,6BAAa,IAAI,KAAK;EACtB,oBAAoB,IAAI,UAAU,WAAW;;CAG/C,MAAM,EAAE,MAAM,OAAO,WAAW,uBAAuB,MAAM,EAAE,cAAc,QAAQ,cAAc,CAAC;CACpG,MAAM,sBACJ,QAAQ,wBAAwB,UAC5B,kBAAkB,MAAM,SAAS,GACjC,QAAQ,wBAAwB,QAC9B,EAAE,GACF,uBAAuB,MAAM,SAAS;CAC9C,MAAM,UAAU,IAAI,IAAI,QAAQ,WAAW,EAAE,CAAC;CAC9C,MAAM,aAAa;EACjB,GAAG,KAAK,KAAK,UAAU,SAAS,sBAAsB,MAAM,MAAM,CAAC;EACnE,GAAG,MAAM,KAAK,UAAU,SAAS,uBAAuB,MAAM,MAAM,CAAC;EACrE,GAAG,OAAO,KAAK,UAAU,SAAS,wBAAwB,MAAM,MAAM,CAAC;EACxE;CACD,MAAM,uBAAuB,CAAC,KAAK,aAAa,UAAU,IAAI,SAAS,SAAS,gBAAgB,KAAK,GAAG,KAAA,GAAW,SAAS,oBAAoB,KAAK,CAAC;CAMtJ,MAAM,UAJJ,QAAQ,UAAU,wBACd;EAAC,GAAG;EAAsB,GAAG;EAAY,GAAG;EAAoB,GAChE;EAAC,GAAG;EAAY,GAAG;EAAsB,GAAG;EAAoB,EAEjD,QAAQ,SAAyB,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;CAC1F,WAAW,IAAI,UAAU,OAAO;CAChC,OAAO;;AAuBT,SAAgB,sBAAsB,WAAgG;CACpI,KAAK,MAAM,YAAY,WACrB,IAAI,oBAAoB,SAAS,WAAW,EAC1C,OAAO,SAAS;;;;AC7NtB,SAAgB,mBACd,gBACA,cACoC;CACpC,MAAM,UAAkC,EAAE;CAC1C,IAAI,aAAa;CAEjB,eAAe,SAAS,OAAO,MAAM;EACnC,MAAM,aAAa,aAAa,IAAI,QAAQ,MAAM;EAClD,QAAQ,MAAM,QAAQ;EAEtB,IAAI,MAAM,SAAS,YACjB,aAAa;GAEf;CAEF,OAAO,aAAa,UAAU,KAAA;;AAGhC,SAAgB,8BACd,QACA,eACoC;CACpC,IAAI,CAAC,OAAO,QACV;CAGF,OAAO,mBACL,QACA,OAAO,KAAK,WAAW;EAAE,GAAG;EAAO,MAAM,cAAc,MAAM,KAAK;EAAE,EAAE,CACvE;;;;;;;ACYH,SAAS,mBAAmB,SAAiC,SAAiB,YAA4B;CAIxG,OAAO,SAAS,QAAQ,KAAK,WAAW,OAH1B,OAAO,QAAQ,QAAQ,CAClC,KAAK,CAAC,MAAM,WAAW,IAAI,KAAK,KAAK,WAAW,GAAG,QAAQ,CAC3D,KAAK,KAC4C,CAAC;;AAGvD,MAAM,sBAAA,GAAA,gBAAA,iBAAqC,EAAE,MAAM,eAAe,CAAC;AAEnE,SAAgB,WAAW,EAAE,MAAM,MAAM,UAAU,SAAS,gBAAgB,gBAAsC;CAChH,MAAM,UAAU,IAAI,QAAQ,KAAK,KAAK;CACtC,MAAM,cAAc,KAAK,aAAa,UAAU,IAAI;CACpD,MAAM,aAAa,gBAAgB;CAEnC,MAAM,EAAE,OAAO,aAAa,QAAQ,iBAAiB,uBAAuB,MAAM,EAAE,cAAc,CAAC;CACnG,MAAM,EAAE,MAAM,oBAAoB,OAAO,qBAAqB,QAAQ,yBAAyB,uBAAuB,KAAK;CAE3H,MAAM,cAAc,KAAK,aAAa,UAAU,IAAI,SAAS,SAAS,gBAAgB,KAAK,GAAG,KAAA;CAC9F,MAAM,eAAe,SAAS,oBAAoB,KAAK;CAEvD,MAAM,iBAAiB,KAAK,UAAU,QAAQ,MAAM,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,KAAK,MAAM,SAAS,0BAA0B,MAAM,EAAE,WAAW,CAAC;CAInJ,MAAM,WAAW;EAAC;EAAc,uBAHd,eAAe,SAAS,IAAI,eAAe,KAAK,MAAM,GAAG,QAE3B;EACR,eAAe;EAAU,CAAC,OAAO,QAAQ;CAEjF,MAAM,aAAaC,WAAAA,IAAI,sBAAsB,MAAM;EACjD,YAAY;EACZ,gBAAgB;EAChB;EACA;EACD,CAAC;CACF,MAAM,sBAAsB,mBAAmB,MAAM,WAAW,IAAI;CACpE,MAAM,kBAAkB,sBACpB,GAAG,oBAAoB,qEACvB;CAEJ,MAAM,oBAAoB,eAAe,8BAA8B,oBAAoB,UAAU,GAAG,KAAA;CACxG,MAAM,qBAAqB,eAAe,8BAA8B,qBAAqB,UAAU,GAAG,KAAA;CAC1G,MAAM,sBAAsB,eAAe,8BAA8B,sBAAsB,UAAU,GAAG,KAAA;CAE5G,MAAM,oBACJ,eAAe,gBAAgB,sBAAsB,gBAAgB,wBAAwB,oBAAoB,YAAY,KAAK,KAAA;CACpI,MAAM,UAAU,CAAC,aAAa,SAAU,sBAAsB,qBAAqB,eAAgB,KAAA,GAAW,kBAAkB,CAAC,OAAO,QAAQ;CAEhJ,MAAM,cAAwB,EAAE;CAChC,YAAY,KAAK,WAAW,KAAK,UAAU,KAAK,OAAO,aAAa,CAAC,GAAG;CACxE,YAAY,KAAK,QAAQ,QAAQ,WAAW;CAC5C,IAAI,SAAS,YAAY,KAAK,cAAc,QAAQ,IAAI;CACxD,IAAI,YAAY,QAAQ,YAAY,KAAK,qBAAqB,yBAAyB,SAAS;CAChG,IAAI,aAAa,YAAY,KAAK,SAAS,aAAa,yBAAyB,gBAAgB;CACjG,IAAI,QAAQ,QAAQ,YAAY,KAAK,cAAc,QAAQ,KAAK,KAAK,CAAC,IAAI;CAE1E,MAAM,iBACJ,mBAAmB,SACf;;;;;;;;gBASA;;;;;;;;;CAUN,OACE,iBAAA,GAAA,+BAAA,KAACC,mBAAAA,KAAK,QAAN;EAAmB;EAAM,cAAA;EAAa,aAAA;YACpC,iBAAA,GAAA,+BAAA,MAACC,mBAAAA,UAAD;GACQ;GACN,OAAA;GACA,QAAA;GACA,QAAQ;GACR,OAAO,EACL,UAAU,uBAAuB,KAAK,EACvC;GACD,YAAY;aARd;IAUG;IACD,iBAAA,GAAA,+BAAA,KAAC,MAAD,EAAM,CAAA;IACN,iBAAA,GAAA,+BAAA,KAAC,MAAD,EAAM,CAAA;IACL,qBACC,OAAO,QAAQ,kBAAkB,CAC9B,QAAQ,CAAC,cAAc,mBAAmB,iBAAiB,iBAAiB,eAAe,aAAa,CAAC,CACzG,KAAK,CAAC,cAAc,mBAAmB,SAAS,aAAa,KAAK,gBAAgB,CAClF,KAAK,KAAK;IACd,qBACC,iBAAA,GAAA,+BAAA,MAAA,+BAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,+BAAA,KAAC,MAAD,EAAM,CAAA,EACN,iBAAA,GAAA,+BAAA,KAAC,MAAD,EAAM,CAAA,CACL,EAAA,CAAA;IAEJ,sBAAsB,YAAY,SAAS,KAC1C,iBAAA,GAAA,+BAAA,MAAA,+BAAA,UAAA,EAAA,UAAA;KACG,mBAAmB,oBAAoB,gBAAgB,SAAS;KACjE,iBAAA,GAAA,+BAAA,KAAC,MAAD,EAAM,CAAA;KACN,iBAAA,GAAA,+BAAA,KAAC,MAAD,EAAM,CAAA;KACL,EAAA,CAAA;IAEJ,uBAAuB,aAAa,SAAS,KAC5C,iBAAA,GAAA,+BAAA,MAAA,+BAAA,UAAA,EAAA,UAAA;KACG,mBAAmB,qBAAqB,iBAAiB,UAAU;KACpE,iBAAA,GAAA,+BAAA,KAAC,MAAD,EAAM,CAAA;KACN,iBAAA,GAAA,+BAAA,KAAC,MAAD,EAAM,CAAA;KACL,EAAA,CAAA;IAEJ,eAAe;IAChB,iBAAA,GAAA,+BAAA,KAAC,MAAD,EAAM,CAAA;IACL,cAAc,eAAe;IAC9B,iBAAA,GAAA,+BAAA,KAAC,MAAD,EAAM,CAAA;IACL,2BAA2B,SAAS,KAAK,KAAK,CAAC,MAAM,YAAY,KAAK,KAAK,CAAC;IAC7E,iBAAA,GAAA,+BAAA,KAAC,MAAD,EAAM,CAAA;IACL;IACQ;;EACC,CAAA;;;;;;;;ACzJlB,SAAgB,aAAa,OAAyC;CACpE,IAAI,OAAO,UAAU,UACnB,OAAO;CAGT,OAAO,cADS,MAAM,KAAK,MAAM,GAAG,KAAK,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,aACrC,CAAC,KAAK,KAAK,CAAC;;;;;;AAO1C,SAAgB,sBAAsB,QAAgC;CACpE,IAAI;CACJ,QAAQ,OAAO,MAAf;EACE,KAAK,QAAQ;GAEX,MAAM,YAA8C,OAAO,iBAAiB,SACxE,OAAO,gBAAgB,KAAK,MAAM,EAAE,MAAM,IACzC,OAAO,cAAc,EAAE,EAAE,QAAQ,MAAsC,MAAM,KAAK;GAEvF,IAAI,UAAU,SAAS,KAAK,UAAU,OAAO,MAAM,OAAO,MAAM,SAAS,EACvE,OAAO,WAAW,UAAU,KAAK,MAAM,KAAK,UAAU,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC;QAChE,IAAI,UAAU,SAAS,GAAG;IAC/B,MAAM,WAAW,UAAU,KAAK,MAAM,aAAa,KAAK,UAAU,EAAE,CAAC,GAAG;IACxE,OAAO,SAAS,WAAW,IAAI,SAAS,KAAM,YAAY,SAAS,KAAK,KAAK,CAAC;UAE9E,OAAO;GAET;;EAEF,KAAK;GACH,OAAO;GACP;EACF,KAAK;GACH,OAAO;GACP;EACF,KAAK;GACH,OAAO;GACP;EACF,KAAK;GACH,OAAO;GACP;EACF,SACE,OAAO;;CAGX,IAAI,OAAO,UACT,OAAO,GAAG,KAAK;CAGjB,OAAO;;;;ACLT,MAAM,eAAA,GAAA,gBAAA,iBAA8B,EAAE,MAAM,QAAQ,CAAC;AAErD,SAAgB,OAAO,EAAE,MAAM,YAAY,eAAe,cAAc,cAAoC;CAC1G,OACE,iBAAA,GAAA,+BAAA,MAACC,mBAAAA,KAAK,QAAN;EAAmB;EAAM,cAAA;EAAa,aAAA;YAAtC;GACE,iBAAA,GAAA,+BAAA,KAACC,mBAAAA,OAAD;IAAO,MAAM;IAAU,QAAA;cACpB;;WAEE,WAAW;cACR,cAAc;;;IAGd,CAAA;GAEP,WACE,KAAK,EAAE,MAAM,KAAK,KAAK,WAAW;IACjC,MAAM,EAAE,MAAM,eAAe,uBAAuB,MAAM,EAAE,cAAc,CAAC;IAE3E,MAAM,cAAqD,EAAE;IAC7D,MAAM,eAAsD,EAAE;IAE9D,KAAK,MAAM,KAAK,YAAY;KAC1B,MAAM,WAAW,IAAI,WAAW,MAAM,OAAO,GAAG,SAAS,EAAE,KAAK;KAChE,YAAY,KAAK;MAAE,KAAK,EAAE;MAAM,OAAO,WAAW,SAAS,aAAa,sBAAsB,EAAE,OAAO;MAAE,CAAC;;IAG5G,IAAI,IAAI,aACN,aAAa,KAAK;KAAE,KAAK;KAAQ,OAAO,IAAI;KAAa,CAAC;IAG5D,IAAI,IAAI,aACN,aAAa,KAAK;KAAE,KAAK;KAAU,OAAO,aAAa,IAAI,YAAY;KAAE,CAAC;IAG5E,IAAI,IAAI,cACN,aAAa,KAAK;KAAE,KAAK;KAAW,OAAO,aAAa,IAAI,aAAa;KAAE,CAAC;IAG9E,aAAa,MAAM,GAAG,MAAM,EAAE,IAAI,cAAc,EAAE,IAAI,CAAC;IACvD,MAAM,UAAU,CAAC,GAAG,aAAa,GAAG,aAAa;IAEjD,MAAM,aAAa,QAAQ,SACvBC,WAAAA,IAAI,yBAAyB,EAC3B,QAAQ,CACNA,WAAAA,IAAI,qBAAqB,EACvB,YAAY,QAAQ,KAAK,MAAMA,WAAAA,IAAI,wBAAwB;KAAE,MAAM,EAAE;KAAK,UAAU;KAAO,CAAC,CAAC,EAC9F,CAAC,CACH,EACF,CAAC,GACF,KAAA;IAEJ,MAAM,eAAe,aAAc,YAAY,MAAM,WAAW,IAAI,KAAM;IAC1E,MAAM,cAAc,QAAQ,SAAS,KAAK,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,CAAC,KAAK,KAAK,CAAC,MAAM,KAAA;IACtG,MAAM,eAAe,IAAI;IAEzB,MAAM,SAAS;KACb,KAAK,QAAQ,UAAU,KAAK,UAAU,KAAK,MAAM,KAAK;KACtD,gBAAgB,KAAK,UAAU,KAAK,YAAY;KAChD,eAAe,yBAAyB,aAAa,MAAM;KAC5D,CACE,OAAO,QAAQ,CACf,KAAK,QAAQ;IAEhB,IAAI,aACF,OAAO;sBACG,KAAK,UAAU,KAAK,KAAK,CAAC;IAC5C,OAAO;iBACM,YAAY;YACjB,aAAa;WACd,IAAI,KAAK,GAAG,aAAa;;;IAK1B,OAAO;sBACK,KAAK,UAAU,KAAK,KAAK,CAAC;IAC5C,OAAO;;WAEA,IAAI,KAAK;;;KAGV,CACD,OAAO,QAAQ;GAElB,iBAAA,GAAA,+BAAA,KAACC,mBAAAA,UAAD;IAAU,MAAK;IAAc,OAAA;IAAM,QAAA;cAChC;;;;;;;;IAQQ,CAAA;GACC;;;;;AC/IlB,MAAa,gBAAA,GAAA,WAAA,iBAA0C;CACrD,MAAM;CACN,UAAUC,mBAAAA;CACV,UAAU,MAAM,KAAK;EACnB,MAAM,EAAE,UAAU,QAAQ,SAAS;EACnC,MAAM,EAAE,QAAQ,QAAQ,cAAc,UAAU,IAAI;EAEpD,MAAM,WAAW,OAAO,UAAUC,gBAAAA,aAAa;EAE/C,IAAI,CAAC,UACH,OAAO;EAGT,MAAM,aAAa,OAAO,YAAYA,gBAAAA,aAAa;EAEnD,MAAM,oBAAoB,0BAA0B,MAAM,YAAY;GAAE;GAAc,qBAAqB;GAAS,CAAC;EAErH,MAAM,OAAO;GACX,MAAM,SAAS,mBAAmB,KAAK;GACvC,MAAM,SAAS,YAAY;IAAE,MAAM,KAAK;IAAa,SAAS;IAAO,KAAK,KAAK,KAAK,MAAM;IAAW,MAAM,KAAK;IAAM,EAAE;IAAE;IAAM;IAAQ;IAAO,CAAC;GAChJ,QAAQ,WAAW,YACjB;IAAE,MAAM,KAAK;IAAa,SAAS;IAAO,KAAK,KAAK,KAAK,MAAM;IAAW,MAAM,KAAK;IAAM,EAC3F;IACE;IACA,QAAQ,SAAS,SAAS,UAAU;IACpC,OAAO,SAAS,SAAS;IAC1B,CACF;GACF;EAED,OACE,iBAAA,GAAA,+BAAA,MAACC,mBAAAA,MAAD;GAAM,UAAU,KAAK,KAAK;GAAU,MAAM,KAAK,KAAK;GAAM,MAAM,KAAK,KAAK;aAA1E;IACG,KAAK,UAAU,kBAAkB,SAAS,KACzC,iBAAA,GAAA,+BAAA,KAACA,mBAAAA,KAAK,QAAN;KAAa,MAAM,MAAM,KAAK,IAAI,IAAI,kBAAkB,CAAC,CAAC,MAAM;KAAE,MAAM,KAAK,KAAK;KAAM,MAAM,KAAK,OAAO;KAAM,YAAA;KAAa,CAAA;IAE/H,iBAAA,GAAA,+BAAA,KAACA,mBAAAA,KAAK,QAAN;KAAa,MAAM;MAAC;MAAkB;MAAsB;MAAgB;KAAE,MAAM;KAAmC,YAAA;KAAa,CAAA;IACpI,iBAAA,GAAA,+BAAA,KAACA,mBAAAA,KAAK,QAAN;KAAa,MAAM,CAAC,sBAAsB;KAAE,MAAM;KAA6C,YAAA;KAAa,CAAA;IAC5G,iBAAA,GAAA,+BAAA,KAACA,mBAAAA,KAAK,QAAN;KAAa,MAAM,CAAC,gBAAgB;KAAE,MAAM,KAAK,KAAK;KAAM,MAAMC,UAAAA,QAAK,QAAQ,MAAM,kBAAkB;KAAI,CAAA;IAC1G,OAAO,aACN,iBAAA,GAAA,+BAAA,MAAA,+BAAA,UAAA,EAAA,UAAA;KACE,iBAAA,GAAA,+BAAA,KAACD,mBAAAA,KAAK,QAAN;MAAa,MAAM;OAAC;OAAU;OAAiB;OAAsB;MAAE,MAAM,OAAO;MAAY,YAAA;MAAa,CAAA;KAC7G,iBAAA,GAAA,+BAAA,KAACA,mBAAAA,KAAK,QAAN;MAAa,MAAM;MAAS,MAAM,OAAO;MAAc,CAAA;KACtD,OAAO,mBAAmB,UAAU,iBAAA,GAAA,+BAAA,KAACA,mBAAAA,KAAK,QAAN;MAAa,MAAM,CAAC,iBAAiB;MAAE,MAAM,OAAO;MAAY,YAAA;MAAa,CAAA;KACjH,EAAA,CAAA,GAEH,iBAAA,GAAA,+BAAA,MAAA,+BAAA,UAAA,EAAA,UAAA;KACE,iBAAA,GAAA,+BAAA,KAACA,mBAAAA,KAAK,QAAN;MACE,MAAM;OAAC;OAAU;OAAiB;OAAsB;MACxD,MAAM,KAAK,KAAK;MAChB,MAAMC,UAAAA,QAAK,QAAQ,MAAM,iBAAiB;MAC1C,YAAA;MACA,CAAA;KACF,iBAAA,GAAA,+BAAA,KAACD,mBAAAA,KAAK,QAAN;MAAa,MAAM,CAAC,QAAQ;MAAE,MAAM,KAAK,KAAK;MAAM,MAAMC,UAAAA,QAAK,QAAQ,MAAM,iBAAiB;MAAI,CAAA;KACjG,OAAO,mBAAmB,UACzB,iBAAA,GAAA,+BAAA,KAACD,mBAAAA,KAAK,QAAN;MAAa,MAAM,CAAC,iBAAiB;MAAE,MAAM,KAAK,KAAK;MAAM,MAAMC,UAAAA,QAAK,QAAQ,MAAM,iBAAiB;MAAE,YAAA;MAAa,CAAA;KAEvH,EAAA,CAAA;IAGL,iBAAA,GAAA,+BAAA,KAAC,YAAD;KACE,MAAM,KAAK;KACL;KACN,UAAU;KACV,SAAS,OAAO;KAChB,gBAAgB,OAAO,kBAAkB;KAC3B;KACd,CAAA;IACG;;;CAGZ,CAAC;;;;;;;;;;AC/DF,MAAa,mBAAA,GAAA,WAAA,iBAA6C;CACxD,MAAM;CACN,UAAUC,mBAAAA;CACV,WAAW,OAAO,KAAK;EACrB,MAAM,EAAE,QAAQ,UAAU,QAAQ,QAAQ,MAAM,cAAc;EAC9D,MAAM,EAAE,QAAQ,cAAc,UAAU,IAAI;EAE5C,MAAM,YAAY,OAAO,UAAUC,iBAAAA,cAAc;EAEjD,IAAI,CAAC,WACH;EAGF,MAAM,cAAc,OAAO,YAAYA,iBAAAA,cAAc;EAErD,MAAM,OAAO;EAEb,MAAM,aAAa;GACjB,UAAU;GACV,MAHqBC,UAAAA,QAAK,QAAQ,MAAM,OAAO,MAAM,YAGjC;GACpB,MAAM,EAAE,YAAY,OAAO,MAAM;GAClC;EAGD,MAAM,WAAW;GACf,UAAU;GACV,MAHmBA,UAAAA,QAAK,QAAQ,MAAM,OAAO,MAAM,YAGjC;GAClB,MAAM,EAAE,YAAY,OAAO,MAAM;GAClC;EAED,MAAM,mBAAmB,MAAM,KAAK,SAAS;GAC3C,MAAM,EAAE,MAAM,YAAY,OAAO,aAAa,QAAQ,iBAAiB,uBAAuB,MAAM,EAAE,cAAc,CAAC;GAErH,MAAM,UAAU,SAAS,YAAY;IAAE,MAAM,KAAK;IAAa,SAAS;IAAO,KAAK,KAAK,KAAK,MAAM;IAAW,MAAM,KAAK;IAAM,EAAE;IAAE;IAAM;IAAQ;IAAO,CAAC;GAE1J,MAAM,UAAU,YAAY,YAC1B;IAAE,MAAM,KAAK;IAAa,SAAS;IAAO,KAAK,KAAK,KAAK,MAAM;IAAW,MAAM,KAAK;IAAM,EAC3F;IACE;IACA,QAAQ,UAAU,SAAS,UAAU;IACrC,OAAO,UAAU,SAAS;IAC3B,CACF;GAED,MAAM,cAAc,KAAK,aAAa,UAAU,IAAI,SAAS,YAAY,gBAAgB,KAAK,GAAG,KAAA;GACjG,MAAM,gBAAgB,sBAAsB,KAAK,UAAU;GAC3D,MAAM,eAAe,gBAAgB,YAAY,0BAA0B,MAAM,cAAc,GAAG,KAAA;GAElG,MAAM,iBAAiB,WAA8B,OAAO,KAAK,OAAO;IAAE,MAAM,EAAE;IAAM,YAAY,YAAY,iBAAiB,MAAM,EAAE;IAAE,EAAE;GAE7I,OAAO;IACL,MAAM;KACJ,MAAM,KAAK;KACX,OAAO,KAAK,WAAW,KAAA;KACvB,aAAa,KAAK,eAAe,UAAU,KAAK,OAAO,aAAa,CAAC,cAAc,KAAK;KACzF;IACD,KAAK;KACH,MAAM,SAAS,mBAAmB,KAAK;KACvC,MAAM;KACP;IACD,KAAK;KACH,YAAY,cAAc,WAAW;KACrC,aAAa,YAAY,SAAS,cAAc,YAAY,GAAG,KAAA;KAC/D,cAAc,aAAa,SAAS,cAAc,aAAa,GAAG,KAAA;KAClE;KACA;KACA,MAAM;KACP;IACK;IACP;IACD;EAEF,MAAM,UAAU,iBAAiB,SAAS,EAAE,KAAK,UAAU;GACzD,MAAM,WAAW;IACf,GAAG,IAAI,WAAW,KAAK,MAAM,EAAE,WAAW;IAC1C,IAAI,IAAI,eAAe,EAAE,EAAE,KAAK,MAAM,EAAE,WAAW;IACnD,IAAI,IAAI,gBAAgB,EAAE,EAAE,KAAK,MAAM,EAAE,WAAW;IACpD,IAAI;IACJ,IAAI;IACL,CAAC,QAAQ,SAAyB,QAAQ,KAAK,CAAC;GAEjD,MAAM,cAAc,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,CAAC,MAAM;GAEjD,OAAO,CACL,iBAAA,GAAA,+BAAA,KAACC,mBAAAA,KAAK,QAAN;IAA4B,MAAM,CAAC,IAAI,KAAK;IAAE,MAAM,WAAW;IAAM,MAAM,IAAI,KAAK;IAAQ,EAA1E,IAAI,KAAsE,EAC5F,YAAY,SAAS,KAAK,iBAAA,GAAA,+BAAA,KAACA,mBAAAA,KAAK,QAAN;IAAqC,MAAM;IAAa,MAAM,WAAW;IAAM,MAAM,IAAI,KAAK;IAAQ,EAApF,OAAO,IAAI,OAAyE,CACjI,CAAC,OAAO,QAAQ;IACjB;EAEF,OACE,iBAAA,GAAA,+BAAA,MAAA,+BAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,+BAAA,MAACA,mBAAAA,MAAD;GACE,UAAU,WAAW;GACrB,MAAM,WAAW;GACjB,MAAM,WAAW;GACjB,QAAQ,SAAS,cAAc,WAAW;IAAE;IAAQ;IAAQ,CAAC;GAC7D,QAAQ,SAAS,cAAc,WAAW;IAAE;IAAQ;IAAQ,CAAC;aAL/D;IAOE,iBAAA,GAAA,+BAAA,KAACA,mBAAAA,KAAK,QAAN;KAAa,MAAM,CAAC,YAAY;KAAE,MAAM;KAA0C,CAAA;IAClF,iBAAA,GAAA,+BAAA,KAACA,mBAAAA,KAAK,QAAN;KAAa,MAAM,CAAC,IAAI;KAAE,MAAM;KAAS,CAAA;IACzC,iBAAA,GAAA,+BAAA,KAACA,mBAAAA,KAAK,QAAN;KAAa,MAAM,CAAC,uBAAuB;KAAE,MAAM;KAA4C,CAAA;IAE9F;IACD,iBAAA,GAAA,+BAAA,KAAC,QAAD;KACQ;KACN,YAAY,UAAU,MAAM,SAAS;KACrC,eAAe,UAAU,MAAM,WAAW;KAC5B;KACd,YAAY;KACZ,CAAA;IACG;MAEP,iBAAA,GAAA,+BAAA,KAACA,mBAAAA,MAAD;GAAM,UAAU,SAAS;GAAU,MAAM,SAAS;GAAM,MAAM,SAAS;aACrE,iBAAA,GAAA,+BAAA,KAACA,mBAAAA,KAAK,QAAN;IAAmB;cAChB;;;iBAGI,UAAU,MAAM,SAAS,SAAS;;;mCAGhBD,UAAAA,QAAK,SAASA,UAAAA,QAAK,QAAQ,SAAS,KAAK,EAAE,WAAW,KAAK,CAAC;;;;;IAKvE,CAAA;GACT,CAAA,CACN,EAAA,CAAA;;CAGR,CAAC;;;;;;;;;;;ACrIF,MAAa,eAAA,GAAA,WAAA,uBAA+C;CAC1D,MAAM;CACN,YAAY;CACZ,QAAQ,MAAM,MAAM;EAClB,IAAI,SAAS,QACX,OAAO,UAAU,MAAM,EAAE,QAAQ,MAAM,CAAC;EAE1C,OAAO,UAAU,MAAM,EAAE,QAAQ,WAAW,CAAC;;CAE/C,YAAY,MAAM;EAChB,OAAO,KAAK,QAAQ,MAAM,WAAW;;CAEvC,gBAAgB,MAAM,MAAM;EAC1B,OAAO,KAAK,QAAQ,MAAM,KAAK;;CAEjC,mBAAmB,MAAM;EACvB,OAAO,KAAK,YAAY,KAAK,YAAY;;CAE5C,EAAE;;;ACfH,MAAa,gBAAgB;AAE7B,MAAa,aAAA,GAAA,WAAA,eAAqC,YAAY;CAC5D,MAAM,EACJ,SAAS;EAAE,MAAM;EAAO,YAAY;EAAS,EAC7C,OACA,UAAU,EAAE,EACZ,SACA,WAAW,EAAE,EACb,cACA,QACA,UAAU,cACV,aAAa,iBACb,YAAY,iBAAiB,EAAE,KAC7B;CAEJ,MAAM,aAAa,QAAQ,UAAU;CACrC,MAAM,mBAAmB,QAAQ,eAAe,CAAC,QAAQ,SAAS,+BAA+B,eAAe,KAAA;CAEhH,MAAM,cAAc,QACf;EACC,GAAG;EACH,MAAM,MAAM,OACR,MAAM,QACL,QAA2B;GAC1B,IAAI,MAAM,SAAS,QACjB,OAAO,GAAG,IAAI,MAAM,MAAM,IAAI,CAAC;GAEjC,OAAO,GAAG,UAAU,IAAI,MAAM,CAAC;;EAEtC,GACD,KAAA;CAEJ,OAAO;EACL,MAAM;EACN;EACA,cAAc,CAACE,gBAAAA,cAAcC,iBAAAA,cAAc;EAC3C,OAAO,EACL,oBAAoB,KAAK;GACvB,MAAM,WAAW,eAAe;IAAE,GAAG;IAAa,GAAG;IAAc,GAAG;GAEtE,IAAI,WAAW;IACb;IACA;IACA;IACA;IACA,OAAO;IACP;IACA,QAAQ;KACN,QAAQ;KACR,YAAY,QAAQ,cAAc;KAClC,YAAY;KACZ,gBAAgB,QAAQ,kBAAkB;KAC1C,QAAQ,QAAQ;KAChB,SAAS,QAAQ;KACjB,cAAc,QAAQ;KACvB;IACD;IACD,CAAC;GACF,IAAI,YAAY,SAAS;GACzB,IAAI,iBACF,IAAI,eAAe,gBAAgB;GAErC,IAAI,aAAa,aAAa;GAC9B,IAAI,aAAa,gBAAgB;GACjC,KAAK,MAAM,OAAO,gBAChB,IAAI,aAAa,IAAI;GAGvB,MAAM,OAAOC,YAAAA,QAAK,QAAQ,IAAI,OAAO,MAAM,IAAI,OAAO,OAAO,KAAK;GAClE,MAAM,kBAAkB,IAAI,OAAO,SAAS,MAAM,MAAM,EAAE,SAASC,oBAAAA,iBAAiB;GAEpF,IAAI,QAAQ,UAAU,CAAC,mBAAmB,CAAC,kBACzC,IAAI,WAAW;IACb,UAAU;IACV,MAAMD,YAAAA,QAAK,QAAQ,MAAM,iBAAiB;IAC1C,SAAS,CACPE,WAAAA,IAAI,aAAa;KACf,MAAM;KACN,OAAO,CAACA,WAAAA,IAAI,WAAW,eAAe,UAAUC,mDAAAA,SAAoBC,mDAAAA,OAAkB,CAAC;KACvF,cAAc;KACd,aAAa;KACd,CAAC,CACH;IACF,CAAC;GAGJ,IAAI,CAAC,iBACH,IAAI,WAAW;IACb,UAAU;IACV,MAAMJ,YAAAA,QAAK,QAAQ,MAAM,kBAAkB;IAC3C,SAAS,CACPE,WAAAA,IAAI,aAAa;KACf,MAAM;KACN,OAAO,CAACA,WAAAA,IAAI,WAAWG,4CAAAA,OAAa,CAAC;KACrC,cAAc;KACd,aAAa;KACd,CAAC,CACH;IACF,CAAC;KAGP;EACF;EACD"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["#options","#transformParam","#eachParam","ast","ast","File","Function","File","Const","ast","Function","jsxRendererSync","pluginTsName","File","path","jsxRendererSync","pluginZodName","path","File","pluginTsName","pluginZodName","path","pluginClientName","ast","fetchClientSource","axiosClientSource","configSource"],"sources":["../../../internals/utils/src/casing.ts","../../../internals/utils/src/reserved.ts","../../../internals/utils/src/urlPath.ts","../../../internals/shared/src/operation.ts","../../../internals/shared/src/params.ts","../src/components/McpHandler.tsx","../src/utils.ts","../src/components/Server.tsx","../src/generators/mcpGenerator.tsx","../src/generators/serverGenerator.tsx","../src/resolvers/resolverMcp.ts","../src/plugin.ts"],"sourcesContent":["type Options = {\n /**\n * When `true`, dot-separated segments are split on `.` and joined with `/` after casing.\n */\n isFile?: boolean\n /**\n * Text prepended before casing is applied.\n */\n prefix?: string\n /**\n * Text appended before casing is applied.\n */\n suffix?: string\n}\n\n/**\n * Shared implementation for camelCase and PascalCase conversion.\n * Splits on common word boundaries (spaces, hyphens, underscores, dots, slashes, colons)\n * and capitalizes each word according to `pascal`.\n *\n * When `pascal` is `true` the first word is also capitalized (PascalCase), otherwise only subsequent words are.\n */\nfunction toCamelOrPascal(text: string, pascal: boolean): string {\n const normalized = text\n .trim()\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .replace(/(\\d)([a-z])/g, '$1 $2')\n\n const words = normalized.split(/[\\s\\-_./\\\\:]+/).filter(Boolean)\n\n return words\n .map((word, i) => {\n const allUpper = word.length > 1 && word === word.toUpperCase()\n if (allUpper) return word\n if (i === 0 && !pascal) return word.charAt(0).toLowerCase() + word.slice(1)\n return word.charAt(0).toUpperCase() + word.slice(1)\n })\n .join('')\n .replace(/[^a-zA-Z0-9]/g, '')\n}\n\n/**\n * Splits `text` on `.` and applies `transformPart` to each segment.\n * The last segment receives `isLast = true`, all earlier segments receive `false`.\n * Segments are joined with `/` to form a file path.\n *\n * Only splits on dots followed by a letter so that version numbers\n * embedded in operationIds (e.g. `v2025.0`) are kept intact.\n */\nfunction applyToFileParts(text: string, transformPart: (part: string, isLast: boolean) => string): string {\n const parts = text.split(/\\.(?=[a-zA-Z])/)\n return parts.map((part, i) => transformPart(part, i === parts.length - 1)).join('/')\n}\n\n/**\n * Converts `text` to camelCase.\n * When `isFile` is `true`, dot-separated segments are each cased independently and joined with `/`.\n *\n * @example\n * camelCase('hello-world') // 'helloWorld'\n * camelCase('pet.petId', { isFile: true }) // 'pet/petId'\n */\nexport function camelCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n if (isFile) {\n return applyToFileParts(text, (part, isLast) => camelCase(part, isLast ? { prefix, suffix } : {}))\n }\n\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, false)\n}\n\n/**\n * Converts `text` to PascalCase.\n * When `isFile` is `true`, the last dot-separated segment is PascalCased and earlier segments are camelCased.\n *\n * @example\n * pascalCase('hello-world') // 'HelloWorld'\n * pascalCase('pet.petId', { isFile: true }) // 'pet/PetId'\n */\nexport function pascalCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n if (isFile) {\n return applyToFileParts(text, (part, isLast) => (isLast ? pascalCase(part, { prefix, suffix }) : camelCase(part)))\n }\n\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, true)\n}\n\n/**\n * Converts `text` to snake_case.\n *\n * @example\n * snakeCase('helloWorld') // 'hello_world'\n * snakeCase('Hello-World') // 'hello_world'\n */\nexport function snakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n const processed = `${prefix} ${text} ${suffix}`.trim()\n return processed\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s\\-.]+/g, '_')\n .replace(/[^a-zA-Z0-9_]/g, '')\n .toLowerCase()\n .split('_')\n .filter(Boolean)\n .join('_')\n}\n\n/**\n * Converts `text` to SCREAMING_SNAKE_CASE.\n *\n * @example\n * screamingSnakeCase('helloWorld') // 'HELLO_WORLD'\n */\nexport function screamingSnakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n return snakeCase(text, { prefix, suffix }).toUpperCase()\n}\n","/**\n * JavaScript and Java reserved words.\n * @link https://github.com/jonschlinkert/reserved/blob/master/index.js\n */\nconst reservedWords = new Set([\n 'abstract',\n 'arguments',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'eval',\n 'export',\n 'extends',\n 'false',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'function',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'in',\n 'instanceof',\n 'int',\n 'interface',\n 'let',\n 'long',\n 'native',\n 'new',\n 'null',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'volatile',\n 'while',\n 'with',\n 'yield',\n 'Array',\n 'Date',\n 'hasOwnProperty',\n 'Infinity',\n 'isFinite',\n 'isNaN',\n 'isPrototypeOf',\n 'length',\n 'Math',\n 'name',\n 'NaN',\n 'Number',\n 'Object',\n 'prototype',\n 'String',\n 'toString',\n 'undefined',\n 'valueOf',\n] as const)\n\n/**\n * Returns `true` when `name` is a syntactically valid JavaScript variable name.\n *\n * @example\n * ```ts\n * isValidVarName('status') // true\n * isValidVarName('class') // false (reserved word)\n * isValidVarName('42foo') // false (starts with digit)\n * ```\n */\nexport function isValidVarName(name: string): boolean {\n if (!name || reservedWords.has(name as 'valueOf')) {\n return false\n }\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name)\n}\n","import { camelCase } from './casing.ts'\nimport { isValidVarName } from './reserved.ts'\n\nexport type URLObject = {\n /**\n * The resolved URL string (Express-style or template literal, depending on context).\n */\n url: string\n /**\n * Extracted path parameters as a key-value map, or `undefined` when the path has none.\n */\n params?: Record<string, string>\n}\n\ntype ObjectOptions = {\n /**\n * Controls whether the `url` is rendered as an Express path or a template literal.\n * @default 'path'\n */\n type?: 'path' | 'template'\n /**\n * Optional transform applied to each extracted parameter name.\n */\n replacer?: (pathParam: string) => string\n /**\n * When `true`, the result is serialized to a string expression instead of a plain object.\n */\n stringify?: boolean\n}\n\n/**\n * Supported identifier casing strategies for path parameters.\n */\ntype PathCasing = 'camelcase'\n\ntype Options = {\n /**\n * Casing strategy applied to path parameter names.\n * @default undefined (original identifier preserved)\n */\n casing?: PathCasing\n}\n\n/**\n * Parses and transforms an OpenAPI/Swagger path string into various URL formats.\n *\n * @example\n * const p = new URLPath('/pet/{petId}')\n * p.URL // '/pet/:petId'\n * p.template // '`/pet/${petId}`'\n */\nexport class URLPath {\n /**\n * The raw OpenAPI/Swagger path string, e.g. `/pet/{petId}`.\n */\n path: string\n\n #options: Options\n\n constructor(path: string, options: Options = {}) {\n this.path = path\n this.#options = options\n }\n\n /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').URL // '/pet/:petId'\n * ```\n */\n get URL(): string {\n return this.toURLPath()\n }\n\n /** Returns `true` when `path` is a fully-qualified URL (e.g. starts with `https://`).\n *\n * @example\n * ```ts\n * new URLPath('https://petstore.swagger.io/v2/pet').isURL // true\n * new URLPath('/pet/{petId}').isURL // false\n * ```\n */\n get isURL(): boolean {\n try {\n return !!new URL(this.path).href\n } catch {\n return false\n }\n }\n\n /**\n * Converts the OpenAPI path to a TypeScript template literal string.\n *\n * @example\n * new URLPath('/pet/{petId}').template // '`/pet/${petId}`'\n * new URLPath('/account/monetary-accountID').template // '`/account/${monetaryAccountId}`'\n */\n get template(): string {\n return this.toTemplateString()\n }\n\n /** Returns the path and its extracted params as a structured `URLObject`, or as a stringified expression when `stringify` is set.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').object\n * // { url: '/pet/:petId', params: { petId: 'petId' } }\n * ```\n */\n get object(): URLObject | string {\n return this.toObject()\n }\n\n /** Returns a map of path parameter names, or `undefined` when the path has no parameters.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').params // { petId: 'petId' }\n * new URLPath('/pet').params // undefined\n * ```\n */\n get params(): Record<string, string> | undefined {\n return this.toParamsObject()\n }\n\n #transformParam(raw: string): string {\n const param = isValidVarName(raw) ? raw : camelCase(raw)\n return this.#options.casing === 'camelcase' ? camelCase(param) : param\n }\n\n /**\n * Iterates over every `{param}` token in `path`, calling `fn` with the raw token and transformed name.\n */\n #eachParam(fn: (raw: string, param: string) => void): void {\n for (const match of this.path.matchAll(/\\{([^}]+)\\}/g)) {\n const raw = match[1]!\n fn(raw, this.#transformParam(raw))\n }\n }\n\n toObject({ type = 'path', replacer, stringify }: ObjectOptions = {}): URLObject | string {\n const object = {\n url: type === 'path' ? this.toURLPath() : this.toTemplateString({ replacer }),\n params: this.toParamsObject(),\n }\n\n if (stringify) {\n if (type === 'template') {\n return JSON.stringify(object).replaceAll(\"'\", '').replaceAll(`\"`, '')\n }\n\n if (object.params) {\n return `{ url: '${object.url}', params: ${JSON.stringify(object.params).replaceAll(\"'\", '').replaceAll(`\"`, '')} }`\n }\n\n return `{ url: '${object.url}' }`\n }\n\n return object\n }\n\n /**\n * Converts the OpenAPI path to a TypeScript template literal string.\n * An optional `replacer` can transform each extracted parameter name before interpolation.\n *\n * @example\n * new URLPath('/pet/{petId}').toTemplateString() // '`/pet/${petId}`'\n */\n toTemplateString({ prefix, replacer }: { prefix?: string | null; replacer?: (pathParam: string) => string } = {}): string {\n const parts = this.path.split(/\\{([^}]+)\\}/)\n const result = parts\n .map((part, i) => {\n if (i % 2 === 0) return part\n const param = this.#transformParam(part)\n return `\\${${replacer ? replacer(param) : param}}`\n })\n .join('')\n\n return `\\`${prefix ?? ''}${result}\\``\n }\n\n /**\n * Extracts all `{param}` segments from the path and returns them as a key-value map.\n * An optional `replacer` transforms each parameter name in both key and value positions.\n * Returns `undefined` when no path parameters are found.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}/tag/{tagId}').toParamsObject()\n * // { petId: 'petId', tagId: 'tagId' }\n * ```\n */\n toParamsObject(replacer?: (pathParam: string) => string): Record<string, string> | undefined {\n const params: Record<string, string> = {}\n\n this.#eachParam((_raw, param) => {\n const key = replacer ? replacer(param) : param\n params[key] = key\n })\n\n return Object.keys(params).length > 0 ? params : undefined\n }\n\n /** Converts the OpenAPI path to Express-style colon syntax.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').toURLPath() // '/pet/:petId'\n * ```\n */\n toURLPath(): string {\n return this.path.replace(/\\{([^}]+)\\}/g, ':$1')\n }\n}\n","import { URLPath } from '@internals/utils'\nimport { ast } from '@kubb/core'\n\nexport type ContentTypeInfo = {\n contentTypes: string[]\n isMultipleContentTypes: boolean\n contentTypeUnion: string\n defaultContentType: string\n hasFormData: boolean\n}\n\nexport type RequestConfigResolver = {\n resolveDataName(node: ast.OperationNode): string\n}\n\nexport type ResponseStatusNameResolver = {\n resolveResponseStatusName(node: ast.OperationNode, statusCode: ast.StatusCode): string\n}\n\nexport type ResponseNameResolver = ResponseStatusNameResolver & {\n resolveResponseName(node: ast.OperationNode): string\n}\n\nexport type OperationTypeNameResolver = RequestConfigResolver &\n ResponseNameResolver & {\n resolvePathParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n resolveQueryParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n resolveHeaderParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n }\n\nexport type OperationCommentLink = 'pathTemplate' | 'urlPath' | false | ((node: ast.OperationNode) => string | undefined)\n\nexport type BuildOperationCommentsOptions = {\n link?: OperationCommentLink\n linkPosition?: 'beforeDeprecated' | 'afterDeprecated'\n splitLines?: boolean\n}\n\ntype ResponseLike = {\n statusCode: ast.StatusCode | number | string\n}\n\nexport type OperationParameterGroups = Record<ast.ParameterNode['in'], Array<ast.ParameterNode>>\n\nexport type ResolveOperationTypeNameOptions = {\n paramsCasing?: 'camelcase'\n responseStatusNames?: boolean | 'error'\n exclude?: ReadonlyArray<string | undefined>\n order?: 'params-first' | 'body-response-first'\n}\n\nfunction getOperationLink(node: ast.OperationNode, link: OperationCommentLink): string | undefined {\n if (!link) {\n return undefined\n }\n\n if (typeof link === 'function') {\n return link(node)\n }\n\n if (link === 'urlPath') {\n return node.path ? `{@link ${new URLPath(node.path).URL}}` : undefined\n }\n\n return `{@link ${node.path.replaceAll('{', ':').replaceAll('}', '')}}`\n}\n\nexport function getContentTypeInfo(node: ast.OperationNode): ContentTypeInfo {\n const contentTypes = node.requestBody?.content?.map((e) => e.contentType) ?? []\n const isMultipleContentTypes = contentTypes.length > 1\n\n return {\n contentTypes,\n isMultipleContentTypes,\n contentTypeUnion: isMultipleContentTypes ? contentTypes.map((ct) => JSON.stringify(ct)).join(' | ') : '',\n defaultContentType: contentTypes[0] ?? 'application/json',\n hasFormData: contentTypes.some((ct) => ct === 'multipart/form-data'),\n }\n}\n\nexport function buildRequestConfigType(node: ast.OperationNode, resolver: RequestConfigResolver): string {\n const requestName = node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : undefined\n const { isMultipleContentTypes, contentTypeUnion } = getContentTypeInfo(node)\n const configType = requestName ? `Partial<RequestConfig<${requestName}>>` : 'Partial<RequestConfig>'\n const configProps = ['client?: Client', isMultipleContentTypes ? `contentType?: ${contentTypeUnion}` : undefined].filter(Boolean).join('; ')\n\n return `${configType} & { ${configProps} }`\n}\n\nexport function buildOperationComments(node: ast.OperationNode, options: BuildOperationCommentsOptions = {}): Array<string> {\n const { link = 'pathTemplate', linkPosition = 'afterDeprecated', splitLines = false } = options\n const linkComment = getOperationLink(node, link)\n const comments =\n linkPosition === 'beforeDeprecated'\n ? [node.description && `@description ${node.description}`, node.summary && `@summary ${node.summary}`, linkComment, node.deprecated && '@deprecated']\n : [node.description && `@description ${node.description}`, node.summary && `@summary ${node.summary}`, node.deprecated && '@deprecated', linkComment]\n\n const filteredComments = comments.filter((comment): comment is string => Boolean(comment))\n\n if (!splitLines) {\n return filteredComments\n }\n\n return filteredComments.flatMap((text) => text.split(/\\r?\\n/).map((line) => line.trim())).filter((comment): comment is string => Boolean(comment))\n}\n\nexport function getOperationParameters(node: ast.OperationNode, options: { paramsCasing?: 'camelcase' } = {}): OperationParameterGroups {\n const params = ast.caseParams(node.parameters, options.paramsCasing)\n\n return {\n path: params.filter((param) => param.in === 'path'),\n query: params.filter((param) => param.in === 'query'),\n header: params.filter((param) => param.in === 'header'),\n cookie: params.filter((param) => param.in === 'cookie'),\n }\n}\n\nexport function getStatusCodeNumber(statusCode: ast.StatusCode | number | string): number | undefined {\n const code = Number(statusCode)\n\n return Number.isNaN(code) ? undefined : code\n}\n\nexport function isSuccessStatusCode(statusCode: ast.StatusCode | number | string): boolean {\n const code = getStatusCodeNumber(statusCode)\n\n return code !== undefined && code >= 200 && code < 300\n}\n\nexport function isErrorStatusCode(statusCode: ast.StatusCode | number | string): boolean {\n const code = getStatusCodeNumber(statusCode)\n\n return code !== undefined && code >= 400\n}\n\nexport function getSuccessResponses<TResponse extends ResponseLike>(responses: ReadonlyArray<TResponse>): Array<TResponse> {\n return responses.filter((response) => isSuccessStatusCode(response.statusCode))\n}\n\nexport function getOperationSuccessResponses(node: ast.OperationNode): Array<ast.ResponseNode> {\n return getSuccessResponses(node.responses)\n}\n\nexport function getPrimarySuccessResponse(node: ast.OperationNode): ast.ResponseNode | undefined {\n return getOperationSuccessResponses(node)[0]\n}\n\nexport function resolveErrorNames(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string[] {\n return node.responses\n .filter((response) => isErrorStatusCode(response.statusCode))\n .map((response) => resolver.resolveResponseStatusName(node, response.statusCode))\n}\n\nexport function resolveStatusCodeNames(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string[] {\n return node.responses.map((response) => resolver.resolveResponseStatusName(node, response.statusCode))\n}\n\nconst typeNamesByResolver = new WeakMap<OperationTypeNameResolver, Map<string, string[]>>()\n\nexport function resolveOperationTypeNames(\n node: ast.OperationNode,\n resolver: OperationTypeNameResolver,\n options: ResolveOperationTypeNameOptions = {},\n): string[] {\n const cacheKey = `${node.operationId}\\0${options.paramsCasing ?? ''}\\0${options.order ?? ''}\\0${options.responseStatusNames ?? ''}\\0${(options.exclude ?? []).join(',')}`\n let byResolver = typeNamesByResolver.get(resolver)\n if (byResolver) {\n const cached = byResolver.get(cacheKey)\n if (cached) return cached\n } else {\n byResolver = new Map()\n typeNamesByResolver.set(resolver, byResolver)\n }\n\n const { path, query, header } = getOperationParameters(node, { paramsCasing: options.paramsCasing })\n const responseStatusNames =\n options.responseStatusNames === 'error'\n ? resolveErrorNames(node, resolver)\n : options.responseStatusNames === false\n ? []\n : resolveStatusCodeNames(node, resolver)\n const exclude = new Set(options.exclude ?? [])\n const paramNames = [\n ...path.map((param) => resolver.resolvePathParamsName(node, param)),\n ...query.map((param) => resolver.resolveQueryParamsName(node, param)),\n ...header.map((param) => resolver.resolveHeaderParamsName(node, param)),\n ]\n const bodyAndResponseNames = [node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : undefined, resolver.resolveResponseName(node)]\n const names =\n options.order === 'body-response-first'\n ? [...bodyAndResponseNames, ...paramNames, ...responseStatusNames]\n : [...paramNames, ...bodyAndResponseNames, ...responseStatusNames]\n\n const result = names.filter((name): name is string => Boolean(name) && !exclude.has(name))\n byResolver.set(cacheKey, result)\n return result\n}\n\nexport function resolveResponseTypes(node: ast.OperationNode, resolver: ResponseNameResolver): Array<[statusCode: number | 'default', typeName: string]> {\n const types: Array<[number | 'default', string]> = []\n\n for (const response of node.responses) {\n if (response.statusCode === 'default') {\n types.push(['default', resolver.resolveResponseName(node)])\n continue\n }\n\n const code = getStatusCodeNumber(response.statusCode)\n if (code === undefined) {\n continue\n }\n\n types.push([code, isSuccessStatusCode(code) ? resolver.resolveResponseName(node) : resolver.resolveResponseStatusName(node, response.statusCode)])\n }\n\n return types\n}\n\nexport function findSuccessStatusCode(responses: Array<{ statusCode: ast.StatusCode | number | string }>): ast.StatusCode | undefined {\n for (const response of responses) {\n if (isSuccessStatusCode(response.statusCode)) {\n return response.statusCode as ast.StatusCode\n }\n }\n\n return undefined\n}\n","export function buildParamsMapping<TParam extends { name: string }>(\n originalParams: ReadonlyArray<TParam>,\n mappedParams: ReadonlyArray<TParam>,\n): Record<string, string> | undefined {\n const mapping: Record<string, string> = {}\n let hasChanged = false\n\n originalParams.forEach((param, i) => {\n const mappedName = mappedParams[i]?.name ?? param.name\n mapping[param.name] = mappedName\n\n if (param.name !== mappedName) {\n hasChanged = true\n }\n })\n\n return hasChanged ? mapping : undefined\n}\n\nexport function buildTransformedParamsMapping<TParam extends { name: string }>(\n params: ReadonlyArray<TParam>,\n transformName: (name: string) => string,\n): Record<string, string> | undefined {\n if (!params.length) {\n return undefined\n }\n\n return buildParamsMapping(\n params,\n params.map((param) => ({ ...param, name: transformName(param.name) })),\n )\n}\n","import { buildOperationComments, buildTransformedParamsMapping, getOperationParameters } from '@internals/shared'\nimport { camelCase, isValidVarName, URLPath } from '@internals/utils'\nimport { ast } from '@kubb/core'\nimport type { ResolverTs } from '@kubb/plugin-ts'\nimport { functionPrinter } from '@kubb/plugin-ts'\nimport { File, Function } from '@kubb/renderer-jsx'\nimport type { KubbReactNode } from '@kubb/renderer-jsx/types'\nimport type { PluginMcp } from '../types.ts'\n\ntype Props = {\n /**\n * Name of the handler function.\n */\n name: string\n /**\n * AST operation node.\n */\n node: ast.OperationNode\n /**\n * TypeScript resolver for resolving param/data/response type names.\n */\n resolver: ResolverTs\n /**\n * Base URL prepended to every generated request URL.\n */\n baseURL: string | null | undefined\n /**\n * Return type when calling fetch.\n * - 'data' returns response data only.\n * - 'full' returns the full response object.\n * @default 'data'\n */\n dataReturnType: PluginMcp['resolvedOptions']['client']['dataReturnType']\n /**\n * How to style your params.\n */\n paramsCasing?: PluginMcp['resolvedOptions']['paramsCasing']\n}\n\n/**\n * Generate a remapping statement: `const mappedX = x ? { \"orig\": x.camel, ... } : undefined`\n */\nfunction buildRemappingCode(mapping: Record<string, string>, varName: string, sourceName: string): string {\n const pairs = Object.entries(mapping)\n .map(([orig, camel]) => `\"${orig}\": ${sourceName}.${camel}`)\n .join(', ')\n return `const ${varName} = ${sourceName} ? { ${pairs} } : undefined`\n}\n\nconst declarationPrinter = functionPrinter({ mode: 'declaration' })\n\nexport function McpHandler({ name, node, resolver, baseURL, dataReturnType, paramsCasing }: Props): KubbReactNode {\n const urlPath = new URLPath(node.path)\n const contentType = node.requestBody?.content?.[0]?.contentType\n const isFormData = contentType === 'multipart/form-data'\n\n const { query: queryParams, header: headerParams } = getOperationParameters(node, { paramsCasing })\n const { path: originalPathParams, query: originalQueryParams, header: originalHeaderParams } = getOperationParameters(node)\n\n const requestName = node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : undefined\n const responseName = resolver.resolveResponseName(node)\n\n const errorResponses = node.responses.filter((r) => Number(r.statusCode) >= 400).map((r) => resolver.resolveResponseStatusName(node, r.statusCode))\n const errorType = errorResponses.length > 0 ? errorResponses.join(' | ') : 'Error'\n\n const TError = `ResponseErrorConfig<${errorType}>`\n const generics = [responseName, TError, requestName || 'unknown'].filter(Boolean)\n\n const paramsNode = ast.createOperationParams(node, {\n paramsType: 'object',\n pathParamsType: 'inline',\n resolver,\n paramsCasing,\n })\n const baseParamsSignature = declarationPrinter.print(paramsNode) ?? ''\n const paramsSignature = baseParamsSignature\n ? `${baseParamsSignature}, request: RequestHandlerExtra<ServerRequest, ServerNotification>`\n : 'request: RequestHandlerExtra<ServerRequest, ServerNotification>'\n\n const pathParamsMapping = paramsCasing ? buildTransformedParamsMapping(originalPathParams, camelCase) : undefined\n const queryParamsMapping = paramsCasing ? buildTransformedParamsMapping(originalQueryParams, camelCase) : undefined\n const headerParamsMapping = paramsCasing ? buildTransformedParamsMapping(originalHeaderParams, camelCase) : undefined\n\n const contentTypeHeader =\n contentType && contentType !== 'application/json' && contentType !== 'multipart/form-data' ? `'Content-Type': '${contentType}'` : undefined\n const headers = [headerParams.length ? (headerParamsMapping ? '...mappedHeaders' : '...headers') : undefined, contentTypeHeader].filter(Boolean)\n\n const fetchConfig: string[] = []\n fetchConfig.push(`method: ${JSON.stringify(node.method.toUpperCase())}`)\n fetchConfig.push(`url: ${urlPath.template}`)\n if (baseURL) fetchConfig.push(`baseURL: \\`${baseURL}\\``)\n if (queryParams.length) fetchConfig.push(queryParamsMapping ? 'params: mappedParams' : 'params')\n if (requestName) fetchConfig.push(`data: ${isFormData ? 'formData as FormData' : 'requestData'}`)\n if (headers.length) fetchConfig.push(`headers: { ${headers.join(', ')} }`)\n\n const callToolResult =\n dataReturnType === 'data'\n ? `return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(res.data)\n }\n ],\n structuredContent: { data: res.data }\n }`\n : `return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(res)\n }\n ],\n structuredContent: { data: res.data }\n }`\n\n return (\n <File.Source name={name} isExportable isIndexable>\n <Function\n name={name}\n async\n export\n params={paramsSignature}\n JSDoc={{\n comments: buildOperationComments(node),\n }}\n returnType={'Promise<CallToolResult>'}\n >\n {''}\n <br />\n <br />\n {pathParamsMapping &&\n Object.entries(pathParamsMapping)\n .filter(([originalName, camelCaseName]) => originalName !== camelCaseName && isValidVarName(originalName))\n .map(([originalName, camelCaseName]) => `const ${originalName} = ${camelCaseName}`)\n .join('\\n')}\n {pathParamsMapping && (\n <>\n <br />\n <br />\n </>\n )}\n {queryParamsMapping && queryParams.length > 0 && (\n <>\n {buildRemappingCode(queryParamsMapping, 'mappedParams', 'params')}\n <br />\n <br />\n </>\n )}\n {headerParamsMapping && headerParams.length > 0 && (\n <>\n {buildRemappingCode(headerParamsMapping, 'mappedHeaders', 'headers')}\n <br />\n <br />\n </>\n )}\n {requestName && 'const requestData = data'}\n <br />\n {isFormData && requestName && 'const formData = buildFormData(requestData)'}\n <br />\n {`const res = await fetch<${generics.join(', ')}>({ ${fetchConfig.join(', ')} }, request)`}\n <br />\n {callToolResult}\n </Function>\n </File.Source>\n )\n}\n","import type { ast } from '@kubb/core'\n\nexport type ZodParam = {\n name: string\n schemaName: string\n}\n\n/**\n * Render a group param value — compose individual schemas into `z.object({ ... })`,\n * or use a schema name string directly.\n */\nexport function zodGroupExpr(entry: string | Array<ZodParam>): string {\n if (typeof entry === 'string') {\n return entry\n }\n const entries = entry.map((p) => `${JSON.stringify(p.name)}: ${p.schemaName}`)\n return `z.object({ ${entries.join(', ')} })`\n}\n\n/**\n * Convert a SchemaNode type to an inline Zod expression string.\n * Used as fallback when no named zod schema is available for a path parameter.\n */\nexport function zodExprFromSchemaNode(schema: ast.SchemaNode): string {\n const baseExpr = (() => {\n if (schema.type === 'enum') {\n const rawValues: Array<string | number | boolean> = schema.namedEnumValues?.length\n ? schema.namedEnumValues.map((v) => v.value)\n : (schema.enumValues ?? []).filter((v): v is string | number | boolean => v !== null)\n\n if (rawValues.length > 0 && rawValues.every((v) => typeof v === 'string')) {\n return `z.enum([${rawValues.map((v) => JSON.stringify(v)).join(', ')}])`\n }\n if (rawValues.length > 0) {\n const literals = rawValues.map((v) => `z.literal(${JSON.stringify(v)})`)\n return literals.length === 1 ? literals[0]! : `z.union([${literals.join(', ')}])`\n }\n return 'z.string()'\n }\n if (schema.type === 'integer') return 'z.coerce.number()'\n if (schema.type === 'number') return 'z.number()'\n if (schema.type === 'boolean') return 'z.boolean()'\n if (schema.type === 'array') return 'z.array(z.unknown())'\n return 'z.string()'\n })()\n\n return schema.nullable ? `${baseExpr}.nullable()` : baseExpr\n}\n","import { getOperationParameters } from '@internals/shared'\nimport { ast } from '@kubb/core'\nimport { functionPrinter } from '@kubb/plugin-ts'\nimport { Const, File, Function } from '@kubb/renderer-jsx'\nimport type { KubbReactNode } from '@kubb/renderer-jsx/types'\nimport type { PluginMcp } from '../types.ts'\nimport type { ZodParam } from '../utils.ts'\nimport { zodExprFromSchemaNode, zodGroupExpr } from '../utils.ts'\n\ntype Props = {\n /**\n * Variable name for the MCP server instance (e.g. 'server').\n */\n name: string\n /**\n * Human-readable server name passed to `new McpServer({ name })`.\n */\n serverName: string\n /**\n * Semantic version string passed to `new McpServer({ version })`.\n */\n serverVersion: string\n /**\n * How to style your params.\n */\n paramsCasing?: PluginMcp['resolvedOptions']['paramsCasing']\n /**\n * Operations to register as MCP tools, each carrying its handler,\n * zod schema, and AST node metadata.\n */\n operations: Array<{\n tool: {\n name: string\n title?: string\n description: string\n }\n mcp: {\n name: string\n file: ast.FileNode\n }\n zod: {\n pathParams: Array<ZodParam>\n /**\n * Query params — individual schemas to compose into `z.object({ ... })`.\n */\n queryParams?: string | Array<ZodParam>\n /**\n * Header params — individual schemas to compose into `z.object({ ... })`.\n */\n headerParams?: string | Array<ZodParam>\n requestName?: string\n responseName?: string\n }\n node: ast.OperationNode\n }>\n}\n\nconst keysPrinter = functionPrinter({ mode: 'keys' })\n\nexport function Server({ name, serverName, serverVersion, paramsCasing, operations }: Props): KubbReactNode {\n return (\n <File.Source name={name} isExportable isIndexable>\n <Const name={'server'} export>\n {`\n new McpServer({\n name: '${serverName}',\n version: '${serverVersion}',\n})\n `}\n </Const>\n\n {operations\n .map(({ tool, mcp, zod, node }) => {\n const { path: pathParams } = getOperationParameters(node, { paramsCasing })\n\n const pathEntries: Array<{ key: string; value: string }> = []\n const otherEntries: Array<{ key: string; value: string }> = []\n\n for (const p of pathParams) {\n const zodParam = zod.pathParams.find((zp) => zp.name === p.name)\n pathEntries.push({ key: p.name, value: zodParam ? zodParam.schemaName : zodExprFromSchemaNode(p.schema) })\n }\n\n if (zod.requestName) {\n otherEntries.push({ key: 'data', value: zod.requestName })\n }\n\n if (zod.queryParams) {\n otherEntries.push({ key: 'params', value: zodGroupExpr(zod.queryParams) })\n }\n\n if (zod.headerParams) {\n otherEntries.push({ key: 'headers', value: zodGroupExpr(zod.headerParams) })\n }\n\n otherEntries.sort((a, b) => a.key.localeCompare(b.key))\n const entries = [...pathEntries, ...otherEntries]\n\n const paramsNode = entries.length\n ? ast.createFunctionParameters({\n params: [\n ast.createParameterGroup({\n properties: entries.map((e) => ast.createFunctionParameter({ name: e.key, optional: false })),\n }),\n ],\n })\n : undefined\n\n const destructured = paramsNode ? (keysPrinter.print(paramsNode) ?? '') : ''\n const inputSchema = entries.length ? `{ ${entries.map((e) => `${e.key}: ${e.value}`).join(', ')} }` : undefined\n const outputSchema = zod.responseName\n\n const config = [\n tool.title ? `title: ${JSON.stringify(tool.title)}` : null,\n `description: ${JSON.stringify(tool.description)}`,\n outputSchema ? `outputSchema: { data: ${outputSchema} }` : null,\n ]\n .filter(Boolean)\n .join(',\\n ')\n\n if (inputSchema) {\n return `\nserver.registerTool(${JSON.stringify(tool.name)}, {\n ${config},\n inputSchema: ${inputSchema},\n}, async (${destructured}, request) => {\n return ${mcp.name}(${destructured}, request)\n})\n `\n }\n\n return `\nserver.registerTool(${JSON.stringify(tool.name)}, {\n ${config},\n}, async (request) => {\n return ${mcp.name}(request)\n})\n `\n })\n .filter(Boolean)}\n\n <Function name=\"startServer\" async export>\n {`try {\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n } catch (error) {\n console.error('Failed to start server:', error)\n process.exit(1)\n }`}\n </Function>\n </File.Source>\n )\n}\n","import path from 'node:path'\nimport { resolveOperationTypeNames } from '@internals/shared'\nimport { defineGenerator } from '@kubb/core'\nimport { pluginTsName } from '@kubb/plugin-ts'\nimport { File, jsxRendererSync } from '@kubb/renderer-jsx'\nimport { McpHandler } from '../components/McpHandler.tsx'\nimport type { PluginMcp } from '../types.ts'\n\nexport const mcpGenerator = defineGenerator<PluginMcp>({\n name: 'mcp',\n renderer: jsxRendererSync,\n operation(node, ctx) {\n const { resolver, driver, root } = ctx\n const { output, client, paramsCasing, group } = ctx.options\n\n const pluginTs = driver.getPlugin(pluginTsName)\n\n if (!pluginTs) {\n return null\n }\n\n const tsResolver = driver.getResolver(pluginTsName)\n\n const importedTypeNames = resolveOperationTypeNames(node, tsResolver, { paramsCasing, responseStatusNames: 'error' })\n\n const meta = {\n name: resolver.resolveHandlerName(node),\n file: resolver.resolveFile({ name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path }, { root, output, group }),\n fileTs: tsResolver.resolveFile(\n { name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path },\n {\n root,\n output: pluginTs.options?.output ?? output,\n group: pluginTs.options?.group,\n },\n ),\n } as const\n\n return (\n <File baseName={meta.file.baseName} path={meta.file.path} meta={meta.file.meta}>\n {meta.fileTs && importedTypeNames.length > 0 && (\n <File.Import name={Array.from(new Set(importedTypeNames)).sort()} root={meta.file.path} path={meta.fileTs.path} isTypeOnly />\n )}\n <File.Import name={['CallToolResult', 'ServerNotification', 'ServerRequest']} path={'@modelcontextprotocol/sdk/types'} isTypeOnly />\n <File.Import name={['RequestHandlerExtra']} path={'@modelcontextprotocol/sdk/shared/protocol'} isTypeOnly />\n <File.Import name={['buildFormData']} root={meta.file.path} path={path.resolve(root, '.kubb/config.ts')} />\n {client.importPath ? (\n <>\n <File.Import name={['Client', 'RequestConfig', 'ResponseErrorConfig']} path={client.importPath} isTypeOnly />\n <File.Import name={'fetch'} path={client.importPath} />\n {client.dataReturnType === 'full' && <File.Import name={['ResponseConfig']} path={client.importPath} isTypeOnly />}\n </>\n ) : (\n <>\n <File.Import\n name={['Client', 'RequestConfig', 'ResponseErrorConfig']}\n root={meta.file.path}\n path={path.resolve(root, '.kubb/fetch.ts')}\n isTypeOnly\n />\n <File.Import name={['fetch']} root={meta.file.path} path={path.resolve(root, '.kubb/fetch.ts')} />\n {client.dataReturnType === 'full' && (\n <File.Import name={['ResponseConfig']} root={meta.file.path} path={path.resolve(root, '.kubb/fetch.ts')} isTypeOnly />\n )}\n </>\n )}\n\n <McpHandler\n name={meta.name}\n node={node}\n resolver={tsResolver}\n baseURL={client.baseURL}\n dataReturnType={client.dataReturnType || 'data'}\n paramsCasing={paramsCasing}\n />\n </File>\n )\n },\n})\n","import path from 'node:path'\nimport { findSuccessStatusCode, getOperationParameters } from '@internals/shared'\nimport { defineGenerator } from '@kubb/core'\nimport { pluginZodName } from '@kubb/plugin-zod'\nimport { File, jsxRendererSync } from '@kubb/renderer-jsx'\nimport { Server } from '../components/Server.tsx'\nimport type { PluginMcp } from '../types.ts'\n\n/**\n * Default v5 server generator for `@kubb/plugin-mcp`.\n *\n * Uses individual zod schemas for each param (e.g. `createPetsPathUuidSchema`, `createPetsQueryOffsetSchema`)\n * and `resolveResponseStatusName` for per-status response schemas.\n * Query and header params are composed into `z.object({ ... })` from individual schemas.\n */\nexport const serverGenerator = defineGenerator<PluginMcp>({\n name: 'operations',\n renderer: jsxRendererSync,\n operations(nodes, ctx) {\n const { config, resolver, plugin, driver, root } = ctx\n const { output, paramsCasing, group } = ctx.options\n\n const pluginZod = driver.getPlugin(pluginZodName)\n\n if (!pluginZod) {\n return\n }\n\n const zodResolver = driver.getResolver(pluginZodName)\n\n const name = 'server'\n const serverFilePath = path.resolve(root, output.path, 'server.ts')\n const serverFile = {\n baseName: 'server.ts' as const,\n path: serverFilePath,\n meta: { pluginName: plugin.name },\n }\n\n const jsonFilePath = path.resolve(root, output.path, '.mcp.json')\n const jsonFile = {\n baseName: '.mcp.json' as const,\n path: jsonFilePath,\n meta: { pluginName: plugin.name },\n }\n\n const operationsMapped = nodes.map((node) => {\n const { path: pathParams, query: queryParams, header: headerParams } = getOperationParameters(node, { paramsCasing })\n\n const mcpFile = resolver.resolveFile({ name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path }, { root, output, group })\n\n const zodFile = zodResolver.resolveFile(\n { name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path },\n {\n root,\n output: pluginZod.options?.output ?? output,\n group: pluginZod.options?.group,\n },\n )\n\n const requestName = node.requestBody?.content?.[0]?.schema ? zodResolver.resolveDataName(node) : undefined\n const successStatus = findSuccessStatusCode(node.responses)\n const responseName = successStatus ? zodResolver.resolveResponseStatusName(node, successStatus) : undefined\n\n const resolveParams = (params: typeof pathParams) => params.map((p) => ({ name: p.name, schemaName: zodResolver.resolveParamName(node, p) }))\n\n return {\n tool: {\n name: node.operationId,\n title: node.summary || undefined,\n description: node.description || `Make a ${node.method.toUpperCase()} request to ${node.path}`,\n },\n mcp: {\n name: resolver.resolveHandlerName(node),\n file: mcpFile,\n },\n zod: {\n pathParams: resolveParams(pathParams),\n queryParams: queryParams.length ? resolveParams(queryParams) : undefined,\n headerParams: headerParams.length ? resolveParams(headerParams) : undefined,\n requestName,\n responseName,\n file: zodFile,\n },\n node: node,\n }\n })\n\n const imports = operationsMapped.flatMap(({ mcp, zod }) => {\n const zodNames = [\n ...zod.pathParams.map((p) => p.schemaName),\n ...(zod.queryParams ?? []).map((p) => p.schemaName),\n ...(zod.headerParams ?? []).map((p) => p.schemaName),\n zod.requestName,\n zod.responseName,\n ].filter((name): name is string => Boolean(name))\n\n const uniqueNames = [...new Set(zodNames)].sort()\n\n return [\n <File.Import key={mcp.name} name={[mcp.name]} root={serverFile.path} path={mcp.file.path} />,\n uniqueNames.length > 0 && <File.Import key={`zod-${mcp.name}`} name={uniqueNames} root={serverFile.path} path={zod.file.path} />,\n ].filter(Boolean)\n })\n\n return (\n <>\n <File\n baseName={serverFile.baseName}\n path={serverFile.path}\n meta={serverFile.meta}\n banner={resolver.resolveBanner(ctx.meta, { output, config })}\n footer={resolver.resolveFooter(ctx.meta, { output, config })}\n >\n <File.Import name={['McpServer']} path={'@modelcontextprotocol/sdk/server/mcp'} />\n <File.Import name={['z']} path={'zod'} />\n <File.Import name={['StdioServerTransport']} path={'@modelcontextprotocol/sdk/server/stdio'} />\n\n {imports}\n <Server\n name={name}\n serverName={ctx.meta.title ?? 'server'}\n serverVersion={ctx.meta.version ?? '0.0.0'}\n paramsCasing={paramsCasing}\n operations={operationsMapped}\n />\n </File>\n\n <File baseName={jsonFile.baseName} path={jsonFile.path} meta={jsonFile.meta}>\n <File.Source name={name}>\n {`\n {\n \"mcpServers\": {\n \"${ctx.meta.title || 'server'}\": {\n \"type\": \"stdio\",\n \"command\": \"npx\",\n \"args\": [\"tsx\", \"${path.relative(path.dirname(jsonFile.path), serverFile.path)}\"]\n }\n }\n }\n `}\n </File.Source>\n </File>\n </>\n )\n },\n})\n","import { camelCase } from '@internals/utils'\nimport { defineResolver } from '@kubb/core'\nimport type { PluginMcp } from '../types.ts'\n\n/**\n * Naming convention resolver for MCP plugin.\n *\n * Provides default naming helpers using camelCase with a `handler` suffix for functions.\n *\n * @example\n * `resolverMcp.default('addPet', 'function') // → 'addPetHandler'`\n */\nexport const resolverMcp = defineResolver<PluginMcp>(() => ({\n name: 'default',\n pluginName: 'plugin-mcp',\n default(name, type) {\n if (type === 'file') {\n return camelCase(name, { isFile: true })\n }\n return camelCase(name, { suffix: 'handler' })\n },\n resolveName(name) {\n return this.default(name, 'function')\n },\n resolvePathName(name, type) {\n return this.default(name, type)\n },\n resolveHandlerName(node) {\n return this.resolveName(node.operationId)\n },\n}))\n","import path from 'node:path'\nimport { camelCase } from '@internals/utils'\n\nimport { ast, definePlugin, type Group } from '@kubb/core'\nimport { pluginClientName } from '@kubb/plugin-client'\nimport { source as axiosClientSource } from '@kubb/plugin-client/templates/clients/axios.source'\nimport { source as fetchClientSource } from '@kubb/plugin-client/templates/clients/fetch.source'\nimport { source as configSource } from '@kubb/plugin-client/templates/config.source'\nimport { pluginTsName } from '@kubb/plugin-ts'\nimport { pluginZodName } from '@kubb/plugin-zod'\nimport { mcpGenerator } from './generators/mcpGenerator.tsx'\nimport { serverGenerator } from './generators/serverGenerator.tsx'\nimport { resolverMcp } from './resolvers/resolverMcp.ts'\nimport type { PluginMcp } from './types.ts'\n\nexport const pluginMcpName = 'plugin-mcp' satisfies PluginMcp['name']\n\nexport const pluginMcp = definePlugin<PluginMcp>((options) => {\n const {\n output = { path: 'mcp', barrelType: 'named' },\n group,\n exclude = [],\n include,\n override = [],\n paramsCasing,\n client,\n resolver: userResolver,\n transformer: userTransformer,\n generators: userGenerators = [],\n } = options\n\n const clientName = client?.client ?? 'axios'\n const clientImportPath = client?.importPath ?? (!client?.bundle ? `@kubb/plugin-client/clients/${clientName}` : undefined)\n\n const groupConfig = group\n ? ({\n ...group,\n name: group.name\n ? group.name\n : (ctx: { group: string }) => {\n if (group.type === 'path') {\n return `${ctx.group.split('/')[1]}`\n }\n return `${camelCase(ctx.group)}Requests`\n },\n } satisfies Group)\n : undefined\n\n return {\n name: pluginMcpName,\n options,\n dependencies: [pluginTsName, pluginZodName],\n hooks: {\n 'kubb:plugin:setup'(ctx) {\n const resolver = userResolver ? { ...resolverMcp, ...userResolver } : resolverMcp\n\n ctx.setOptions({\n output,\n exclude,\n include,\n override,\n group: groupConfig,\n paramsCasing,\n client: {\n client: clientName,\n clientType: client?.clientType ?? 'function',\n importPath: clientImportPath,\n dataReturnType: client?.dataReturnType ?? 'data',\n bundle: client?.bundle,\n baseURL: client?.baseURL,\n paramsCasing: client?.paramsCasing,\n },\n resolver,\n })\n ctx.setResolver(resolver)\n if (userTransformer) {\n ctx.setTransformer(userTransformer)\n }\n ctx.addGenerator(mcpGenerator)\n ctx.addGenerator(serverGenerator)\n for (const gen of userGenerators) {\n ctx.addGenerator(gen)\n }\n\n const root = path.resolve(ctx.config.root, ctx.config.output.path)\n const hasClientPlugin = ctx.config.plugins?.some((p) => p.name === pluginClientName)\n\n if (client?.bundle && !hasClientPlugin && !clientImportPath) {\n ctx.injectFile({\n baseName: 'fetch.ts',\n path: path.resolve(root, '.kubb/fetch.ts'),\n sources: [\n ast.createSource({\n name: 'fetch',\n nodes: [ast.createText(clientName === 'fetch' ? fetchClientSource : axiosClientSource)],\n isExportable: true,\n isIndexable: true,\n }),\n ],\n })\n }\n\n if (!hasClientPlugin) {\n ctx.injectFile({\n baseName: 'config.ts',\n path: path.resolve(root, '.kubb/config.ts'),\n sources: [\n ast.createSource({\n name: 'config',\n nodes: [ast.createText(configSource)],\n isExportable: false,\n isIndexable: false,\n }),\n ],\n })\n }\n },\n },\n }\n})\n\nexport default pluginMcp\n"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -263,12 +263,13 @@ var URLPath = class {
|
|
|
263
263
|
* @example
|
|
264
264
|
* new URLPath('/pet/{petId}').toTemplateString() // '`/pet/${petId}`'
|
|
265
265
|
*/
|
|
266
|
-
toTemplateString({ prefix
|
|
267
|
-
|
|
266
|
+
toTemplateString({ prefix, replacer } = {}) {
|
|
267
|
+
const result = this.path.split(/\{([^}]+)\}/).map((part, i) => {
|
|
268
268
|
if (i % 2 === 0) return part;
|
|
269
269
|
const param = this.#transformParam(part);
|
|
270
270
|
return `\${${replacer ? replacer(param) : param}}`;
|
|
271
|
-
}).join("")
|
|
271
|
+
}).join("");
|
|
272
|
+
return `\`${prefix ?? ""}${result}\``;
|
|
272
273
|
}
|
|
273
274
|
/**
|
|
274
275
|
* Extracts all `{param}` segments from the path and returns them as a key-value map.
|
|
@@ -519,33 +520,23 @@ function zodGroupExpr(entry) {
|
|
|
519
520
|
* Used as fallback when no named zod schema is available for a path parameter.
|
|
520
521
|
*/
|
|
521
522
|
function zodExprFromSchemaNode(schema) {
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
case "enum": {
|
|
523
|
+
const baseExpr = (() => {
|
|
524
|
+
if (schema.type === "enum") {
|
|
525
525
|
const rawValues = schema.namedEnumValues?.length ? schema.namedEnumValues.map((v) => v.value) : (schema.enumValues ?? []).filter((v) => v !== null);
|
|
526
|
-
if (rawValues.length > 0 && rawValues.every((v) => typeof v === "string"))
|
|
527
|
-
|
|
526
|
+
if (rawValues.length > 0 && rawValues.every((v) => typeof v === "string")) return `z.enum([${rawValues.map((v) => JSON.stringify(v)).join(", ")}])`;
|
|
527
|
+
if (rawValues.length > 0) {
|
|
528
528
|
const literals = rawValues.map((v) => `z.literal(${JSON.stringify(v)})`);
|
|
529
|
-
|
|
530
|
-
}
|
|
531
|
-
|
|
529
|
+
return literals.length === 1 ? literals[0] : `z.union([${literals.join(", ")}])`;
|
|
530
|
+
}
|
|
531
|
+
return "z.string()";
|
|
532
532
|
}
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
expr = "z.boolean()";
|
|
541
|
-
break;
|
|
542
|
-
case "array":
|
|
543
|
-
expr = "z.array(z.unknown())";
|
|
544
|
-
break;
|
|
545
|
-
default: expr = "z.string()";
|
|
546
|
-
}
|
|
547
|
-
if (schema.nullable) expr = `${expr}.nullable()`;
|
|
548
|
-
return expr;
|
|
533
|
+
if (schema.type === "integer") return "z.coerce.number()";
|
|
534
|
+
if (schema.type === "number") return "z.number()";
|
|
535
|
+
if (schema.type === "boolean") return "z.boolean()";
|
|
536
|
+
if (schema.type === "array") return "z.array(z.unknown())";
|
|
537
|
+
return "z.string()";
|
|
538
|
+
})();
|
|
539
|
+
return schema.nullable ? `${baseExpr}.nullable()` : baseExpr;
|
|
549
540
|
}
|
|
550
541
|
//#endregion
|
|
551
542
|
//#region src/components/Server.tsx
|
|
@@ -770,7 +761,7 @@ const serverGenerator = defineGenerator({
|
|
|
770
761
|
name: "operations",
|
|
771
762
|
renderer: jsxRendererSync,
|
|
772
763
|
operations(nodes, ctx) {
|
|
773
|
-
const { config, resolver, plugin, driver, root
|
|
764
|
+
const { config, resolver, plugin, driver, root } = ctx;
|
|
774
765
|
const { output, paramsCasing, group } = ctx.options;
|
|
775
766
|
const pluginZod = driver.getPlugin(pluginZodName);
|
|
776
767
|
if (!pluginZod) return;
|
|
@@ -859,11 +850,11 @@ const serverGenerator = defineGenerator({
|
|
|
859
850
|
baseName: serverFile.baseName,
|
|
860
851
|
path: serverFile.path,
|
|
861
852
|
meta: serverFile.meta,
|
|
862
|
-
banner: resolver.resolveBanner(
|
|
853
|
+
banner: resolver.resolveBanner(ctx.meta, {
|
|
863
854
|
output,
|
|
864
855
|
config
|
|
865
856
|
}),
|
|
866
|
-
footer: resolver.resolveFooter(
|
|
857
|
+
footer: resolver.resolveFooter(ctx.meta, {
|
|
867
858
|
output,
|
|
868
859
|
config
|
|
869
860
|
}),
|
|
@@ -883,8 +874,8 @@ const serverGenerator = defineGenerator({
|
|
|
883
874
|
imports,
|
|
884
875
|
/* @__PURE__ */ jsx(Server, {
|
|
885
876
|
name,
|
|
886
|
-
serverName:
|
|
887
|
-
serverVersion:
|
|
877
|
+
serverName: ctx.meta.title ?? "server",
|
|
878
|
+
serverVersion: ctx.meta.version ?? "0.0.0",
|
|
888
879
|
paramsCasing,
|
|
889
880
|
operations: operationsMapped
|
|
890
881
|
})
|
|
@@ -898,7 +889,7 @@ const serverGenerator = defineGenerator({
|
|
|
898
889
|
children: `
|
|
899
890
|
{
|
|
900
891
|
"mcpServers": {
|
|
901
|
-
"${
|
|
892
|
+
"${ctx.meta.title || "server"}": {
|
|
902
893
|
"type": "stdio",
|
|
903
894
|
"command": "npx",
|
|
904
895
|
"args": ["tsx", "${path.relative(path.dirname(jsonFile.path), serverFile.path)}"]
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#options","#transformParam","#eachParam","fetchClientSource","axiosClientSource","configSource"],"sources":["../../../internals/utils/src/casing.ts","../../../internals/utils/src/reserved.ts","../../../internals/utils/src/urlPath.ts","../../../internals/shared/src/operation.ts","../../../internals/shared/src/params.ts","../src/components/McpHandler.tsx","../src/utils.ts","../src/components/Server.tsx","../src/generators/mcpGenerator.tsx","../src/generators/serverGenerator.tsx","../src/resolvers/resolverMcp.ts","../src/plugin.ts"],"sourcesContent":["type Options = {\n /**\n * When `true`, dot-separated segments are split on `.` and joined with `/` after casing.\n */\n isFile?: boolean\n /**\n * Text prepended before casing is applied.\n */\n prefix?: string\n /**\n * Text appended before casing is applied.\n */\n suffix?: string\n}\n\n/**\n * Shared implementation for camelCase and PascalCase conversion.\n * Splits on common word boundaries (spaces, hyphens, underscores, dots, slashes, colons)\n * and capitalizes each word according to `pascal`.\n *\n * When `pascal` is `true` the first word is also capitalized (PascalCase), otherwise only subsequent words are.\n */\nfunction toCamelOrPascal(text: string, pascal: boolean): string {\n const normalized = text\n .trim()\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .replace(/(\\d)([a-z])/g, '$1 $2')\n\n const words = normalized.split(/[\\s\\-_./\\\\:]+/).filter(Boolean)\n\n return words\n .map((word, i) => {\n const allUpper = word.length > 1 && word === word.toUpperCase()\n if (allUpper) return word\n if (i === 0 && !pascal) return word.charAt(0).toLowerCase() + word.slice(1)\n return word.charAt(0).toUpperCase() + word.slice(1)\n })\n .join('')\n .replace(/[^a-zA-Z0-9]/g, '')\n}\n\n/**\n * Splits `text` on `.` and applies `transformPart` to each segment.\n * The last segment receives `isLast = true`, all earlier segments receive `false`.\n * Segments are joined with `/` to form a file path.\n *\n * Only splits on dots followed by a letter so that version numbers\n * embedded in operationIds (e.g. `v2025.0`) are kept intact.\n */\nfunction applyToFileParts(text: string, transformPart: (part: string, isLast: boolean) => string): string {\n const parts = text.split(/\\.(?=[a-zA-Z])/)\n return parts.map((part, i) => transformPart(part, i === parts.length - 1)).join('/')\n}\n\n/**\n * Converts `text` to camelCase.\n * When `isFile` is `true`, dot-separated segments are each cased independently and joined with `/`.\n *\n * @example\n * camelCase('hello-world') // 'helloWorld'\n * camelCase('pet.petId', { isFile: true }) // 'pet/petId'\n */\nexport function camelCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n if (isFile) {\n return applyToFileParts(text, (part, isLast) => camelCase(part, isLast ? { prefix, suffix } : {}))\n }\n\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, false)\n}\n\n/**\n * Converts `text` to PascalCase.\n * When `isFile` is `true`, the last dot-separated segment is PascalCased and earlier segments are camelCased.\n *\n * @example\n * pascalCase('hello-world') // 'HelloWorld'\n * pascalCase('pet.petId', { isFile: true }) // 'pet/PetId'\n */\nexport function pascalCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n if (isFile) {\n return applyToFileParts(text, (part, isLast) => (isLast ? pascalCase(part, { prefix, suffix }) : camelCase(part)))\n }\n\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, true)\n}\n\n/**\n * Converts `text` to snake_case.\n *\n * @example\n * snakeCase('helloWorld') // 'hello_world'\n * snakeCase('Hello-World') // 'hello_world'\n */\nexport function snakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n const processed = `${prefix} ${text} ${suffix}`.trim()\n return processed\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s\\-.]+/g, '_')\n .replace(/[^a-zA-Z0-9_]/g, '')\n .toLowerCase()\n .split('_')\n .filter(Boolean)\n .join('_')\n}\n\n/**\n * Converts `text` to SCREAMING_SNAKE_CASE.\n *\n * @example\n * screamingSnakeCase('helloWorld') // 'HELLO_WORLD'\n */\nexport function screamingSnakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n return snakeCase(text, { prefix, suffix }).toUpperCase()\n}\n","/**\n * JavaScript and Java reserved words.\n * @link https://github.com/jonschlinkert/reserved/blob/master/index.js\n */\nconst reservedWords = new Set([\n 'abstract',\n 'arguments',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'eval',\n 'export',\n 'extends',\n 'false',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'function',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'in',\n 'instanceof',\n 'int',\n 'interface',\n 'let',\n 'long',\n 'native',\n 'new',\n 'null',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'volatile',\n 'while',\n 'with',\n 'yield',\n 'Array',\n 'Date',\n 'hasOwnProperty',\n 'Infinity',\n 'isFinite',\n 'isNaN',\n 'isPrototypeOf',\n 'length',\n 'Math',\n 'name',\n 'NaN',\n 'Number',\n 'Object',\n 'prototype',\n 'String',\n 'toString',\n 'undefined',\n 'valueOf',\n] as const)\n\n/**\n * Returns `true` when `name` is a syntactically valid JavaScript variable name.\n *\n * @example\n * ```ts\n * isValidVarName('status') // true\n * isValidVarName('class') // false (reserved word)\n * isValidVarName('42foo') // false (starts with digit)\n * ```\n */\nexport function isValidVarName(name: string): boolean {\n if (!name || reservedWords.has(name as 'valueOf')) {\n return false\n }\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name)\n}\n","import { camelCase } from './casing.ts'\nimport { isValidVarName } from './reserved.ts'\n\nexport type URLObject = {\n /**\n * The resolved URL string (Express-style or template literal, depending on context).\n */\n url: string\n /**\n * Extracted path parameters as a key-value map, or `undefined` when the path has none.\n */\n params?: Record<string, string>\n}\n\ntype ObjectOptions = {\n /**\n * Controls whether the `url` is rendered as an Express path or a template literal.\n * @default 'path'\n */\n type?: 'path' | 'template'\n /**\n * Optional transform applied to each extracted parameter name.\n */\n replacer?: (pathParam: string) => string\n /**\n * When `true`, the result is serialized to a string expression instead of a plain object.\n */\n stringify?: boolean\n}\n\n/**\n * Supported identifier casing strategies for path parameters.\n */\ntype PathCasing = 'camelcase'\n\ntype Options = {\n /**\n * Casing strategy applied to path parameter names.\n * @default undefined (original identifier preserved)\n */\n casing?: PathCasing\n}\n\n/**\n * Parses and transforms an OpenAPI/Swagger path string into various URL formats.\n *\n * @example\n * const p = new URLPath('/pet/{petId}')\n * p.URL // '/pet/:petId'\n * p.template // '`/pet/${petId}`'\n */\nexport class URLPath {\n /**\n * The raw OpenAPI/Swagger path string, e.g. `/pet/{petId}`.\n */\n path: string\n\n #options: Options\n\n constructor(path: string, options: Options = {}) {\n this.path = path\n this.#options = options\n }\n\n /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').URL // '/pet/:petId'\n * ```\n */\n get URL(): string {\n return this.toURLPath()\n }\n\n /** Returns `true` when `path` is a fully-qualified URL (e.g. starts with `https://`).\n *\n * @example\n * ```ts\n * new URLPath('https://petstore.swagger.io/v2/pet').isURL // true\n * new URLPath('/pet/{petId}').isURL // false\n * ```\n */\n get isURL(): boolean {\n try {\n return !!new URL(this.path).href\n } catch {\n return false\n }\n }\n\n /**\n * Converts the OpenAPI path to a TypeScript template literal string.\n *\n * @example\n * new URLPath('/pet/{petId}').template // '`/pet/${petId}`'\n * new URLPath('/account/monetary-accountID').template // '`/account/${monetaryAccountId}`'\n */\n get template(): string {\n return this.toTemplateString()\n }\n\n /** Returns the path and its extracted params as a structured `URLObject`, or as a stringified expression when `stringify` is set.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').object\n * // { url: '/pet/:petId', params: { petId: 'petId' } }\n * ```\n */\n get object(): URLObject | string {\n return this.toObject()\n }\n\n /** Returns a map of path parameter names, or `undefined` when the path has no parameters.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').params // { petId: 'petId' }\n * new URLPath('/pet').params // undefined\n * ```\n */\n get params(): Record<string, string> | undefined {\n return this.toParamsObject()\n }\n\n #transformParam(raw: string): string {\n const param = isValidVarName(raw) ? raw : camelCase(raw)\n return this.#options.casing === 'camelcase' ? camelCase(param) : param\n }\n\n /**\n * Iterates over every `{param}` token in `path`, calling `fn` with the raw token and transformed name.\n */\n #eachParam(fn: (raw: string, param: string) => void): void {\n for (const match of this.path.matchAll(/\\{([^}]+)\\}/g)) {\n const raw = match[1]!\n fn(raw, this.#transformParam(raw))\n }\n }\n\n toObject({ type = 'path', replacer, stringify }: ObjectOptions = {}): URLObject | string {\n const object = {\n url: type === 'path' ? this.toURLPath() : this.toTemplateString({ replacer }),\n params: this.toParamsObject(),\n }\n\n if (stringify) {\n if (type === 'template') {\n return JSON.stringify(object).replaceAll(\"'\", '').replaceAll(`\"`, '')\n }\n\n if (object.params) {\n return `{ url: '${object.url}', params: ${JSON.stringify(object.params).replaceAll(\"'\", '').replaceAll(`\"`, '')} }`\n }\n\n return `{ url: '${object.url}' }`\n }\n\n return object\n }\n\n /**\n * Converts the OpenAPI path to a TypeScript template literal string.\n * An optional `replacer` can transform each extracted parameter name before interpolation.\n *\n * @example\n * new URLPath('/pet/{petId}').toTemplateString() // '`/pet/${petId}`'\n */\n toTemplateString({ prefix = '', replacer }: { prefix?: string; replacer?: (pathParam: string) => string } = {}): string {\n const parts = this.path.split(/\\{([^}]+)\\}/)\n const result = parts\n .map((part, i) => {\n if (i % 2 === 0) return part\n const param = this.#transformParam(part)\n return `\\${${replacer ? replacer(param) : param}}`\n })\n .join('')\n\n return `\\`${prefix}${result}\\``\n }\n\n /**\n * Extracts all `{param}` segments from the path and returns them as a key-value map.\n * An optional `replacer` transforms each parameter name in both key and value positions.\n * Returns `undefined` when no path parameters are found.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}/tag/{tagId}').toParamsObject()\n * // { petId: 'petId', tagId: 'tagId' }\n * ```\n */\n toParamsObject(replacer?: (pathParam: string) => string): Record<string, string> | undefined {\n const params: Record<string, string> = {}\n\n this.#eachParam((_raw, param) => {\n const key = replacer ? replacer(param) : param\n params[key] = key\n })\n\n return Object.keys(params).length > 0 ? params : undefined\n }\n\n /** Converts the OpenAPI path to Express-style colon syntax.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').toURLPath() // '/pet/:petId'\n * ```\n */\n toURLPath(): string {\n return this.path.replace(/\\{([^}]+)\\}/g, ':$1')\n }\n}\n","import { URLPath } from '@internals/utils'\nimport { ast } from '@kubb/core'\n\nexport type ContentTypeInfo = {\n contentTypes: string[]\n isMultipleContentTypes: boolean\n contentTypeUnion: string\n defaultContentType: string\n hasFormData: boolean\n}\n\nexport type RequestConfigResolver = {\n resolveDataName(node: ast.OperationNode): string\n}\n\nexport type ResponseStatusNameResolver = {\n resolveResponseStatusName(node: ast.OperationNode, statusCode: ast.StatusCode): string\n}\n\nexport type ResponseNameResolver = ResponseStatusNameResolver & {\n resolveResponseName(node: ast.OperationNode): string\n}\n\nexport type OperationTypeNameResolver = RequestConfigResolver &\n ResponseNameResolver & {\n resolvePathParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n resolveQueryParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n resolveHeaderParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n }\n\nexport type OperationCommentLink = 'pathTemplate' | 'urlPath' | false | ((node: ast.OperationNode) => string | undefined)\n\nexport type BuildOperationCommentsOptions = {\n link?: OperationCommentLink\n linkPosition?: 'beforeDeprecated' | 'afterDeprecated'\n splitLines?: boolean\n}\n\ntype ResponseLike = {\n statusCode: ast.StatusCode | number | string\n}\n\nexport type OperationParameterGroups = Record<ast.ParameterNode['in'], Array<ast.ParameterNode>>\n\nexport type ResolveOperationTypeNameOptions = {\n paramsCasing?: 'camelcase'\n responseStatusNames?: boolean | 'error'\n exclude?: ReadonlyArray<string | undefined>\n order?: 'params-first' | 'body-response-first'\n}\n\nfunction getOperationLink(node: ast.OperationNode, link: OperationCommentLink): string | undefined {\n if (!link) {\n return undefined\n }\n\n if (typeof link === 'function') {\n return link(node)\n }\n\n if (link === 'urlPath') {\n return node.path ? `{@link ${new URLPath(node.path).URL}}` : undefined\n }\n\n return `{@link ${node.path.replaceAll('{', ':').replaceAll('}', '')}}`\n}\n\nexport function getContentTypeInfo(node: ast.OperationNode): ContentTypeInfo {\n const contentTypes = node.requestBody?.content?.map((e) => e.contentType) ?? []\n const isMultipleContentTypes = contentTypes.length > 1\n\n return {\n contentTypes,\n isMultipleContentTypes,\n contentTypeUnion: isMultipleContentTypes ? contentTypes.map((ct) => JSON.stringify(ct)).join(' | ') : '',\n defaultContentType: contentTypes[0] ?? 'application/json',\n hasFormData: contentTypes.some((ct) => ct === 'multipart/form-data'),\n }\n}\n\nexport function buildRequestConfigType(node: ast.OperationNode, resolver: RequestConfigResolver): string {\n const requestName = node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : undefined\n const { isMultipleContentTypes, contentTypeUnion } = getContentTypeInfo(node)\n const configType = requestName ? `Partial<RequestConfig<${requestName}>>` : 'Partial<RequestConfig>'\n const configProps = ['client?: Client', isMultipleContentTypes ? `contentType?: ${contentTypeUnion}` : undefined].filter(Boolean).join('; ')\n\n return `${configType} & { ${configProps} }`\n}\n\nexport function buildOperationComments(node: ast.OperationNode, options: BuildOperationCommentsOptions = {}): Array<string> {\n const { link = 'pathTemplate', linkPosition = 'afterDeprecated', splitLines = false } = options\n const linkComment = getOperationLink(node, link)\n const comments =\n linkPosition === 'beforeDeprecated'\n ? [node.description && `@description ${node.description}`, node.summary && `@summary ${node.summary}`, linkComment, node.deprecated && '@deprecated']\n : [node.description && `@description ${node.description}`, node.summary && `@summary ${node.summary}`, node.deprecated && '@deprecated', linkComment]\n\n const filteredComments = comments.filter((comment): comment is string => Boolean(comment))\n\n if (!splitLines) {\n return filteredComments\n }\n\n return filteredComments.flatMap((text) => text.split(/\\r?\\n/).map((line) => line.trim())).filter((comment): comment is string => Boolean(comment))\n}\n\nexport function getOperationParameters(node: ast.OperationNode, options: { paramsCasing?: 'camelcase' } = {}): OperationParameterGroups {\n const params = ast.caseParams(node.parameters, options.paramsCasing)\n\n return {\n path: params.filter((param) => param.in === 'path'),\n query: params.filter((param) => param.in === 'query'),\n header: params.filter((param) => param.in === 'header'),\n cookie: params.filter((param) => param.in === 'cookie'),\n }\n}\n\nexport function getStatusCodeNumber(statusCode: ast.StatusCode | number | string): number | undefined {\n const code = Number(statusCode)\n\n return Number.isNaN(code) ? undefined : code\n}\n\nexport function isSuccessStatusCode(statusCode: ast.StatusCode | number | string): boolean {\n const code = getStatusCodeNumber(statusCode)\n\n return code !== undefined && code >= 200 && code < 300\n}\n\nexport function isErrorStatusCode(statusCode: ast.StatusCode | number | string): boolean {\n const code = getStatusCodeNumber(statusCode)\n\n return code !== undefined && code >= 400\n}\n\nexport function getSuccessResponses<TResponse extends ResponseLike>(responses: ReadonlyArray<TResponse>): Array<TResponse> {\n return responses.filter((response) => isSuccessStatusCode(response.statusCode))\n}\n\nexport function getOperationSuccessResponses(node: ast.OperationNode): Array<ast.ResponseNode> {\n return getSuccessResponses(node.responses)\n}\n\nexport function getPrimarySuccessResponse(node: ast.OperationNode): ast.ResponseNode | undefined {\n return getOperationSuccessResponses(node)[0]\n}\n\nexport function resolveErrorNames(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string[] {\n return node.responses\n .filter((response) => isErrorStatusCode(response.statusCode))\n .map((response) => resolver.resolveResponseStatusName(node, response.statusCode))\n}\n\nexport function resolveStatusCodeNames(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string[] {\n return node.responses.map((response) => resolver.resolveResponseStatusName(node, response.statusCode))\n}\n\nconst typeNamesByResolver = new WeakMap<OperationTypeNameResolver, Map<string, string[]>>()\n\nexport function resolveOperationTypeNames(\n node: ast.OperationNode,\n resolver: OperationTypeNameResolver,\n options: ResolveOperationTypeNameOptions = {},\n): string[] {\n const cacheKey = `${node.operationId}\\0${options.paramsCasing ?? ''}\\0${options.order ?? ''}\\0${options.responseStatusNames ?? ''}\\0${(options.exclude ?? []).join(',')}`\n let byResolver = typeNamesByResolver.get(resolver)\n if (byResolver) {\n const cached = byResolver.get(cacheKey)\n if (cached) return cached\n } else {\n byResolver = new Map()\n typeNamesByResolver.set(resolver, byResolver)\n }\n\n const { path, query, header } = getOperationParameters(node, { paramsCasing: options.paramsCasing })\n const responseStatusNames =\n options.responseStatusNames === 'error'\n ? resolveErrorNames(node, resolver)\n : options.responseStatusNames === false\n ? []\n : resolveStatusCodeNames(node, resolver)\n const exclude = new Set(options.exclude ?? [])\n const paramNames = [\n ...path.map((param) => resolver.resolvePathParamsName(node, param)),\n ...query.map((param) => resolver.resolveQueryParamsName(node, param)),\n ...header.map((param) => resolver.resolveHeaderParamsName(node, param)),\n ]\n const bodyAndResponseNames = [node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : undefined, resolver.resolveResponseName(node)]\n const names =\n options.order === 'body-response-first'\n ? [...bodyAndResponseNames, ...paramNames, ...responseStatusNames]\n : [...paramNames, ...bodyAndResponseNames, ...responseStatusNames]\n\n const result = names.filter((name): name is string => Boolean(name) && !exclude.has(name))\n byResolver.set(cacheKey, result)\n return result\n}\n\nexport function resolveResponseTypes(node: ast.OperationNode, resolver: ResponseNameResolver): Array<[statusCode: number | 'default', typeName: string]> {\n const types: Array<[number | 'default', string]> = []\n\n for (const response of node.responses) {\n if (response.statusCode === 'default') {\n types.push(['default', resolver.resolveResponseName(node)])\n continue\n }\n\n const code = getStatusCodeNumber(response.statusCode)\n if (code === undefined) {\n continue\n }\n\n types.push([code, isSuccessStatusCode(code) ? resolver.resolveResponseName(node) : resolver.resolveResponseStatusName(node, response.statusCode)])\n }\n\n return types\n}\n\nexport function findSuccessStatusCode(responses: Array<{ statusCode: ast.StatusCode | number | string }>): ast.StatusCode | undefined {\n for (const response of responses) {\n if (isSuccessStatusCode(response.statusCode)) {\n return response.statusCode as ast.StatusCode\n }\n }\n\n return undefined\n}\n","export function buildParamsMapping<TParam extends { name: string }>(\n originalParams: ReadonlyArray<TParam>,\n mappedParams: ReadonlyArray<TParam>,\n): Record<string, string> | undefined {\n const mapping: Record<string, string> = {}\n let hasChanged = false\n\n originalParams.forEach((param, i) => {\n const mappedName = mappedParams[i]?.name ?? param.name\n mapping[param.name] = mappedName\n\n if (param.name !== mappedName) {\n hasChanged = true\n }\n })\n\n return hasChanged ? mapping : undefined\n}\n\nexport function buildTransformedParamsMapping<TParam extends { name: string }>(\n params: ReadonlyArray<TParam>,\n transformName: (name: string) => string,\n): Record<string, string> | undefined {\n if (!params.length) {\n return undefined\n }\n\n return buildParamsMapping(\n params,\n params.map((param) => ({ ...param, name: transformName(param.name) })),\n )\n}\n","import { buildOperationComments, buildTransformedParamsMapping, getOperationParameters } from '@internals/shared'\nimport { camelCase, isValidVarName, URLPath } from '@internals/utils'\nimport { ast } from '@kubb/core'\nimport type { ResolverTs } from '@kubb/plugin-ts'\nimport { functionPrinter } from '@kubb/plugin-ts'\nimport { File, Function } from '@kubb/renderer-jsx'\nimport type { KubbReactNode } from '@kubb/renderer-jsx/types'\nimport type { PluginMcp } from '../types.ts'\n\ntype Props = {\n /**\n * Name of the handler function.\n */\n name: string\n /**\n * AST operation node.\n */\n node: ast.OperationNode\n /**\n * TypeScript resolver for resolving param/data/response type names.\n */\n resolver: ResolverTs\n /**\n * Base URL prepended to every generated request URL.\n */\n baseURL: string | undefined\n /**\n * Return type when calling fetch.\n * - 'data' returns response data only.\n * - 'full' returns the full response object.\n * @default 'data'\n */\n dataReturnType: PluginMcp['resolvedOptions']['client']['dataReturnType']\n /**\n * How to style your params.\n */\n paramsCasing?: PluginMcp['resolvedOptions']['paramsCasing']\n}\n\n/**\n * Generate a remapping statement: `const mappedX = x ? { \"orig\": x.camel, ... } : undefined`\n */\nfunction buildRemappingCode(mapping: Record<string, string>, varName: string, sourceName: string): string {\n const pairs = Object.entries(mapping)\n .map(([orig, camel]) => `\"${orig}\": ${sourceName}.${camel}`)\n .join(', ')\n return `const ${varName} = ${sourceName} ? { ${pairs} } : undefined`\n}\n\nconst declarationPrinter = functionPrinter({ mode: 'declaration' })\n\nexport function McpHandler({ name, node, resolver, baseURL, dataReturnType, paramsCasing }: Props): KubbReactNode {\n const urlPath = new URLPath(node.path)\n const contentType = node.requestBody?.content?.[0]?.contentType\n const isFormData = contentType === 'multipart/form-data'\n\n const { query: queryParams, header: headerParams } = getOperationParameters(node, { paramsCasing })\n const { path: originalPathParams, query: originalQueryParams, header: originalHeaderParams } = getOperationParameters(node)\n\n const requestName = node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : undefined\n const responseName = resolver.resolveResponseName(node)\n\n const errorResponses = node.responses.filter((r) => Number(r.statusCode) >= 400).map((r) => resolver.resolveResponseStatusName(node, r.statusCode))\n const errorType = errorResponses.length > 0 ? errorResponses.join(' | ') : 'Error'\n\n const TError = `ResponseErrorConfig<${errorType}>`\n const generics = [responseName, TError, requestName || 'unknown'].filter(Boolean)\n\n const paramsNode = ast.createOperationParams(node, {\n paramsType: 'object',\n pathParamsType: 'inline',\n resolver,\n paramsCasing,\n })\n const baseParamsSignature = declarationPrinter.print(paramsNode) ?? ''\n const paramsSignature = baseParamsSignature\n ? `${baseParamsSignature}, request: RequestHandlerExtra<ServerRequest, ServerNotification>`\n : 'request: RequestHandlerExtra<ServerRequest, ServerNotification>'\n\n const pathParamsMapping = paramsCasing ? buildTransformedParamsMapping(originalPathParams, camelCase) : undefined\n const queryParamsMapping = paramsCasing ? buildTransformedParamsMapping(originalQueryParams, camelCase) : undefined\n const headerParamsMapping = paramsCasing ? buildTransformedParamsMapping(originalHeaderParams, camelCase) : undefined\n\n const contentTypeHeader =\n contentType && contentType !== 'application/json' && contentType !== 'multipart/form-data' ? `'Content-Type': '${contentType}'` : undefined\n const headers = [headerParams.length ? (headerParamsMapping ? '...mappedHeaders' : '...headers') : undefined, contentTypeHeader].filter(Boolean)\n\n const fetchConfig: string[] = []\n fetchConfig.push(`method: ${JSON.stringify(node.method.toUpperCase())}`)\n fetchConfig.push(`url: ${urlPath.template}`)\n if (baseURL) fetchConfig.push(`baseURL: \\`${baseURL}\\``)\n if (queryParams.length) fetchConfig.push(queryParamsMapping ? 'params: mappedParams' : 'params')\n if (requestName) fetchConfig.push(`data: ${isFormData ? 'formData as FormData' : 'requestData'}`)\n if (headers.length) fetchConfig.push(`headers: { ${headers.join(', ')} }`)\n\n const callToolResult =\n dataReturnType === 'data'\n ? `return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(res.data)\n }\n ],\n structuredContent: { data: res.data }\n }`\n : `return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(res)\n }\n ],\n structuredContent: { data: res.data }\n }`\n\n return (\n <File.Source name={name} isExportable isIndexable>\n <Function\n name={name}\n async\n export\n params={paramsSignature}\n JSDoc={{\n comments: buildOperationComments(node),\n }}\n returnType={'Promise<CallToolResult>'}\n >\n {''}\n <br />\n <br />\n {pathParamsMapping &&\n Object.entries(pathParamsMapping)\n .filter(([originalName, camelCaseName]) => originalName !== camelCaseName && isValidVarName(originalName))\n .map(([originalName, camelCaseName]) => `const ${originalName} = ${camelCaseName}`)\n .join('\\n')}\n {pathParamsMapping && (\n <>\n <br />\n <br />\n </>\n )}\n {queryParamsMapping && queryParams.length > 0 && (\n <>\n {buildRemappingCode(queryParamsMapping, 'mappedParams', 'params')}\n <br />\n <br />\n </>\n )}\n {headerParamsMapping && headerParams.length > 0 && (\n <>\n {buildRemappingCode(headerParamsMapping, 'mappedHeaders', 'headers')}\n <br />\n <br />\n </>\n )}\n {requestName && 'const requestData = data'}\n <br />\n {isFormData && requestName && 'const formData = buildFormData(requestData)'}\n <br />\n {`const res = await fetch<${generics.join(', ')}>({ ${fetchConfig.join(', ')} }, request)`}\n <br />\n {callToolResult}\n </Function>\n </File.Source>\n )\n}\n","import type { ast } from '@kubb/core'\n\nexport type ZodParam = {\n name: string\n schemaName: string\n}\n\n/**\n * Render a group param value — compose individual schemas into `z.object({ ... })`,\n * or use a schema name string directly.\n */\nexport function zodGroupExpr(entry: string | Array<ZodParam>): string {\n if (typeof entry === 'string') {\n return entry\n }\n const entries = entry.map((p) => `${JSON.stringify(p.name)}: ${p.schemaName}`)\n return `z.object({ ${entries.join(', ')} })`\n}\n\n/**\n * Convert a SchemaNode type to an inline Zod expression string.\n * Used as fallback when no named zod schema is available for a path parameter.\n */\nexport function zodExprFromSchemaNode(schema: ast.SchemaNode): string {\n let expr: string\n switch (schema.type) {\n case 'enum': {\n // namedEnumValues takes priority over enumValues\n const rawValues: Array<string | number | boolean> = schema.namedEnumValues?.length\n ? schema.namedEnumValues.map((v) => v.value)\n : (schema.enumValues ?? []).filter((v): v is string | number | boolean => v !== null)\n\n if (rawValues.length > 0 && rawValues.every((v) => typeof v === 'string')) {\n expr = `z.enum([${rawValues.map((v) => JSON.stringify(v)).join(', ')}])`\n } else if (rawValues.length > 0) {\n const literals = rawValues.map((v) => `z.literal(${JSON.stringify(v)})`)\n expr = literals.length === 1 ? literals[0]! : `z.union([${literals.join(', ')}])`\n } else {\n expr = 'z.string()'\n }\n break\n }\n case 'integer':\n expr = 'z.coerce.number()'\n break\n case 'number':\n expr = 'z.number()'\n break\n case 'boolean':\n expr = 'z.boolean()'\n break\n case 'array':\n expr = 'z.array(z.unknown())'\n break\n default:\n expr = 'z.string()'\n }\n\n if (schema.nullable) {\n expr = `${expr}.nullable()`\n }\n\n return expr\n}\n","import { getOperationParameters } from '@internals/shared'\nimport { ast } from '@kubb/core'\nimport { functionPrinter } from '@kubb/plugin-ts'\nimport { Const, File, Function } from '@kubb/renderer-jsx'\nimport type { KubbReactNode } from '@kubb/renderer-jsx/types'\nimport type { PluginMcp } from '../types.ts'\nimport type { ZodParam } from '../utils.ts'\nimport { zodExprFromSchemaNode, zodGroupExpr } from '../utils.ts'\n\ntype Props = {\n /**\n * Variable name for the MCP server instance (e.g. 'server').\n */\n name: string\n /**\n * Human-readable server name passed to `new McpServer({ name })`.\n */\n serverName: string\n /**\n * Semantic version string passed to `new McpServer({ version })`.\n */\n serverVersion: string\n /**\n * How to style your params.\n */\n paramsCasing?: PluginMcp['resolvedOptions']['paramsCasing']\n /**\n * Operations to register as MCP tools, each carrying its handler,\n * zod schema, and AST node metadata.\n */\n operations: Array<{\n tool: {\n name: string\n title?: string\n description: string\n }\n mcp: {\n name: string\n file: ast.FileNode\n }\n zod: {\n pathParams: Array<ZodParam>\n /**\n * Query params — individual schemas to compose into `z.object({ ... })`.\n */\n queryParams?: string | Array<ZodParam>\n /**\n * Header params — individual schemas to compose into `z.object({ ... })`.\n */\n headerParams?: string | Array<ZodParam>\n requestName?: string\n responseName?: string\n }\n node: ast.OperationNode\n }>\n}\n\nconst keysPrinter = functionPrinter({ mode: 'keys' })\n\nexport function Server({ name, serverName, serverVersion, paramsCasing, operations }: Props): KubbReactNode {\n return (\n <File.Source name={name} isExportable isIndexable>\n <Const name={'server'} export>\n {`\n new McpServer({\n name: '${serverName}',\n version: '${serverVersion}',\n})\n `}\n </Const>\n\n {operations\n .map(({ tool, mcp, zod, node }) => {\n const { path: pathParams } = getOperationParameters(node, { paramsCasing })\n\n const pathEntries: Array<{ key: string; value: string }> = []\n const otherEntries: Array<{ key: string; value: string }> = []\n\n for (const p of pathParams) {\n const zodParam = zod.pathParams.find((zp) => zp.name === p.name)\n pathEntries.push({ key: p.name, value: zodParam ? zodParam.schemaName : zodExprFromSchemaNode(p.schema) })\n }\n\n if (zod.requestName) {\n otherEntries.push({ key: 'data', value: zod.requestName })\n }\n\n if (zod.queryParams) {\n otherEntries.push({ key: 'params', value: zodGroupExpr(zod.queryParams) })\n }\n\n if (zod.headerParams) {\n otherEntries.push({ key: 'headers', value: zodGroupExpr(zod.headerParams) })\n }\n\n otherEntries.sort((a, b) => a.key.localeCompare(b.key))\n const entries = [...pathEntries, ...otherEntries]\n\n const paramsNode = entries.length\n ? ast.createFunctionParameters({\n params: [\n ast.createParameterGroup({\n properties: entries.map((e) => ast.createFunctionParameter({ name: e.key, optional: false })),\n }),\n ],\n })\n : undefined\n\n const destructured = paramsNode ? (keysPrinter.print(paramsNode) ?? '') : ''\n const inputSchema = entries.length ? `{ ${entries.map((e) => `${e.key}: ${e.value}`).join(', ')} }` : undefined\n const outputSchema = zod.responseName\n\n const config = [\n tool.title ? `title: ${JSON.stringify(tool.title)}` : null,\n `description: ${JSON.stringify(tool.description)}`,\n outputSchema ? `outputSchema: { data: ${outputSchema} }` : null,\n ]\n .filter(Boolean)\n .join(',\\n ')\n\n if (inputSchema) {\n return `\nserver.registerTool(${JSON.stringify(tool.name)}, {\n ${config},\n inputSchema: ${inputSchema},\n}, async (${destructured}, request) => {\n return ${mcp.name}(${destructured}, request)\n})\n `\n }\n\n return `\nserver.registerTool(${JSON.stringify(tool.name)}, {\n ${config},\n}, async (request) => {\n return ${mcp.name}(request)\n})\n `\n })\n .filter(Boolean)}\n\n <Function name=\"startServer\" async export>\n {`try {\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n } catch (error) {\n console.error('Failed to start server:', error)\n process.exit(1)\n }`}\n </Function>\n </File.Source>\n )\n}\n","import path from 'node:path'\nimport { resolveOperationTypeNames } from '@internals/shared'\nimport { defineGenerator } from '@kubb/core'\nimport { pluginTsName } from '@kubb/plugin-ts'\nimport { File, jsxRendererSync } from '@kubb/renderer-jsx'\nimport { McpHandler } from '../components/McpHandler.tsx'\nimport type { PluginMcp } from '../types.ts'\n\nexport const mcpGenerator = defineGenerator<PluginMcp>({\n name: 'mcp',\n renderer: jsxRendererSync,\n operation(node, ctx) {\n const { resolver, driver, root } = ctx\n const { output, client, paramsCasing, group } = ctx.options\n\n const pluginTs = driver.getPlugin(pluginTsName)\n\n if (!pluginTs) {\n return null\n }\n\n const tsResolver = driver.getResolver(pluginTsName)\n\n const importedTypeNames = resolveOperationTypeNames(node, tsResolver, { paramsCasing, responseStatusNames: 'error' })\n\n const meta = {\n name: resolver.resolveHandlerName(node),\n file: resolver.resolveFile({ name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path }, { root, output, group }),\n fileTs: tsResolver.resolveFile(\n { name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path },\n {\n root,\n output: pluginTs.options?.output ?? output,\n group: pluginTs.options?.group,\n },\n ),\n } as const\n\n return (\n <File baseName={meta.file.baseName} path={meta.file.path} meta={meta.file.meta}>\n {meta.fileTs && importedTypeNames.length > 0 && (\n <File.Import name={Array.from(new Set(importedTypeNames)).sort()} root={meta.file.path} path={meta.fileTs.path} isTypeOnly />\n )}\n <File.Import name={['CallToolResult', 'ServerNotification', 'ServerRequest']} path={'@modelcontextprotocol/sdk/types'} isTypeOnly />\n <File.Import name={['RequestHandlerExtra']} path={'@modelcontextprotocol/sdk/shared/protocol'} isTypeOnly />\n <File.Import name={['buildFormData']} root={meta.file.path} path={path.resolve(root, '.kubb/config.ts')} />\n {client.importPath ? (\n <>\n <File.Import name={['Client', 'RequestConfig', 'ResponseErrorConfig']} path={client.importPath} isTypeOnly />\n <File.Import name={'fetch'} path={client.importPath} />\n {client.dataReturnType === 'full' && <File.Import name={['ResponseConfig']} path={client.importPath} isTypeOnly />}\n </>\n ) : (\n <>\n <File.Import\n name={['Client', 'RequestConfig', 'ResponseErrorConfig']}\n root={meta.file.path}\n path={path.resolve(root, '.kubb/fetch.ts')}\n isTypeOnly\n />\n <File.Import name={['fetch']} root={meta.file.path} path={path.resolve(root, '.kubb/fetch.ts')} />\n {client.dataReturnType === 'full' && (\n <File.Import name={['ResponseConfig']} root={meta.file.path} path={path.resolve(root, '.kubb/fetch.ts')} isTypeOnly />\n )}\n </>\n )}\n\n <McpHandler\n name={meta.name}\n node={node}\n resolver={tsResolver}\n baseURL={client.baseURL}\n dataReturnType={client.dataReturnType || 'data'}\n paramsCasing={paramsCasing}\n />\n </File>\n )\n },\n})\n","import path from 'node:path'\nimport { findSuccessStatusCode, getOperationParameters } from '@internals/shared'\nimport { defineGenerator } from '@kubb/core'\nimport { pluginZodName } from '@kubb/plugin-zod'\nimport { File, jsxRendererSync } from '@kubb/renderer-jsx'\nimport { Server } from '../components/Server.tsx'\nimport type { PluginMcp } from '../types.ts'\n\n/**\n * Default v5 server generator for `@kubb/plugin-mcp`.\n *\n * Uses individual zod schemas for each param (e.g. `createPetsPathUuidSchema`, `createPetsQueryOffsetSchema`)\n * and `resolveResponseStatusName` for per-status response schemas.\n * Query and header params are composed into `z.object({ ... })` from individual schemas.\n */\nexport const serverGenerator = defineGenerator<PluginMcp>({\n name: 'operations',\n renderer: jsxRendererSync,\n operations(nodes, ctx) {\n const { config, resolver, plugin, driver, root, inputNode } = ctx\n const { output, paramsCasing, group } = ctx.options\n\n const pluginZod = driver.getPlugin(pluginZodName)\n\n if (!pluginZod) {\n return\n }\n\n const zodResolver = driver.getResolver(pluginZodName)\n\n const name = 'server'\n const serverFilePath = path.resolve(root, output.path, 'server.ts')\n const serverFile = {\n baseName: 'server.ts' as const,\n path: serverFilePath,\n meta: { pluginName: plugin.name },\n }\n\n const jsonFilePath = path.resolve(root, output.path, '.mcp.json')\n const jsonFile = {\n baseName: '.mcp.json' as const,\n path: jsonFilePath,\n meta: { pluginName: plugin.name },\n }\n\n const operationsMapped = nodes.map((node) => {\n const { path: pathParams, query: queryParams, header: headerParams } = getOperationParameters(node, { paramsCasing })\n\n const mcpFile = resolver.resolveFile({ name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path }, { root, output, group })\n\n const zodFile = zodResolver.resolveFile(\n { name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path },\n {\n root,\n output: pluginZod.options?.output ?? output,\n group: pluginZod.options?.group,\n },\n )\n\n const requestName = node.requestBody?.content?.[0]?.schema ? zodResolver.resolveDataName(node) : undefined\n const successStatus = findSuccessStatusCode(node.responses)\n const responseName = successStatus ? zodResolver.resolveResponseStatusName(node, successStatus) : undefined\n\n const resolveParams = (params: typeof pathParams) => params.map((p) => ({ name: p.name, schemaName: zodResolver.resolveParamName(node, p) }))\n\n return {\n tool: {\n name: node.operationId,\n title: node.summary || undefined,\n description: node.description || `Make a ${node.method.toUpperCase()} request to ${node.path}`,\n },\n mcp: {\n name: resolver.resolveHandlerName(node),\n file: mcpFile,\n },\n zod: {\n pathParams: resolveParams(pathParams),\n queryParams: queryParams.length ? resolveParams(queryParams) : undefined,\n headerParams: headerParams.length ? resolveParams(headerParams) : undefined,\n requestName,\n responseName,\n file: zodFile,\n },\n node: node,\n }\n })\n\n const imports = operationsMapped.flatMap(({ mcp, zod }) => {\n const zodNames = [\n ...zod.pathParams.map((p) => p.schemaName),\n ...(zod.queryParams ?? []).map((p) => p.schemaName),\n ...(zod.headerParams ?? []).map((p) => p.schemaName),\n zod.requestName,\n zod.responseName,\n ].filter((name): name is string => Boolean(name))\n\n const uniqueNames = [...new Set(zodNames)].sort()\n\n return [\n <File.Import key={mcp.name} name={[mcp.name]} root={serverFile.path} path={mcp.file.path} />,\n uniqueNames.length > 0 && <File.Import key={`zod-${mcp.name}`} name={uniqueNames} root={serverFile.path} path={zod.file.path} />,\n ].filter(Boolean)\n })\n\n return (\n <>\n <File\n baseName={serverFile.baseName}\n path={serverFile.path}\n meta={serverFile.meta}\n banner={resolver.resolveBanner(inputNode, { output, config })}\n footer={resolver.resolveFooter(inputNode, { output, config })}\n >\n <File.Import name={['McpServer']} path={'@modelcontextprotocol/sdk/server/mcp'} />\n <File.Import name={['z']} path={'zod'} />\n <File.Import name={['StdioServerTransport']} path={'@modelcontextprotocol/sdk/server/stdio'} />\n\n {imports}\n <Server\n name={name}\n serverName={inputNode.meta?.title ?? 'server'}\n serverVersion={inputNode.meta?.version ?? '0.0.0'}\n paramsCasing={paramsCasing}\n operations={operationsMapped}\n />\n </File>\n\n <File baseName={jsonFile.baseName} path={jsonFile.path} meta={jsonFile.meta}>\n <File.Source name={name}>\n {`\n {\n \"mcpServers\": {\n \"${inputNode.meta?.title || 'server'}\": {\n \"type\": \"stdio\",\n \"command\": \"npx\",\n \"args\": [\"tsx\", \"${path.relative(path.dirname(jsonFile.path), serverFile.path)}\"]\n }\n }\n }\n `}\n </File.Source>\n </File>\n </>\n )\n },\n})\n","import { camelCase } from '@internals/utils'\nimport { defineResolver } from '@kubb/core'\nimport type { PluginMcp } from '../types.ts'\n\n/**\n * Naming convention resolver for MCP plugin.\n *\n * Provides default naming helpers using camelCase with a `handler` suffix for functions.\n *\n * @example\n * `resolverMcp.default('addPet', 'function') // → 'addPetHandler'`\n */\nexport const resolverMcp = defineResolver<PluginMcp>(() => ({\n name: 'default',\n pluginName: 'plugin-mcp',\n default(name, type) {\n if (type === 'file') {\n return camelCase(name, { isFile: true })\n }\n return camelCase(name, { suffix: 'handler' })\n },\n resolveName(name) {\n return this.default(name, 'function')\n },\n resolvePathName(name, type) {\n return this.default(name, type)\n },\n resolveHandlerName(node) {\n return this.resolveName(node.operationId)\n },\n}))\n","import path from 'node:path'\nimport { camelCase } from '@internals/utils'\n\nimport { ast, definePlugin, type Group } from '@kubb/core'\nimport { pluginClientName } from '@kubb/plugin-client'\nimport { source as axiosClientSource } from '@kubb/plugin-client/templates/clients/axios.source'\nimport { source as fetchClientSource } from '@kubb/plugin-client/templates/clients/fetch.source'\nimport { source as configSource } from '@kubb/plugin-client/templates/config.source'\nimport { pluginTsName } from '@kubb/plugin-ts'\nimport { pluginZodName } from '@kubb/plugin-zod'\nimport { mcpGenerator } from './generators/mcpGenerator.tsx'\nimport { serverGenerator } from './generators/serverGenerator.tsx'\nimport { resolverMcp } from './resolvers/resolverMcp.ts'\nimport type { PluginMcp } from './types.ts'\n\nexport const pluginMcpName = 'plugin-mcp' satisfies PluginMcp['name']\n\nexport const pluginMcp = definePlugin<PluginMcp>((options) => {\n const {\n output = { path: 'mcp', barrelType: 'named' },\n group,\n exclude = [],\n include,\n override = [],\n paramsCasing,\n client,\n resolver: userResolver,\n transformer: userTransformer,\n generators: userGenerators = [],\n } = options\n\n const clientName = client?.client ?? 'axios'\n const clientImportPath = client?.importPath ?? (!client?.bundle ? `@kubb/plugin-client/clients/${clientName}` : undefined)\n\n const groupConfig = group\n ? ({\n ...group,\n name: group.name\n ? group.name\n : (ctx: { group: string }) => {\n if (group.type === 'path') {\n return `${ctx.group.split('/')[1]}`\n }\n return `${camelCase(ctx.group)}Requests`\n },\n } satisfies Group)\n : undefined\n\n return {\n name: pluginMcpName,\n options,\n dependencies: [pluginTsName, pluginZodName],\n hooks: {\n 'kubb:plugin:setup'(ctx) {\n const resolver = userResolver ? { ...resolverMcp, ...userResolver } : resolverMcp\n\n ctx.setOptions({\n output,\n exclude,\n include,\n override,\n group: groupConfig,\n paramsCasing,\n client: {\n client: clientName,\n clientType: client?.clientType ?? 'function',\n importPath: clientImportPath,\n dataReturnType: client?.dataReturnType ?? 'data',\n bundle: client?.bundle,\n baseURL: client?.baseURL,\n paramsCasing: client?.paramsCasing,\n },\n resolver,\n })\n ctx.setResolver(resolver)\n if (userTransformer) {\n ctx.setTransformer(userTransformer)\n }\n ctx.addGenerator(mcpGenerator)\n ctx.addGenerator(serverGenerator)\n for (const gen of userGenerators) {\n ctx.addGenerator(gen)\n }\n\n const root = path.resolve(ctx.config.root, ctx.config.output.path)\n const hasClientPlugin = ctx.config.plugins?.some((p) => p.name === pluginClientName)\n\n if (client?.bundle && !hasClientPlugin && !clientImportPath) {\n ctx.injectFile({\n baseName: 'fetch.ts',\n path: path.resolve(root, '.kubb/fetch.ts'),\n sources: [\n ast.createSource({\n name: 'fetch',\n nodes: [ast.createText(clientName === 'fetch' ? fetchClientSource : axiosClientSource)],\n isExportable: true,\n isIndexable: true,\n }),\n ],\n })\n }\n\n if (!hasClientPlugin) {\n ctx.injectFile({\n baseName: 'config.ts',\n path: path.resolve(root, '.kubb/config.ts'),\n sources: [\n ast.createSource({\n name: 'config',\n nodes: [ast.createText(configSource)],\n isExportable: false,\n isIndexable: false,\n }),\n ],\n })\n }\n },\n },\n }\n})\n\nexport default pluginMcp\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["#options","#transformParam","#eachParam","fetchClientSource","axiosClientSource","configSource"],"sources":["../../../internals/utils/src/casing.ts","../../../internals/utils/src/reserved.ts","../../../internals/utils/src/urlPath.ts","../../../internals/shared/src/operation.ts","../../../internals/shared/src/params.ts","../src/components/McpHandler.tsx","../src/utils.ts","../src/components/Server.tsx","../src/generators/mcpGenerator.tsx","../src/generators/serverGenerator.tsx","../src/resolvers/resolverMcp.ts","../src/plugin.ts"],"sourcesContent":["type Options = {\n /**\n * When `true`, dot-separated segments are split on `.` and joined with `/` after casing.\n */\n isFile?: boolean\n /**\n * Text prepended before casing is applied.\n */\n prefix?: string\n /**\n * Text appended before casing is applied.\n */\n suffix?: string\n}\n\n/**\n * Shared implementation for camelCase and PascalCase conversion.\n * Splits on common word boundaries (spaces, hyphens, underscores, dots, slashes, colons)\n * and capitalizes each word according to `pascal`.\n *\n * When `pascal` is `true` the first word is also capitalized (PascalCase), otherwise only subsequent words are.\n */\nfunction toCamelOrPascal(text: string, pascal: boolean): string {\n const normalized = text\n .trim()\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .replace(/(\\d)([a-z])/g, '$1 $2')\n\n const words = normalized.split(/[\\s\\-_./\\\\:]+/).filter(Boolean)\n\n return words\n .map((word, i) => {\n const allUpper = word.length > 1 && word === word.toUpperCase()\n if (allUpper) return word\n if (i === 0 && !pascal) return word.charAt(0).toLowerCase() + word.slice(1)\n return word.charAt(0).toUpperCase() + word.slice(1)\n })\n .join('')\n .replace(/[^a-zA-Z0-9]/g, '')\n}\n\n/**\n * Splits `text` on `.` and applies `transformPart` to each segment.\n * The last segment receives `isLast = true`, all earlier segments receive `false`.\n * Segments are joined with `/` to form a file path.\n *\n * Only splits on dots followed by a letter so that version numbers\n * embedded in operationIds (e.g. `v2025.0`) are kept intact.\n */\nfunction applyToFileParts(text: string, transformPart: (part: string, isLast: boolean) => string): string {\n const parts = text.split(/\\.(?=[a-zA-Z])/)\n return parts.map((part, i) => transformPart(part, i === parts.length - 1)).join('/')\n}\n\n/**\n * Converts `text` to camelCase.\n * When `isFile` is `true`, dot-separated segments are each cased independently and joined with `/`.\n *\n * @example\n * camelCase('hello-world') // 'helloWorld'\n * camelCase('pet.petId', { isFile: true }) // 'pet/petId'\n */\nexport function camelCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n if (isFile) {\n return applyToFileParts(text, (part, isLast) => camelCase(part, isLast ? { prefix, suffix } : {}))\n }\n\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, false)\n}\n\n/**\n * Converts `text` to PascalCase.\n * When `isFile` is `true`, the last dot-separated segment is PascalCased and earlier segments are camelCased.\n *\n * @example\n * pascalCase('hello-world') // 'HelloWorld'\n * pascalCase('pet.petId', { isFile: true }) // 'pet/PetId'\n */\nexport function pascalCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n if (isFile) {\n return applyToFileParts(text, (part, isLast) => (isLast ? pascalCase(part, { prefix, suffix }) : camelCase(part)))\n }\n\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, true)\n}\n\n/**\n * Converts `text` to snake_case.\n *\n * @example\n * snakeCase('helloWorld') // 'hello_world'\n * snakeCase('Hello-World') // 'hello_world'\n */\nexport function snakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n const processed = `${prefix} ${text} ${suffix}`.trim()\n return processed\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s\\-.]+/g, '_')\n .replace(/[^a-zA-Z0-9_]/g, '')\n .toLowerCase()\n .split('_')\n .filter(Boolean)\n .join('_')\n}\n\n/**\n * Converts `text` to SCREAMING_SNAKE_CASE.\n *\n * @example\n * screamingSnakeCase('helloWorld') // 'HELLO_WORLD'\n */\nexport function screamingSnakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n return snakeCase(text, { prefix, suffix }).toUpperCase()\n}\n","/**\n * JavaScript and Java reserved words.\n * @link https://github.com/jonschlinkert/reserved/blob/master/index.js\n */\nconst reservedWords = new Set([\n 'abstract',\n 'arguments',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'eval',\n 'export',\n 'extends',\n 'false',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'function',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'in',\n 'instanceof',\n 'int',\n 'interface',\n 'let',\n 'long',\n 'native',\n 'new',\n 'null',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'volatile',\n 'while',\n 'with',\n 'yield',\n 'Array',\n 'Date',\n 'hasOwnProperty',\n 'Infinity',\n 'isFinite',\n 'isNaN',\n 'isPrototypeOf',\n 'length',\n 'Math',\n 'name',\n 'NaN',\n 'Number',\n 'Object',\n 'prototype',\n 'String',\n 'toString',\n 'undefined',\n 'valueOf',\n] as const)\n\n/**\n * Returns `true` when `name` is a syntactically valid JavaScript variable name.\n *\n * @example\n * ```ts\n * isValidVarName('status') // true\n * isValidVarName('class') // false (reserved word)\n * isValidVarName('42foo') // false (starts with digit)\n * ```\n */\nexport function isValidVarName(name: string): boolean {\n if (!name || reservedWords.has(name as 'valueOf')) {\n return false\n }\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name)\n}\n","import { camelCase } from './casing.ts'\nimport { isValidVarName } from './reserved.ts'\n\nexport type URLObject = {\n /**\n * The resolved URL string (Express-style or template literal, depending on context).\n */\n url: string\n /**\n * Extracted path parameters as a key-value map, or `undefined` when the path has none.\n */\n params?: Record<string, string>\n}\n\ntype ObjectOptions = {\n /**\n * Controls whether the `url` is rendered as an Express path or a template literal.\n * @default 'path'\n */\n type?: 'path' | 'template'\n /**\n * Optional transform applied to each extracted parameter name.\n */\n replacer?: (pathParam: string) => string\n /**\n * When `true`, the result is serialized to a string expression instead of a plain object.\n */\n stringify?: boolean\n}\n\n/**\n * Supported identifier casing strategies for path parameters.\n */\ntype PathCasing = 'camelcase'\n\ntype Options = {\n /**\n * Casing strategy applied to path parameter names.\n * @default undefined (original identifier preserved)\n */\n casing?: PathCasing\n}\n\n/**\n * Parses and transforms an OpenAPI/Swagger path string into various URL formats.\n *\n * @example\n * const p = new URLPath('/pet/{petId}')\n * p.URL // '/pet/:petId'\n * p.template // '`/pet/${petId}`'\n */\nexport class URLPath {\n /**\n * The raw OpenAPI/Swagger path string, e.g. `/pet/{petId}`.\n */\n path: string\n\n #options: Options\n\n constructor(path: string, options: Options = {}) {\n this.path = path\n this.#options = options\n }\n\n /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').URL // '/pet/:petId'\n * ```\n */\n get URL(): string {\n return this.toURLPath()\n }\n\n /** Returns `true` when `path` is a fully-qualified URL (e.g. starts with `https://`).\n *\n * @example\n * ```ts\n * new URLPath('https://petstore.swagger.io/v2/pet').isURL // true\n * new URLPath('/pet/{petId}').isURL // false\n * ```\n */\n get isURL(): boolean {\n try {\n return !!new URL(this.path).href\n } catch {\n return false\n }\n }\n\n /**\n * Converts the OpenAPI path to a TypeScript template literal string.\n *\n * @example\n * new URLPath('/pet/{petId}').template // '`/pet/${petId}`'\n * new URLPath('/account/monetary-accountID').template // '`/account/${monetaryAccountId}`'\n */\n get template(): string {\n return this.toTemplateString()\n }\n\n /** Returns the path and its extracted params as a structured `URLObject`, or as a stringified expression when `stringify` is set.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').object\n * // { url: '/pet/:petId', params: { petId: 'petId' } }\n * ```\n */\n get object(): URLObject | string {\n return this.toObject()\n }\n\n /** Returns a map of path parameter names, or `undefined` when the path has no parameters.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').params // { petId: 'petId' }\n * new URLPath('/pet').params // undefined\n * ```\n */\n get params(): Record<string, string> | undefined {\n return this.toParamsObject()\n }\n\n #transformParam(raw: string): string {\n const param = isValidVarName(raw) ? raw : camelCase(raw)\n return this.#options.casing === 'camelcase' ? camelCase(param) : param\n }\n\n /**\n * Iterates over every `{param}` token in `path`, calling `fn` with the raw token and transformed name.\n */\n #eachParam(fn: (raw: string, param: string) => void): void {\n for (const match of this.path.matchAll(/\\{([^}]+)\\}/g)) {\n const raw = match[1]!\n fn(raw, this.#transformParam(raw))\n }\n }\n\n toObject({ type = 'path', replacer, stringify }: ObjectOptions = {}): URLObject | string {\n const object = {\n url: type === 'path' ? this.toURLPath() : this.toTemplateString({ replacer }),\n params: this.toParamsObject(),\n }\n\n if (stringify) {\n if (type === 'template') {\n return JSON.stringify(object).replaceAll(\"'\", '').replaceAll(`\"`, '')\n }\n\n if (object.params) {\n return `{ url: '${object.url}', params: ${JSON.stringify(object.params).replaceAll(\"'\", '').replaceAll(`\"`, '')} }`\n }\n\n return `{ url: '${object.url}' }`\n }\n\n return object\n }\n\n /**\n * Converts the OpenAPI path to a TypeScript template literal string.\n * An optional `replacer` can transform each extracted parameter name before interpolation.\n *\n * @example\n * new URLPath('/pet/{petId}').toTemplateString() // '`/pet/${petId}`'\n */\n toTemplateString({ prefix, replacer }: { prefix?: string | null; replacer?: (pathParam: string) => string } = {}): string {\n const parts = this.path.split(/\\{([^}]+)\\}/)\n const result = parts\n .map((part, i) => {\n if (i % 2 === 0) return part\n const param = this.#transformParam(part)\n return `\\${${replacer ? replacer(param) : param}}`\n })\n .join('')\n\n return `\\`${prefix ?? ''}${result}\\``\n }\n\n /**\n * Extracts all `{param}` segments from the path and returns them as a key-value map.\n * An optional `replacer` transforms each parameter name in both key and value positions.\n * Returns `undefined` when no path parameters are found.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}/tag/{tagId}').toParamsObject()\n * // { petId: 'petId', tagId: 'tagId' }\n * ```\n */\n toParamsObject(replacer?: (pathParam: string) => string): Record<string, string> | undefined {\n const params: Record<string, string> = {}\n\n this.#eachParam((_raw, param) => {\n const key = replacer ? replacer(param) : param\n params[key] = key\n })\n\n return Object.keys(params).length > 0 ? params : undefined\n }\n\n /** Converts the OpenAPI path to Express-style colon syntax.\n *\n * @example\n * ```ts\n * new URLPath('/pet/{petId}').toURLPath() // '/pet/:petId'\n * ```\n */\n toURLPath(): string {\n return this.path.replace(/\\{([^}]+)\\}/g, ':$1')\n }\n}\n","import { URLPath } from '@internals/utils'\nimport { ast } from '@kubb/core'\n\nexport type ContentTypeInfo = {\n contentTypes: string[]\n isMultipleContentTypes: boolean\n contentTypeUnion: string\n defaultContentType: string\n hasFormData: boolean\n}\n\nexport type RequestConfigResolver = {\n resolveDataName(node: ast.OperationNode): string\n}\n\nexport type ResponseStatusNameResolver = {\n resolveResponseStatusName(node: ast.OperationNode, statusCode: ast.StatusCode): string\n}\n\nexport type ResponseNameResolver = ResponseStatusNameResolver & {\n resolveResponseName(node: ast.OperationNode): string\n}\n\nexport type OperationTypeNameResolver = RequestConfigResolver &\n ResponseNameResolver & {\n resolvePathParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n resolveQueryParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n resolveHeaderParamsName(node: ast.OperationNode, param: ast.ParameterNode): string\n }\n\nexport type OperationCommentLink = 'pathTemplate' | 'urlPath' | false | ((node: ast.OperationNode) => string | undefined)\n\nexport type BuildOperationCommentsOptions = {\n link?: OperationCommentLink\n linkPosition?: 'beforeDeprecated' | 'afterDeprecated'\n splitLines?: boolean\n}\n\ntype ResponseLike = {\n statusCode: ast.StatusCode | number | string\n}\n\nexport type OperationParameterGroups = Record<ast.ParameterNode['in'], Array<ast.ParameterNode>>\n\nexport type ResolveOperationTypeNameOptions = {\n paramsCasing?: 'camelcase'\n responseStatusNames?: boolean | 'error'\n exclude?: ReadonlyArray<string | undefined>\n order?: 'params-first' | 'body-response-first'\n}\n\nfunction getOperationLink(node: ast.OperationNode, link: OperationCommentLink): string | undefined {\n if (!link) {\n return undefined\n }\n\n if (typeof link === 'function') {\n return link(node)\n }\n\n if (link === 'urlPath') {\n return node.path ? `{@link ${new URLPath(node.path).URL}}` : undefined\n }\n\n return `{@link ${node.path.replaceAll('{', ':').replaceAll('}', '')}}`\n}\n\nexport function getContentTypeInfo(node: ast.OperationNode): ContentTypeInfo {\n const contentTypes = node.requestBody?.content?.map((e) => e.contentType) ?? []\n const isMultipleContentTypes = contentTypes.length > 1\n\n return {\n contentTypes,\n isMultipleContentTypes,\n contentTypeUnion: isMultipleContentTypes ? contentTypes.map((ct) => JSON.stringify(ct)).join(' | ') : '',\n defaultContentType: contentTypes[0] ?? 'application/json',\n hasFormData: contentTypes.some((ct) => ct === 'multipart/form-data'),\n }\n}\n\nexport function buildRequestConfigType(node: ast.OperationNode, resolver: RequestConfigResolver): string {\n const requestName = node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : undefined\n const { isMultipleContentTypes, contentTypeUnion } = getContentTypeInfo(node)\n const configType = requestName ? `Partial<RequestConfig<${requestName}>>` : 'Partial<RequestConfig>'\n const configProps = ['client?: Client', isMultipleContentTypes ? `contentType?: ${contentTypeUnion}` : undefined].filter(Boolean).join('; ')\n\n return `${configType} & { ${configProps} }`\n}\n\nexport function buildOperationComments(node: ast.OperationNode, options: BuildOperationCommentsOptions = {}): Array<string> {\n const { link = 'pathTemplate', linkPosition = 'afterDeprecated', splitLines = false } = options\n const linkComment = getOperationLink(node, link)\n const comments =\n linkPosition === 'beforeDeprecated'\n ? [node.description && `@description ${node.description}`, node.summary && `@summary ${node.summary}`, linkComment, node.deprecated && '@deprecated']\n : [node.description && `@description ${node.description}`, node.summary && `@summary ${node.summary}`, node.deprecated && '@deprecated', linkComment]\n\n const filteredComments = comments.filter((comment): comment is string => Boolean(comment))\n\n if (!splitLines) {\n return filteredComments\n }\n\n return filteredComments.flatMap((text) => text.split(/\\r?\\n/).map((line) => line.trim())).filter((comment): comment is string => Boolean(comment))\n}\n\nexport function getOperationParameters(node: ast.OperationNode, options: { paramsCasing?: 'camelcase' } = {}): OperationParameterGroups {\n const params = ast.caseParams(node.parameters, options.paramsCasing)\n\n return {\n path: params.filter((param) => param.in === 'path'),\n query: params.filter((param) => param.in === 'query'),\n header: params.filter((param) => param.in === 'header'),\n cookie: params.filter((param) => param.in === 'cookie'),\n }\n}\n\nexport function getStatusCodeNumber(statusCode: ast.StatusCode | number | string): number | undefined {\n const code = Number(statusCode)\n\n return Number.isNaN(code) ? undefined : code\n}\n\nexport function isSuccessStatusCode(statusCode: ast.StatusCode | number | string): boolean {\n const code = getStatusCodeNumber(statusCode)\n\n return code !== undefined && code >= 200 && code < 300\n}\n\nexport function isErrorStatusCode(statusCode: ast.StatusCode | number | string): boolean {\n const code = getStatusCodeNumber(statusCode)\n\n return code !== undefined && code >= 400\n}\n\nexport function getSuccessResponses<TResponse extends ResponseLike>(responses: ReadonlyArray<TResponse>): Array<TResponse> {\n return responses.filter((response) => isSuccessStatusCode(response.statusCode))\n}\n\nexport function getOperationSuccessResponses(node: ast.OperationNode): Array<ast.ResponseNode> {\n return getSuccessResponses(node.responses)\n}\n\nexport function getPrimarySuccessResponse(node: ast.OperationNode): ast.ResponseNode | undefined {\n return getOperationSuccessResponses(node)[0]\n}\n\nexport function resolveErrorNames(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string[] {\n return node.responses\n .filter((response) => isErrorStatusCode(response.statusCode))\n .map((response) => resolver.resolveResponseStatusName(node, response.statusCode))\n}\n\nexport function resolveStatusCodeNames(node: ast.OperationNode, resolver: ResponseStatusNameResolver): string[] {\n return node.responses.map((response) => resolver.resolveResponseStatusName(node, response.statusCode))\n}\n\nconst typeNamesByResolver = new WeakMap<OperationTypeNameResolver, Map<string, string[]>>()\n\nexport function resolveOperationTypeNames(\n node: ast.OperationNode,\n resolver: OperationTypeNameResolver,\n options: ResolveOperationTypeNameOptions = {},\n): string[] {\n const cacheKey = `${node.operationId}\\0${options.paramsCasing ?? ''}\\0${options.order ?? ''}\\0${options.responseStatusNames ?? ''}\\0${(options.exclude ?? []).join(',')}`\n let byResolver = typeNamesByResolver.get(resolver)\n if (byResolver) {\n const cached = byResolver.get(cacheKey)\n if (cached) return cached\n } else {\n byResolver = new Map()\n typeNamesByResolver.set(resolver, byResolver)\n }\n\n const { path, query, header } = getOperationParameters(node, { paramsCasing: options.paramsCasing })\n const responseStatusNames =\n options.responseStatusNames === 'error'\n ? resolveErrorNames(node, resolver)\n : options.responseStatusNames === false\n ? []\n : resolveStatusCodeNames(node, resolver)\n const exclude = new Set(options.exclude ?? [])\n const paramNames = [\n ...path.map((param) => resolver.resolvePathParamsName(node, param)),\n ...query.map((param) => resolver.resolveQueryParamsName(node, param)),\n ...header.map((param) => resolver.resolveHeaderParamsName(node, param)),\n ]\n const bodyAndResponseNames = [node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : undefined, resolver.resolveResponseName(node)]\n const names =\n options.order === 'body-response-first'\n ? [...bodyAndResponseNames, ...paramNames, ...responseStatusNames]\n : [...paramNames, ...bodyAndResponseNames, ...responseStatusNames]\n\n const result = names.filter((name): name is string => Boolean(name) && !exclude.has(name))\n byResolver.set(cacheKey, result)\n return result\n}\n\nexport function resolveResponseTypes(node: ast.OperationNode, resolver: ResponseNameResolver): Array<[statusCode: number | 'default', typeName: string]> {\n const types: Array<[number | 'default', string]> = []\n\n for (const response of node.responses) {\n if (response.statusCode === 'default') {\n types.push(['default', resolver.resolveResponseName(node)])\n continue\n }\n\n const code = getStatusCodeNumber(response.statusCode)\n if (code === undefined) {\n continue\n }\n\n types.push([code, isSuccessStatusCode(code) ? resolver.resolveResponseName(node) : resolver.resolveResponseStatusName(node, response.statusCode)])\n }\n\n return types\n}\n\nexport function findSuccessStatusCode(responses: Array<{ statusCode: ast.StatusCode | number | string }>): ast.StatusCode | undefined {\n for (const response of responses) {\n if (isSuccessStatusCode(response.statusCode)) {\n return response.statusCode as ast.StatusCode\n }\n }\n\n return undefined\n}\n","export function buildParamsMapping<TParam extends { name: string }>(\n originalParams: ReadonlyArray<TParam>,\n mappedParams: ReadonlyArray<TParam>,\n): Record<string, string> | undefined {\n const mapping: Record<string, string> = {}\n let hasChanged = false\n\n originalParams.forEach((param, i) => {\n const mappedName = mappedParams[i]?.name ?? param.name\n mapping[param.name] = mappedName\n\n if (param.name !== mappedName) {\n hasChanged = true\n }\n })\n\n return hasChanged ? mapping : undefined\n}\n\nexport function buildTransformedParamsMapping<TParam extends { name: string }>(\n params: ReadonlyArray<TParam>,\n transformName: (name: string) => string,\n): Record<string, string> | undefined {\n if (!params.length) {\n return undefined\n }\n\n return buildParamsMapping(\n params,\n params.map((param) => ({ ...param, name: transformName(param.name) })),\n )\n}\n","import { buildOperationComments, buildTransformedParamsMapping, getOperationParameters } from '@internals/shared'\nimport { camelCase, isValidVarName, URLPath } from '@internals/utils'\nimport { ast } from '@kubb/core'\nimport type { ResolverTs } from '@kubb/plugin-ts'\nimport { functionPrinter } from '@kubb/plugin-ts'\nimport { File, Function } from '@kubb/renderer-jsx'\nimport type { KubbReactNode } from '@kubb/renderer-jsx/types'\nimport type { PluginMcp } from '../types.ts'\n\ntype Props = {\n /**\n * Name of the handler function.\n */\n name: string\n /**\n * AST operation node.\n */\n node: ast.OperationNode\n /**\n * TypeScript resolver for resolving param/data/response type names.\n */\n resolver: ResolverTs\n /**\n * Base URL prepended to every generated request URL.\n */\n baseURL: string | null | undefined\n /**\n * Return type when calling fetch.\n * - 'data' returns response data only.\n * - 'full' returns the full response object.\n * @default 'data'\n */\n dataReturnType: PluginMcp['resolvedOptions']['client']['dataReturnType']\n /**\n * How to style your params.\n */\n paramsCasing?: PluginMcp['resolvedOptions']['paramsCasing']\n}\n\n/**\n * Generate a remapping statement: `const mappedX = x ? { \"orig\": x.camel, ... } : undefined`\n */\nfunction buildRemappingCode(mapping: Record<string, string>, varName: string, sourceName: string): string {\n const pairs = Object.entries(mapping)\n .map(([orig, camel]) => `\"${orig}\": ${sourceName}.${camel}`)\n .join(', ')\n return `const ${varName} = ${sourceName} ? { ${pairs} } : undefined`\n}\n\nconst declarationPrinter = functionPrinter({ mode: 'declaration' })\n\nexport function McpHandler({ name, node, resolver, baseURL, dataReturnType, paramsCasing }: Props): KubbReactNode {\n const urlPath = new URLPath(node.path)\n const contentType = node.requestBody?.content?.[0]?.contentType\n const isFormData = contentType === 'multipart/form-data'\n\n const { query: queryParams, header: headerParams } = getOperationParameters(node, { paramsCasing })\n const { path: originalPathParams, query: originalQueryParams, header: originalHeaderParams } = getOperationParameters(node)\n\n const requestName = node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : undefined\n const responseName = resolver.resolveResponseName(node)\n\n const errorResponses = node.responses.filter((r) => Number(r.statusCode) >= 400).map((r) => resolver.resolveResponseStatusName(node, r.statusCode))\n const errorType = errorResponses.length > 0 ? errorResponses.join(' | ') : 'Error'\n\n const TError = `ResponseErrorConfig<${errorType}>`\n const generics = [responseName, TError, requestName || 'unknown'].filter(Boolean)\n\n const paramsNode = ast.createOperationParams(node, {\n paramsType: 'object',\n pathParamsType: 'inline',\n resolver,\n paramsCasing,\n })\n const baseParamsSignature = declarationPrinter.print(paramsNode) ?? ''\n const paramsSignature = baseParamsSignature\n ? `${baseParamsSignature}, request: RequestHandlerExtra<ServerRequest, ServerNotification>`\n : 'request: RequestHandlerExtra<ServerRequest, ServerNotification>'\n\n const pathParamsMapping = paramsCasing ? buildTransformedParamsMapping(originalPathParams, camelCase) : undefined\n const queryParamsMapping = paramsCasing ? buildTransformedParamsMapping(originalQueryParams, camelCase) : undefined\n const headerParamsMapping = paramsCasing ? buildTransformedParamsMapping(originalHeaderParams, camelCase) : undefined\n\n const contentTypeHeader =\n contentType && contentType !== 'application/json' && contentType !== 'multipart/form-data' ? `'Content-Type': '${contentType}'` : undefined\n const headers = [headerParams.length ? (headerParamsMapping ? '...mappedHeaders' : '...headers') : undefined, contentTypeHeader].filter(Boolean)\n\n const fetchConfig: string[] = []\n fetchConfig.push(`method: ${JSON.stringify(node.method.toUpperCase())}`)\n fetchConfig.push(`url: ${urlPath.template}`)\n if (baseURL) fetchConfig.push(`baseURL: \\`${baseURL}\\``)\n if (queryParams.length) fetchConfig.push(queryParamsMapping ? 'params: mappedParams' : 'params')\n if (requestName) fetchConfig.push(`data: ${isFormData ? 'formData as FormData' : 'requestData'}`)\n if (headers.length) fetchConfig.push(`headers: { ${headers.join(', ')} }`)\n\n const callToolResult =\n dataReturnType === 'data'\n ? `return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(res.data)\n }\n ],\n structuredContent: { data: res.data }\n }`\n : `return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(res)\n }\n ],\n structuredContent: { data: res.data }\n }`\n\n return (\n <File.Source name={name} isExportable isIndexable>\n <Function\n name={name}\n async\n export\n params={paramsSignature}\n JSDoc={{\n comments: buildOperationComments(node),\n }}\n returnType={'Promise<CallToolResult>'}\n >\n {''}\n <br />\n <br />\n {pathParamsMapping &&\n Object.entries(pathParamsMapping)\n .filter(([originalName, camelCaseName]) => originalName !== camelCaseName && isValidVarName(originalName))\n .map(([originalName, camelCaseName]) => `const ${originalName} = ${camelCaseName}`)\n .join('\\n')}\n {pathParamsMapping && (\n <>\n <br />\n <br />\n </>\n )}\n {queryParamsMapping && queryParams.length > 0 && (\n <>\n {buildRemappingCode(queryParamsMapping, 'mappedParams', 'params')}\n <br />\n <br />\n </>\n )}\n {headerParamsMapping && headerParams.length > 0 && (\n <>\n {buildRemappingCode(headerParamsMapping, 'mappedHeaders', 'headers')}\n <br />\n <br />\n </>\n )}\n {requestName && 'const requestData = data'}\n <br />\n {isFormData && requestName && 'const formData = buildFormData(requestData)'}\n <br />\n {`const res = await fetch<${generics.join(', ')}>({ ${fetchConfig.join(', ')} }, request)`}\n <br />\n {callToolResult}\n </Function>\n </File.Source>\n )\n}\n","import type { ast } from '@kubb/core'\n\nexport type ZodParam = {\n name: string\n schemaName: string\n}\n\n/**\n * Render a group param value — compose individual schemas into `z.object({ ... })`,\n * or use a schema name string directly.\n */\nexport function zodGroupExpr(entry: string | Array<ZodParam>): string {\n if (typeof entry === 'string') {\n return entry\n }\n const entries = entry.map((p) => `${JSON.stringify(p.name)}: ${p.schemaName}`)\n return `z.object({ ${entries.join(', ')} })`\n}\n\n/**\n * Convert a SchemaNode type to an inline Zod expression string.\n * Used as fallback when no named zod schema is available for a path parameter.\n */\nexport function zodExprFromSchemaNode(schema: ast.SchemaNode): string {\n const baseExpr = (() => {\n if (schema.type === 'enum') {\n const rawValues: Array<string | number | boolean> = schema.namedEnumValues?.length\n ? schema.namedEnumValues.map((v) => v.value)\n : (schema.enumValues ?? []).filter((v): v is string | number | boolean => v !== null)\n\n if (rawValues.length > 0 && rawValues.every((v) => typeof v === 'string')) {\n return `z.enum([${rawValues.map((v) => JSON.stringify(v)).join(', ')}])`\n }\n if (rawValues.length > 0) {\n const literals = rawValues.map((v) => `z.literal(${JSON.stringify(v)})`)\n return literals.length === 1 ? literals[0]! : `z.union([${literals.join(', ')}])`\n }\n return 'z.string()'\n }\n if (schema.type === 'integer') return 'z.coerce.number()'\n if (schema.type === 'number') return 'z.number()'\n if (schema.type === 'boolean') return 'z.boolean()'\n if (schema.type === 'array') return 'z.array(z.unknown())'\n return 'z.string()'\n })()\n\n return schema.nullable ? `${baseExpr}.nullable()` : baseExpr\n}\n","import { getOperationParameters } from '@internals/shared'\nimport { ast } from '@kubb/core'\nimport { functionPrinter } from '@kubb/plugin-ts'\nimport { Const, File, Function } from '@kubb/renderer-jsx'\nimport type { KubbReactNode } from '@kubb/renderer-jsx/types'\nimport type { PluginMcp } from '../types.ts'\nimport type { ZodParam } from '../utils.ts'\nimport { zodExprFromSchemaNode, zodGroupExpr } from '../utils.ts'\n\ntype Props = {\n /**\n * Variable name for the MCP server instance (e.g. 'server').\n */\n name: string\n /**\n * Human-readable server name passed to `new McpServer({ name })`.\n */\n serverName: string\n /**\n * Semantic version string passed to `new McpServer({ version })`.\n */\n serverVersion: string\n /**\n * How to style your params.\n */\n paramsCasing?: PluginMcp['resolvedOptions']['paramsCasing']\n /**\n * Operations to register as MCP tools, each carrying its handler,\n * zod schema, and AST node metadata.\n */\n operations: Array<{\n tool: {\n name: string\n title?: string\n description: string\n }\n mcp: {\n name: string\n file: ast.FileNode\n }\n zod: {\n pathParams: Array<ZodParam>\n /**\n * Query params — individual schemas to compose into `z.object({ ... })`.\n */\n queryParams?: string | Array<ZodParam>\n /**\n * Header params — individual schemas to compose into `z.object({ ... })`.\n */\n headerParams?: string | Array<ZodParam>\n requestName?: string\n responseName?: string\n }\n node: ast.OperationNode\n }>\n}\n\nconst keysPrinter = functionPrinter({ mode: 'keys' })\n\nexport function Server({ name, serverName, serverVersion, paramsCasing, operations }: Props): KubbReactNode {\n return (\n <File.Source name={name} isExportable isIndexable>\n <Const name={'server'} export>\n {`\n new McpServer({\n name: '${serverName}',\n version: '${serverVersion}',\n})\n `}\n </Const>\n\n {operations\n .map(({ tool, mcp, zod, node }) => {\n const { path: pathParams } = getOperationParameters(node, { paramsCasing })\n\n const pathEntries: Array<{ key: string; value: string }> = []\n const otherEntries: Array<{ key: string; value: string }> = []\n\n for (const p of pathParams) {\n const zodParam = zod.pathParams.find((zp) => zp.name === p.name)\n pathEntries.push({ key: p.name, value: zodParam ? zodParam.schemaName : zodExprFromSchemaNode(p.schema) })\n }\n\n if (zod.requestName) {\n otherEntries.push({ key: 'data', value: zod.requestName })\n }\n\n if (zod.queryParams) {\n otherEntries.push({ key: 'params', value: zodGroupExpr(zod.queryParams) })\n }\n\n if (zod.headerParams) {\n otherEntries.push({ key: 'headers', value: zodGroupExpr(zod.headerParams) })\n }\n\n otherEntries.sort((a, b) => a.key.localeCompare(b.key))\n const entries = [...pathEntries, ...otherEntries]\n\n const paramsNode = entries.length\n ? ast.createFunctionParameters({\n params: [\n ast.createParameterGroup({\n properties: entries.map((e) => ast.createFunctionParameter({ name: e.key, optional: false })),\n }),\n ],\n })\n : undefined\n\n const destructured = paramsNode ? (keysPrinter.print(paramsNode) ?? '') : ''\n const inputSchema = entries.length ? `{ ${entries.map((e) => `${e.key}: ${e.value}`).join(', ')} }` : undefined\n const outputSchema = zod.responseName\n\n const config = [\n tool.title ? `title: ${JSON.stringify(tool.title)}` : null,\n `description: ${JSON.stringify(tool.description)}`,\n outputSchema ? `outputSchema: { data: ${outputSchema} }` : null,\n ]\n .filter(Boolean)\n .join(',\\n ')\n\n if (inputSchema) {\n return `\nserver.registerTool(${JSON.stringify(tool.name)}, {\n ${config},\n inputSchema: ${inputSchema},\n}, async (${destructured}, request) => {\n return ${mcp.name}(${destructured}, request)\n})\n `\n }\n\n return `\nserver.registerTool(${JSON.stringify(tool.name)}, {\n ${config},\n}, async (request) => {\n return ${mcp.name}(request)\n})\n `\n })\n .filter(Boolean)}\n\n <Function name=\"startServer\" async export>\n {`try {\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n } catch (error) {\n console.error('Failed to start server:', error)\n process.exit(1)\n }`}\n </Function>\n </File.Source>\n )\n}\n","import path from 'node:path'\nimport { resolveOperationTypeNames } from '@internals/shared'\nimport { defineGenerator } from '@kubb/core'\nimport { pluginTsName } from '@kubb/plugin-ts'\nimport { File, jsxRendererSync } from '@kubb/renderer-jsx'\nimport { McpHandler } from '../components/McpHandler.tsx'\nimport type { PluginMcp } from '../types.ts'\n\nexport const mcpGenerator = defineGenerator<PluginMcp>({\n name: 'mcp',\n renderer: jsxRendererSync,\n operation(node, ctx) {\n const { resolver, driver, root } = ctx\n const { output, client, paramsCasing, group } = ctx.options\n\n const pluginTs = driver.getPlugin(pluginTsName)\n\n if (!pluginTs) {\n return null\n }\n\n const tsResolver = driver.getResolver(pluginTsName)\n\n const importedTypeNames = resolveOperationTypeNames(node, tsResolver, { paramsCasing, responseStatusNames: 'error' })\n\n const meta = {\n name: resolver.resolveHandlerName(node),\n file: resolver.resolveFile({ name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path }, { root, output, group }),\n fileTs: tsResolver.resolveFile(\n { name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path },\n {\n root,\n output: pluginTs.options?.output ?? output,\n group: pluginTs.options?.group,\n },\n ),\n } as const\n\n return (\n <File baseName={meta.file.baseName} path={meta.file.path} meta={meta.file.meta}>\n {meta.fileTs && importedTypeNames.length > 0 && (\n <File.Import name={Array.from(new Set(importedTypeNames)).sort()} root={meta.file.path} path={meta.fileTs.path} isTypeOnly />\n )}\n <File.Import name={['CallToolResult', 'ServerNotification', 'ServerRequest']} path={'@modelcontextprotocol/sdk/types'} isTypeOnly />\n <File.Import name={['RequestHandlerExtra']} path={'@modelcontextprotocol/sdk/shared/protocol'} isTypeOnly />\n <File.Import name={['buildFormData']} root={meta.file.path} path={path.resolve(root, '.kubb/config.ts')} />\n {client.importPath ? (\n <>\n <File.Import name={['Client', 'RequestConfig', 'ResponseErrorConfig']} path={client.importPath} isTypeOnly />\n <File.Import name={'fetch'} path={client.importPath} />\n {client.dataReturnType === 'full' && <File.Import name={['ResponseConfig']} path={client.importPath} isTypeOnly />}\n </>\n ) : (\n <>\n <File.Import\n name={['Client', 'RequestConfig', 'ResponseErrorConfig']}\n root={meta.file.path}\n path={path.resolve(root, '.kubb/fetch.ts')}\n isTypeOnly\n />\n <File.Import name={['fetch']} root={meta.file.path} path={path.resolve(root, '.kubb/fetch.ts')} />\n {client.dataReturnType === 'full' && (\n <File.Import name={['ResponseConfig']} root={meta.file.path} path={path.resolve(root, '.kubb/fetch.ts')} isTypeOnly />\n )}\n </>\n )}\n\n <McpHandler\n name={meta.name}\n node={node}\n resolver={tsResolver}\n baseURL={client.baseURL}\n dataReturnType={client.dataReturnType || 'data'}\n paramsCasing={paramsCasing}\n />\n </File>\n )\n },\n})\n","import path from 'node:path'\nimport { findSuccessStatusCode, getOperationParameters } from '@internals/shared'\nimport { defineGenerator } from '@kubb/core'\nimport { pluginZodName } from '@kubb/plugin-zod'\nimport { File, jsxRendererSync } from '@kubb/renderer-jsx'\nimport { Server } from '../components/Server.tsx'\nimport type { PluginMcp } from '../types.ts'\n\n/**\n * Default v5 server generator for `@kubb/plugin-mcp`.\n *\n * Uses individual zod schemas for each param (e.g. `createPetsPathUuidSchema`, `createPetsQueryOffsetSchema`)\n * and `resolveResponseStatusName` for per-status response schemas.\n * Query and header params are composed into `z.object({ ... })` from individual schemas.\n */\nexport const serverGenerator = defineGenerator<PluginMcp>({\n name: 'operations',\n renderer: jsxRendererSync,\n operations(nodes, ctx) {\n const { config, resolver, plugin, driver, root } = ctx\n const { output, paramsCasing, group } = ctx.options\n\n const pluginZod = driver.getPlugin(pluginZodName)\n\n if (!pluginZod) {\n return\n }\n\n const zodResolver = driver.getResolver(pluginZodName)\n\n const name = 'server'\n const serverFilePath = path.resolve(root, output.path, 'server.ts')\n const serverFile = {\n baseName: 'server.ts' as const,\n path: serverFilePath,\n meta: { pluginName: plugin.name },\n }\n\n const jsonFilePath = path.resolve(root, output.path, '.mcp.json')\n const jsonFile = {\n baseName: '.mcp.json' as const,\n path: jsonFilePath,\n meta: { pluginName: plugin.name },\n }\n\n const operationsMapped = nodes.map((node) => {\n const { path: pathParams, query: queryParams, header: headerParams } = getOperationParameters(node, { paramsCasing })\n\n const mcpFile = resolver.resolveFile({ name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path }, { root, output, group })\n\n const zodFile = zodResolver.resolveFile(\n { name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path },\n {\n root,\n output: pluginZod.options?.output ?? output,\n group: pluginZod.options?.group,\n },\n )\n\n const requestName = node.requestBody?.content?.[0]?.schema ? zodResolver.resolveDataName(node) : undefined\n const successStatus = findSuccessStatusCode(node.responses)\n const responseName = successStatus ? zodResolver.resolveResponseStatusName(node, successStatus) : undefined\n\n const resolveParams = (params: typeof pathParams) => params.map((p) => ({ name: p.name, schemaName: zodResolver.resolveParamName(node, p) }))\n\n return {\n tool: {\n name: node.operationId,\n title: node.summary || undefined,\n description: node.description || `Make a ${node.method.toUpperCase()} request to ${node.path}`,\n },\n mcp: {\n name: resolver.resolveHandlerName(node),\n file: mcpFile,\n },\n zod: {\n pathParams: resolveParams(pathParams),\n queryParams: queryParams.length ? resolveParams(queryParams) : undefined,\n headerParams: headerParams.length ? resolveParams(headerParams) : undefined,\n requestName,\n responseName,\n file: zodFile,\n },\n node: node,\n }\n })\n\n const imports = operationsMapped.flatMap(({ mcp, zod }) => {\n const zodNames = [\n ...zod.pathParams.map((p) => p.schemaName),\n ...(zod.queryParams ?? []).map((p) => p.schemaName),\n ...(zod.headerParams ?? []).map((p) => p.schemaName),\n zod.requestName,\n zod.responseName,\n ].filter((name): name is string => Boolean(name))\n\n const uniqueNames = [...new Set(zodNames)].sort()\n\n return [\n <File.Import key={mcp.name} name={[mcp.name]} root={serverFile.path} path={mcp.file.path} />,\n uniqueNames.length > 0 && <File.Import key={`zod-${mcp.name}`} name={uniqueNames} root={serverFile.path} path={zod.file.path} />,\n ].filter(Boolean)\n })\n\n return (\n <>\n <File\n baseName={serverFile.baseName}\n path={serverFile.path}\n meta={serverFile.meta}\n banner={resolver.resolveBanner(ctx.meta, { output, config })}\n footer={resolver.resolveFooter(ctx.meta, { output, config })}\n >\n <File.Import name={['McpServer']} path={'@modelcontextprotocol/sdk/server/mcp'} />\n <File.Import name={['z']} path={'zod'} />\n <File.Import name={['StdioServerTransport']} path={'@modelcontextprotocol/sdk/server/stdio'} />\n\n {imports}\n <Server\n name={name}\n serverName={ctx.meta.title ?? 'server'}\n serverVersion={ctx.meta.version ?? '0.0.0'}\n paramsCasing={paramsCasing}\n operations={operationsMapped}\n />\n </File>\n\n <File baseName={jsonFile.baseName} path={jsonFile.path} meta={jsonFile.meta}>\n <File.Source name={name}>\n {`\n {\n \"mcpServers\": {\n \"${ctx.meta.title || 'server'}\": {\n \"type\": \"stdio\",\n \"command\": \"npx\",\n \"args\": [\"tsx\", \"${path.relative(path.dirname(jsonFile.path), serverFile.path)}\"]\n }\n }\n }\n `}\n </File.Source>\n </File>\n </>\n )\n },\n})\n","import { camelCase } from '@internals/utils'\nimport { defineResolver } from '@kubb/core'\nimport type { PluginMcp } from '../types.ts'\n\n/**\n * Naming convention resolver for MCP plugin.\n *\n * Provides default naming helpers using camelCase with a `handler` suffix for functions.\n *\n * @example\n * `resolverMcp.default('addPet', 'function') // → 'addPetHandler'`\n */\nexport const resolverMcp = defineResolver<PluginMcp>(() => ({\n name: 'default',\n pluginName: 'plugin-mcp',\n default(name, type) {\n if (type === 'file') {\n return camelCase(name, { isFile: true })\n }\n return camelCase(name, { suffix: 'handler' })\n },\n resolveName(name) {\n return this.default(name, 'function')\n },\n resolvePathName(name, type) {\n return this.default(name, type)\n },\n resolveHandlerName(node) {\n return this.resolveName(node.operationId)\n },\n}))\n","import path from 'node:path'\nimport { camelCase } from '@internals/utils'\n\nimport { ast, definePlugin, type Group } from '@kubb/core'\nimport { pluginClientName } from '@kubb/plugin-client'\nimport { source as axiosClientSource } from '@kubb/plugin-client/templates/clients/axios.source'\nimport { source as fetchClientSource } from '@kubb/plugin-client/templates/clients/fetch.source'\nimport { source as configSource } from '@kubb/plugin-client/templates/config.source'\nimport { pluginTsName } from '@kubb/plugin-ts'\nimport { pluginZodName } from '@kubb/plugin-zod'\nimport { mcpGenerator } from './generators/mcpGenerator.tsx'\nimport { serverGenerator } from './generators/serverGenerator.tsx'\nimport { resolverMcp } from './resolvers/resolverMcp.ts'\nimport type { PluginMcp } from './types.ts'\n\nexport const pluginMcpName = 'plugin-mcp' satisfies PluginMcp['name']\n\nexport const pluginMcp = definePlugin<PluginMcp>((options) => {\n const {\n output = { path: 'mcp', barrelType: 'named' },\n group,\n exclude = [],\n include,\n override = [],\n paramsCasing,\n client,\n resolver: userResolver,\n transformer: userTransformer,\n generators: userGenerators = [],\n } = options\n\n const clientName = client?.client ?? 'axios'\n const clientImportPath = client?.importPath ?? (!client?.bundle ? `@kubb/plugin-client/clients/${clientName}` : undefined)\n\n const groupConfig = group\n ? ({\n ...group,\n name: group.name\n ? group.name\n : (ctx: { group: string }) => {\n if (group.type === 'path') {\n return `${ctx.group.split('/')[1]}`\n }\n return `${camelCase(ctx.group)}Requests`\n },\n } satisfies Group)\n : undefined\n\n return {\n name: pluginMcpName,\n options,\n dependencies: [pluginTsName, pluginZodName],\n hooks: {\n 'kubb:plugin:setup'(ctx) {\n const resolver = userResolver ? { ...resolverMcp, ...userResolver } : resolverMcp\n\n ctx.setOptions({\n output,\n exclude,\n include,\n override,\n group: groupConfig,\n paramsCasing,\n client: {\n client: clientName,\n clientType: client?.clientType ?? 'function',\n importPath: clientImportPath,\n dataReturnType: client?.dataReturnType ?? 'data',\n bundle: client?.bundle,\n baseURL: client?.baseURL,\n paramsCasing: client?.paramsCasing,\n },\n resolver,\n })\n ctx.setResolver(resolver)\n if (userTransformer) {\n ctx.setTransformer(userTransformer)\n }\n ctx.addGenerator(mcpGenerator)\n ctx.addGenerator(serverGenerator)\n for (const gen of userGenerators) {\n ctx.addGenerator(gen)\n }\n\n const root = path.resolve(ctx.config.root, ctx.config.output.path)\n const hasClientPlugin = ctx.config.plugins?.some((p) => p.name === pluginClientName)\n\n if (client?.bundle && !hasClientPlugin && !clientImportPath) {\n ctx.injectFile({\n baseName: 'fetch.ts',\n path: path.resolve(root, '.kubb/fetch.ts'),\n sources: [\n ast.createSource({\n name: 'fetch',\n nodes: [ast.createText(clientName === 'fetch' ? fetchClientSource : axiosClientSource)],\n isExportable: true,\n isIndexable: true,\n }),\n ],\n })\n }\n\n if (!hasClientPlugin) {\n ctx.injectFile({\n baseName: 'config.ts',\n path: path.resolve(root, '.kubb/config.ts'),\n sources: [\n ast.createSource({\n name: 'config',\n nodes: [ast.createText(configSource)],\n isExportable: false,\n isIndexable: false,\n }),\n ],\n })\n }\n },\n },\n }\n})\n\nexport default pluginMcp\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAsBA,SAAS,gBAAgB,MAAc,QAAyB;CAS9D,OARmB,KAChB,MAAM,CACN,QAAQ,qBAAqB,QAAQ,CACrC,QAAQ,yBAAyB,QAAQ,CACzC,QAAQ,gBAAgB,QAEH,CAAC,MAAM,gBAAgB,CAAC,OAAO,QAE3C,CACT,KAAK,MAAM,MAAM;EAEhB,IADiB,KAAK,SAAS,KAAK,SAAS,KAAK,aAAa,EACjD,OAAO;EACrB,IAAI,MAAM,KAAK,CAAC,QAAQ,OAAO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE;EAC3E,OAAO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE;GACnD,CACD,KAAK,GAAG,CACR,QAAQ,iBAAiB,GAAG;;;;;;;;;;AAWjC,SAAS,iBAAiB,MAAc,eAAkE;CACxG,MAAM,QAAQ,KAAK,MAAM,iBAAiB;CAC1C,OAAO,MAAM,KAAK,MAAM,MAAM,cAAc,MAAM,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC,KAAK,IAAI;;;;;;;;;;AAWtF,SAAgB,UAAU,MAAc,EAAE,QAAQ,SAAS,IAAI,SAAS,OAAgB,EAAE,EAAU;CAClG,IAAI,QACF,OAAO,iBAAiB,OAAO,MAAM,WAAW,UAAU,MAAM,SAAS;EAAE;EAAQ;EAAQ,GAAG,EAAE,CAAC,CAAC;CAGpG,OAAO,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,MAAM;;;;;;;;AChE9D,MAAM,gBAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAU;;;;;;;;;;;AAYX,SAAgB,eAAe,MAAuB;CACpD,IAAI,CAAC,QAAQ,cAAc,IAAI,KAAkB,EAC/C,OAAO;CAET,OAAO,6BAA6B,KAAK,KAAK;;;;;;;;;;;;ACnDhD,IAAa,UAAb,MAAqB;;;;CAInB;CAEA;CAEA,YAAY,MAAc,UAAmB,EAAE,EAAE;EAC/C,KAAK,OAAO;EACZ,KAAKA,WAAW;;;;;;;;;CAUlB,IAAI,MAAc;EAChB,OAAO,KAAK,WAAW;;;;;;;;;;CAWzB,IAAI,QAAiB;EACnB,IAAI;GACF,OAAO,CAAC,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC;UACtB;GACN,OAAO;;;;;;;;;;CAWX,IAAI,WAAmB;EACrB,OAAO,KAAK,kBAAkB;;;;;;;;;;CAWhC,IAAI,SAA6B;EAC/B,OAAO,KAAK,UAAU;;;;;;;;;;CAWxB,IAAI,SAA6C;EAC/C,OAAO,KAAK,gBAAgB;;CAG9B,gBAAgB,KAAqB;EACnC,MAAM,QAAQ,eAAe,IAAI,GAAG,MAAM,UAAU,IAAI;EACxD,OAAO,KAAKA,SAAS,WAAW,cAAc,UAAU,MAAM,GAAG;;;;;CAMnE,WAAW,IAAgD;EACzD,KAAK,MAAM,SAAS,KAAK,KAAK,SAAS,eAAe,EAAE;GACtD,MAAM,MAAM,MAAM;GAClB,GAAG,KAAK,KAAKC,gBAAgB,IAAI,CAAC;;;CAItC,SAAS,EAAE,OAAO,QAAQ,UAAU,cAA6B,EAAE,EAAsB;EACvF,MAAM,SAAS;GACb,KAAK,SAAS,SAAS,KAAK,WAAW,GAAG,KAAK,iBAAiB,EAAE,UAAU,CAAC;GAC7E,QAAQ,KAAK,gBAAgB;GAC9B;EAED,IAAI,WAAW;GACb,IAAI,SAAS,YACX,OAAO,KAAK,UAAU,OAAO,CAAC,WAAW,KAAK,GAAG,CAAC,WAAW,KAAK,GAAG;GAGvE,IAAI,OAAO,QACT,OAAO,WAAW,OAAO,IAAI,aAAa,KAAK,UAAU,OAAO,OAAO,CAAC,WAAW,KAAK,GAAG,CAAC,WAAW,KAAK,GAAG,CAAC;GAGlH,OAAO,WAAW,OAAO,IAAI;;EAG/B,OAAO;;;;;;;;;CAUT,iBAAiB,EAAE,QAAQ,aAAmF,EAAE,EAAU;EAExH,MAAM,SADQ,KAAK,KAAK,MAAM,cACV,CACjB,KAAK,MAAM,MAAM;GAChB,IAAI,IAAI,MAAM,GAAG,OAAO;GACxB,MAAM,QAAQ,KAAKA,gBAAgB,KAAK;GACxC,OAAO,MAAM,WAAW,SAAS,MAAM,GAAG,MAAM;IAChD,CACD,KAAK,GAAG;EAEX,OAAO,KAAK,UAAU,KAAK,OAAO;;;;;;;;;;;;;CAcpC,eAAe,UAA8E;EAC3F,MAAM,SAAiC,EAAE;EAEzC,KAAKC,YAAY,MAAM,UAAU;GAC/B,MAAM,MAAM,WAAW,SAAS,MAAM,GAAG;GACzC,OAAO,OAAO;IACd;EAEF,OAAO,OAAO,KAAK,OAAO,CAAC,SAAS,IAAI,SAAS,KAAA;;;;;;;;;CAUnD,YAAoB;EAClB,OAAO,KAAK,KAAK,QAAQ,gBAAgB,MAAM;;;;;ACjKnD,SAAS,iBAAiB,MAAyB,MAAgD;CACjG,IAAI,CAAC,MACH;CAGF,IAAI,OAAO,SAAS,YAClB,OAAO,KAAK,KAAK;CAGnB,IAAI,SAAS,WACX,OAAO,KAAK,OAAO,UAAU,IAAI,QAAQ,KAAK,KAAK,CAAC,IAAI,KAAK,KAAA;CAG/D,OAAO,UAAU,KAAK,KAAK,WAAW,KAAK,IAAI,CAAC,WAAW,KAAK,GAAG,CAAC;;AAyBtE,SAAgB,uBAAuB,MAAyB,UAAyC,EAAE,EAAiB;CAC1H,MAAM,EAAE,OAAO,gBAAgB,eAAe,mBAAmB,aAAa,UAAU;CACxF,MAAM,cAAc,iBAAiB,MAAM,KAAK;CAMhD,MAAM,oBAJJ,iBAAiB,qBACb;EAAC,KAAK,eAAe,gBAAgB,KAAK;EAAe,KAAK,WAAW,YAAY,KAAK;EAAW;EAAa,KAAK,cAAc;EAAc,GACnJ;EAAC,KAAK,eAAe,gBAAgB,KAAK;EAAe,KAAK,WAAW,YAAY,KAAK;EAAW,KAAK,cAAc;EAAe;EAAY,EAEvH,QAAQ,YAA+B,QAAQ,QAAQ,CAAC;CAE1F,IAAI,CAAC,YACH,OAAO;CAGT,OAAO,iBAAiB,SAAS,SAAS,KAAK,MAAM,QAAQ,CAAC,KAAK,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,YAA+B,QAAQ,QAAQ,CAAC;;AAGpJ,SAAgB,uBAAuB,MAAyB,UAA0C,EAAE,EAA4B;CACtI,MAAM,SAAS,IAAI,WAAW,KAAK,YAAY,QAAQ,aAAa;CAEpE,OAAO;EACL,MAAM,OAAO,QAAQ,UAAU,MAAM,OAAO,OAAO;EACnD,OAAO,OAAO,QAAQ,UAAU,MAAM,OAAO,QAAQ;EACrD,QAAQ,OAAO,QAAQ,UAAU,MAAM,OAAO,SAAS;EACvD,QAAQ,OAAO,QAAQ,UAAU,MAAM,OAAO,SAAS;EACxD;;AAGH,SAAgB,oBAAoB,YAAkE;CACpG,MAAM,OAAO,OAAO,WAAW;CAE/B,OAAO,OAAO,MAAM,KAAK,GAAG,KAAA,IAAY;;AAG1C,SAAgB,oBAAoB,YAAuD;CACzF,MAAM,OAAO,oBAAoB,WAAW;CAE5C,OAAO,SAAS,KAAA,KAAa,QAAQ,OAAO,OAAO;;AAGrD,SAAgB,kBAAkB,YAAuD;CACvF,MAAM,OAAO,oBAAoB,WAAW;CAE5C,OAAO,SAAS,KAAA,KAAa,QAAQ;;AAevC,SAAgB,kBAAkB,MAAyB,UAAgD;CACzG,OAAO,KAAK,UACT,QAAQ,aAAa,kBAAkB,SAAS,WAAW,CAAC,CAC5D,KAAK,aAAa,SAAS,0BAA0B,MAAM,SAAS,WAAW,CAAC;;AAGrF,SAAgB,uBAAuB,MAAyB,UAAgD;CAC9G,OAAO,KAAK,UAAU,KAAK,aAAa,SAAS,0BAA0B,MAAM,SAAS,WAAW,CAAC;;AAGxG,MAAM,sCAAsB,IAAI,SAA2D;AAE3F,SAAgB,0BACd,MACA,UACA,UAA2C,EAAE,EACnC;CACV,MAAM,WAAW,GAAG,KAAK,YAAY,IAAI,QAAQ,gBAAgB,GAAG,IAAI,QAAQ,SAAS,GAAG,IAAI,QAAQ,uBAAuB,GAAG,KAAK,QAAQ,WAAW,EAAE,EAAE,KAAK,IAAI;CACvK,IAAI,aAAa,oBAAoB,IAAI,SAAS;CAClD,IAAI,YAAY;EACd,MAAM,SAAS,WAAW,IAAI,SAAS;EACvC,IAAI,QAAQ,OAAO;QACd;EACL,6BAAa,IAAI,KAAK;EACtB,oBAAoB,IAAI,UAAU,WAAW;;CAG/C,MAAM,EAAE,MAAM,OAAO,WAAW,uBAAuB,MAAM,EAAE,cAAc,QAAQ,cAAc,CAAC;CACpG,MAAM,sBACJ,QAAQ,wBAAwB,UAC5B,kBAAkB,MAAM,SAAS,GACjC,QAAQ,wBAAwB,QAC9B,EAAE,GACF,uBAAuB,MAAM,SAAS;CAC9C,MAAM,UAAU,IAAI,IAAI,QAAQ,WAAW,EAAE,CAAC;CAC9C,MAAM,aAAa;EACjB,GAAG,KAAK,KAAK,UAAU,SAAS,sBAAsB,MAAM,MAAM,CAAC;EACnE,GAAG,MAAM,KAAK,UAAU,SAAS,uBAAuB,MAAM,MAAM,CAAC;EACrE,GAAG,OAAO,KAAK,UAAU,SAAS,wBAAwB,MAAM,MAAM,CAAC;EACxE;CACD,MAAM,uBAAuB,CAAC,KAAK,aAAa,UAAU,IAAI,SAAS,SAAS,gBAAgB,KAAK,GAAG,KAAA,GAAW,SAAS,oBAAoB,KAAK,CAAC;CAMtJ,MAAM,UAJJ,QAAQ,UAAU,wBACd;EAAC,GAAG;EAAsB,GAAG;EAAY,GAAG;EAAoB,GAChE;EAAC,GAAG;EAAY,GAAG;EAAsB,GAAG;EAAoB,EAEjD,QAAQ,SAAyB,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;CAC1F,WAAW,IAAI,UAAU,OAAO;CAChC,OAAO;;AAuBT,SAAgB,sBAAsB,WAAgG;CACpI,KAAK,MAAM,YAAY,WACrB,IAAI,oBAAoB,SAAS,WAAW,EAC1C,OAAO,SAAS;;;;AC7NtB,SAAgB,mBACd,gBACA,cACoC;CACpC,MAAM,UAAkC,EAAE;CAC1C,IAAI,aAAa;CAEjB,eAAe,SAAS,OAAO,MAAM;EACnC,MAAM,aAAa,aAAa,IAAI,QAAQ,MAAM;EAClD,QAAQ,MAAM,QAAQ;EAEtB,IAAI,MAAM,SAAS,YACjB,aAAa;GAEf;CAEF,OAAO,aAAa,UAAU,KAAA;;AAGhC,SAAgB,8BACd,QACA,eACoC;CACpC,IAAI,CAAC,OAAO,QACV;CAGF,OAAO,mBACL,QACA,OAAO,KAAK,WAAW;EAAE,GAAG;EAAO,MAAM,cAAc,MAAM,KAAK;EAAE,EAAE,CACvE;;;;;;;ACYH,SAAS,mBAAmB,SAAiC,SAAiB,YAA4B;CAIxG,OAAO,SAAS,QAAQ,KAAK,WAAW,OAH1B,OAAO,QAAQ,QAAQ,CAClC,KAAK,CAAC,MAAM,WAAW,IAAI,KAAK,KAAK,WAAW,GAAG,QAAQ,CAC3D,KAAK,KAC4C,CAAC;;AAGvD,MAAM,qBAAqB,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEnE,SAAgB,WAAW,EAAE,MAAM,MAAM,UAAU,SAAS,gBAAgB,gBAAsC;CAChH,MAAM,UAAU,IAAI,QAAQ,KAAK,KAAK;CACtC,MAAM,cAAc,KAAK,aAAa,UAAU,IAAI;CACpD,MAAM,aAAa,gBAAgB;CAEnC,MAAM,EAAE,OAAO,aAAa,QAAQ,iBAAiB,uBAAuB,MAAM,EAAE,cAAc,CAAC;CACnG,MAAM,EAAE,MAAM,oBAAoB,OAAO,qBAAqB,QAAQ,yBAAyB,uBAAuB,KAAK;CAE3H,MAAM,cAAc,KAAK,aAAa,UAAU,IAAI,SAAS,SAAS,gBAAgB,KAAK,GAAG,KAAA;CAC9F,MAAM,eAAe,SAAS,oBAAoB,KAAK;CAEvD,MAAM,iBAAiB,KAAK,UAAU,QAAQ,MAAM,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,KAAK,MAAM,SAAS,0BAA0B,MAAM,EAAE,WAAW,CAAC;CAInJ,MAAM,WAAW;EAAC;EAAc,uBAHd,eAAe,SAAS,IAAI,eAAe,KAAK,MAAM,GAAG,QAE3B;EACR,eAAe;EAAU,CAAC,OAAO,QAAQ;CAEjF,MAAM,aAAa,IAAI,sBAAsB,MAAM;EACjD,YAAY;EACZ,gBAAgB;EAChB;EACA;EACD,CAAC;CACF,MAAM,sBAAsB,mBAAmB,MAAM,WAAW,IAAI;CACpE,MAAM,kBAAkB,sBACpB,GAAG,oBAAoB,qEACvB;CAEJ,MAAM,oBAAoB,eAAe,8BAA8B,oBAAoB,UAAU,GAAG,KAAA;CACxG,MAAM,qBAAqB,eAAe,8BAA8B,qBAAqB,UAAU,GAAG,KAAA;CAC1G,MAAM,sBAAsB,eAAe,8BAA8B,sBAAsB,UAAU,GAAG,KAAA;CAE5G,MAAM,oBACJ,eAAe,gBAAgB,sBAAsB,gBAAgB,wBAAwB,oBAAoB,YAAY,KAAK,KAAA;CACpI,MAAM,UAAU,CAAC,aAAa,SAAU,sBAAsB,qBAAqB,eAAgB,KAAA,GAAW,kBAAkB,CAAC,OAAO,QAAQ;CAEhJ,MAAM,cAAwB,EAAE;CAChC,YAAY,KAAK,WAAW,KAAK,UAAU,KAAK,OAAO,aAAa,CAAC,GAAG;CACxE,YAAY,KAAK,QAAQ,QAAQ,WAAW;CAC5C,IAAI,SAAS,YAAY,KAAK,cAAc,QAAQ,IAAI;CACxD,IAAI,YAAY,QAAQ,YAAY,KAAK,qBAAqB,yBAAyB,SAAS;CAChG,IAAI,aAAa,YAAY,KAAK,SAAS,aAAa,yBAAyB,gBAAgB;CACjG,IAAI,QAAQ,QAAQ,YAAY,KAAK,cAAc,QAAQ,KAAK,KAAK,CAAC,IAAI;CAE1E,MAAM,iBACJ,mBAAmB,SACf;;;;;;;;gBASA;;;;;;;;;CAUN,OACE,oBAAC,KAAK,QAAN;EAAmB;EAAM,cAAA;EAAa,aAAA;YACpC,qBAAC,UAAD;GACQ;GACN,OAAA;GACA,QAAA;GACA,QAAQ;GACR,OAAO,EACL,UAAU,uBAAuB,KAAK,EACvC;GACD,YAAY;aARd;IAUG;IACD,oBAAC,MAAD,EAAM,CAAA;IACN,oBAAC,MAAD,EAAM,CAAA;IACL,qBACC,OAAO,QAAQ,kBAAkB,CAC9B,QAAQ,CAAC,cAAc,mBAAmB,iBAAiB,iBAAiB,eAAe,aAAa,CAAC,CACzG,KAAK,CAAC,cAAc,mBAAmB,SAAS,aAAa,KAAK,gBAAgB,CAClF,KAAK,KAAK;IACd,qBACC,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,MAAD,EAAM,CAAA,EACN,oBAAC,MAAD,EAAM,CAAA,CACL,EAAA,CAAA;IAEJ,sBAAsB,YAAY,SAAS,KAC1C,qBAAA,UAAA,EAAA,UAAA;KACG,mBAAmB,oBAAoB,gBAAgB,SAAS;KACjE,oBAAC,MAAD,EAAM,CAAA;KACN,oBAAC,MAAD,EAAM,CAAA;KACL,EAAA,CAAA;IAEJ,uBAAuB,aAAa,SAAS,KAC5C,qBAAA,UAAA,EAAA,UAAA;KACG,mBAAmB,qBAAqB,iBAAiB,UAAU;KACpE,oBAAC,MAAD,EAAM,CAAA;KACN,oBAAC,MAAD,EAAM,CAAA;KACL,EAAA,CAAA;IAEJ,eAAe;IAChB,oBAAC,MAAD,EAAM,CAAA;IACL,cAAc,eAAe;IAC9B,oBAAC,MAAD,EAAM,CAAA;IACL,2BAA2B,SAAS,KAAK,KAAK,CAAC,MAAM,YAAY,KAAK,KAAK,CAAC;IAC7E,oBAAC,MAAD,EAAM,CAAA;IACL;IACQ;;EACC,CAAA;;;;;;;;ACzJlB,SAAgB,aAAa,OAAyC;CACpE,IAAI,OAAO,UAAU,UACnB,OAAO;CAGT,OAAO,cADS,MAAM,KAAK,MAAM,GAAG,KAAK,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,aACrC,CAAC,KAAK,KAAK,CAAC;;;;;;AAO1C,SAAgB,sBAAsB,QAAgC;CACpE,MAAM,kBAAkB;EACtB,IAAI,OAAO,SAAS,QAAQ;GAC1B,MAAM,YAA8C,OAAO,iBAAiB,SACxE,OAAO,gBAAgB,KAAK,MAAM,EAAE,MAAM,IACzC,OAAO,cAAc,EAAE,EAAE,QAAQ,MAAsC,MAAM,KAAK;GAEvF,IAAI,UAAU,SAAS,KAAK,UAAU,OAAO,MAAM,OAAO,MAAM,SAAS,EACvE,OAAO,WAAW,UAAU,KAAK,MAAM,KAAK,UAAU,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC;GAEvE,IAAI,UAAU,SAAS,GAAG;IACxB,MAAM,WAAW,UAAU,KAAK,MAAM,aAAa,KAAK,UAAU,EAAE,CAAC,GAAG;IACxE,OAAO,SAAS,WAAW,IAAI,SAAS,KAAM,YAAY,SAAS,KAAK,KAAK,CAAC;;GAEhF,OAAO;;EAET,IAAI,OAAO,SAAS,WAAW,OAAO;EACtC,IAAI,OAAO,SAAS,UAAU,OAAO;EACrC,IAAI,OAAO,SAAS,WAAW,OAAO;EACtC,IAAI,OAAO,SAAS,SAAS,OAAO;EACpC,OAAO;KACL;CAEJ,OAAO,OAAO,WAAW,GAAG,SAAS,eAAe;;;;ACWtD,MAAM,cAAc,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAErD,SAAgB,OAAO,EAAE,MAAM,YAAY,eAAe,cAAc,cAAoC;CAC1G,OACE,qBAAC,KAAK,QAAN;EAAmB;EAAM,cAAA;EAAa,aAAA;YAAtC;GACE,oBAAC,OAAD;IAAO,MAAM;IAAU,QAAA;cACpB;;WAEE,WAAW;cACR,cAAc;;;IAGd,CAAA;GAEP,WACE,KAAK,EAAE,MAAM,KAAK,KAAK,WAAW;IACjC,MAAM,EAAE,MAAM,eAAe,uBAAuB,MAAM,EAAE,cAAc,CAAC;IAE3E,MAAM,cAAqD,EAAE;IAC7D,MAAM,eAAsD,EAAE;IAE9D,KAAK,MAAM,KAAK,YAAY;KAC1B,MAAM,WAAW,IAAI,WAAW,MAAM,OAAO,GAAG,SAAS,EAAE,KAAK;KAChE,YAAY,KAAK;MAAE,KAAK,EAAE;MAAM,OAAO,WAAW,SAAS,aAAa,sBAAsB,EAAE,OAAO;MAAE,CAAC;;IAG5G,IAAI,IAAI,aACN,aAAa,KAAK;KAAE,KAAK;KAAQ,OAAO,IAAI;KAAa,CAAC;IAG5D,IAAI,IAAI,aACN,aAAa,KAAK;KAAE,KAAK;KAAU,OAAO,aAAa,IAAI,YAAY;KAAE,CAAC;IAG5E,IAAI,IAAI,cACN,aAAa,KAAK;KAAE,KAAK;KAAW,OAAO,aAAa,IAAI,aAAa;KAAE,CAAC;IAG9E,aAAa,MAAM,GAAG,MAAM,EAAE,IAAI,cAAc,EAAE,IAAI,CAAC;IACvD,MAAM,UAAU,CAAC,GAAG,aAAa,GAAG,aAAa;IAEjD,MAAM,aAAa,QAAQ,SACvB,IAAI,yBAAyB,EAC3B,QAAQ,CACN,IAAI,qBAAqB,EACvB,YAAY,QAAQ,KAAK,MAAM,IAAI,wBAAwB;KAAE,MAAM,EAAE;KAAK,UAAU;KAAO,CAAC,CAAC,EAC9F,CAAC,CACH,EACF,CAAC,GACF,KAAA;IAEJ,MAAM,eAAe,aAAc,YAAY,MAAM,WAAW,IAAI,KAAM;IAC1E,MAAM,cAAc,QAAQ,SAAS,KAAK,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,CAAC,KAAK,KAAK,CAAC,MAAM,KAAA;IACtG,MAAM,eAAe,IAAI;IAEzB,MAAM,SAAS;KACb,KAAK,QAAQ,UAAU,KAAK,UAAU,KAAK,MAAM,KAAK;KACtD,gBAAgB,KAAK,UAAU,KAAK,YAAY;KAChD,eAAe,yBAAyB,aAAa,MAAM;KAC5D,CACE,OAAO,QAAQ,CACf,KAAK,QAAQ;IAEhB,IAAI,aACF,OAAO;sBACG,KAAK,UAAU,KAAK,KAAK,CAAC;IAC5C,OAAO;iBACM,YAAY;YACjB,aAAa;WACd,IAAI,KAAK,GAAG,aAAa;;;IAK1B,OAAO;sBACK,KAAK,UAAU,KAAK,KAAK,CAAC;IAC5C,OAAO;;WAEA,IAAI,KAAK;;;KAGV,CACD,OAAO,QAAQ;GAElB,oBAAC,UAAD;IAAU,MAAK;IAAc,OAAA;IAAM,QAAA;cAChC;;;;;;;;IAQQ,CAAA;GACC;;;;;AC/IlB,MAAa,eAAe,gBAA2B;CACrD,MAAM;CACN,UAAU;CACV,UAAU,MAAM,KAAK;EACnB,MAAM,EAAE,UAAU,QAAQ,SAAS;EACnC,MAAM,EAAE,QAAQ,QAAQ,cAAc,UAAU,IAAI;EAEpD,MAAM,WAAW,OAAO,UAAU,aAAa;EAE/C,IAAI,CAAC,UACH,OAAO;EAGT,MAAM,aAAa,OAAO,YAAY,aAAa;EAEnD,MAAM,oBAAoB,0BAA0B,MAAM,YAAY;GAAE;GAAc,qBAAqB;GAAS,CAAC;EAErH,MAAM,OAAO;GACX,MAAM,SAAS,mBAAmB,KAAK;GACvC,MAAM,SAAS,YAAY;IAAE,MAAM,KAAK;IAAa,SAAS;IAAO,KAAK,KAAK,KAAK,MAAM;IAAW,MAAM,KAAK;IAAM,EAAE;IAAE;IAAM;IAAQ;IAAO,CAAC;GAChJ,QAAQ,WAAW,YACjB;IAAE,MAAM,KAAK;IAAa,SAAS;IAAO,KAAK,KAAK,KAAK,MAAM;IAAW,MAAM,KAAK;IAAM,EAC3F;IACE;IACA,QAAQ,SAAS,SAAS,UAAU;IACpC,OAAO,SAAS,SAAS;IAC1B,CACF;GACF;EAED,OACE,qBAAC,MAAD;GAAM,UAAU,KAAK,KAAK;GAAU,MAAM,KAAK,KAAK;GAAM,MAAM,KAAK,KAAK;aAA1E;IACG,KAAK,UAAU,kBAAkB,SAAS,KACzC,oBAAC,KAAK,QAAN;KAAa,MAAM,MAAM,KAAK,IAAI,IAAI,kBAAkB,CAAC,CAAC,MAAM;KAAE,MAAM,KAAK,KAAK;KAAM,MAAM,KAAK,OAAO;KAAM,YAAA;KAAa,CAAA;IAE/H,oBAAC,KAAK,QAAN;KAAa,MAAM;MAAC;MAAkB;MAAsB;MAAgB;KAAE,MAAM;KAAmC,YAAA;KAAa,CAAA;IACpI,oBAAC,KAAK,QAAN;KAAa,MAAM,CAAC,sBAAsB;KAAE,MAAM;KAA6C,YAAA;KAAa,CAAA;IAC5G,oBAAC,KAAK,QAAN;KAAa,MAAM,CAAC,gBAAgB;KAAE,MAAM,KAAK,KAAK;KAAM,MAAM,KAAK,QAAQ,MAAM,kBAAkB;KAAI,CAAA;IAC1G,OAAO,aACN,qBAAA,UAAA,EAAA,UAAA;KACE,oBAAC,KAAK,QAAN;MAAa,MAAM;OAAC;OAAU;OAAiB;OAAsB;MAAE,MAAM,OAAO;MAAY,YAAA;MAAa,CAAA;KAC7G,oBAAC,KAAK,QAAN;MAAa,MAAM;MAAS,MAAM,OAAO;MAAc,CAAA;KACtD,OAAO,mBAAmB,UAAU,oBAAC,KAAK,QAAN;MAAa,MAAM,CAAC,iBAAiB;MAAE,MAAM,OAAO;MAAY,YAAA;MAAa,CAAA;KACjH,EAAA,CAAA,GAEH,qBAAA,UAAA,EAAA,UAAA;KACE,oBAAC,KAAK,QAAN;MACE,MAAM;OAAC;OAAU;OAAiB;OAAsB;MACxD,MAAM,KAAK,KAAK;MAChB,MAAM,KAAK,QAAQ,MAAM,iBAAiB;MAC1C,YAAA;MACA,CAAA;KACF,oBAAC,KAAK,QAAN;MAAa,MAAM,CAAC,QAAQ;MAAE,MAAM,KAAK,KAAK;MAAM,MAAM,KAAK,QAAQ,MAAM,iBAAiB;MAAI,CAAA;KACjG,OAAO,mBAAmB,UACzB,oBAAC,KAAK,QAAN;MAAa,MAAM,CAAC,iBAAiB;MAAE,MAAM,KAAK,KAAK;MAAM,MAAM,KAAK,QAAQ,MAAM,iBAAiB;MAAE,YAAA;MAAa,CAAA;KAEvH,EAAA,CAAA;IAGL,oBAAC,YAAD;KACE,MAAM,KAAK;KACL;KACN,UAAU;KACV,SAAS,OAAO;KAChB,gBAAgB,OAAO,kBAAkB;KAC3B;KACd,CAAA;IACG;;;CAGZ,CAAC;;;;;;;;;;AC/DF,MAAa,kBAAkB,gBAA2B;CACxD,MAAM;CACN,UAAU;CACV,WAAW,OAAO,KAAK;EACrB,MAAM,EAAE,QAAQ,UAAU,QAAQ,QAAQ,SAAS;EACnD,MAAM,EAAE,QAAQ,cAAc,UAAU,IAAI;EAE5C,MAAM,YAAY,OAAO,UAAU,cAAc;EAEjD,IAAI,CAAC,WACH;EAGF,MAAM,cAAc,OAAO,YAAY,cAAc;EAErD,MAAM,OAAO;EAEb,MAAM,aAAa;GACjB,UAAU;GACV,MAHqB,KAAK,QAAQ,MAAM,OAAO,MAAM,YAGjC;GACpB,MAAM,EAAE,YAAY,OAAO,MAAM;GAClC;EAGD,MAAM,WAAW;GACf,UAAU;GACV,MAHmB,KAAK,QAAQ,MAAM,OAAO,MAAM,YAGjC;GAClB,MAAM,EAAE,YAAY,OAAO,MAAM;GAClC;EAED,MAAM,mBAAmB,MAAM,KAAK,SAAS;GAC3C,MAAM,EAAE,MAAM,YAAY,OAAO,aAAa,QAAQ,iBAAiB,uBAAuB,MAAM,EAAE,cAAc,CAAC;GAErH,MAAM,UAAU,SAAS,YAAY;IAAE,MAAM,KAAK;IAAa,SAAS;IAAO,KAAK,KAAK,KAAK,MAAM;IAAW,MAAM,KAAK;IAAM,EAAE;IAAE;IAAM;IAAQ;IAAO,CAAC;GAE1J,MAAM,UAAU,YAAY,YAC1B;IAAE,MAAM,KAAK;IAAa,SAAS;IAAO,KAAK,KAAK,KAAK,MAAM;IAAW,MAAM,KAAK;IAAM,EAC3F;IACE;IACA,QAAQ,UAAU,SAAS,UAAU;IACrC,OAAO,UAAU,SAAS;IAC3B,CACF;GAED,MAAM,cAAc,KAAK,aAAa,UAAU,IAAI,SAAS,YAAY,gBAAgB,KAAK,GAAG,KAAA;GACjG,MAAM,gBAAgB,sBAAsB,KAAK,UAAU;GAC3D,MAAM,eAAe,gBAAgB,YAAY,0BAA0B,MAAM,cAAc,GAAG,KAAA;GAElG,MAAM,iBAAiB,WAA8B,OAAO,KAAK,OAAO;IAAE,MAAM,EAAE;IAAM,YAAY,YAAY,iBAAiB,MAAM,EAAE;IAAE,EAAE;GAE7I,OAAO;IACL,MAAM;KACJ,MAAM,KAAK;KACX,OAAO,KAAK,WAAW,KAAA;KACvB,aAAa,KAAK,eAAe,UAAU,KAAK,OAAO,aAAa,CAAC,cAAc,KAAK;KACzF;IACD,KAAK;KACH,MAAM,SAAS,mBAAmB,KAAK;KACvC,MAAM;KACP;IACD,KAAK;KACH,YAAY,cAAc,WAAW;KACrC,aAAa,YAAY,SAAS,cAAc,YAAY,GAAG,KAAA;KAC/D,cAAc,aAAa,SAAS,cAAc,aAAa,GAAG,KAAA;KAClE;KACA;KACA,MAAM;KACP;IACK;IACP;IACD;EAEF,MAAM,UAAU,iBAAiB,SAAS,EAAE,KAAK,UAAU;GACzD,MAAM,WAAW;IACf,GAAG,IAAI,WAAW,KAAK,MAAM,EAAE,WAAW;IAC1C,IAAI,IAAI,eAAe,EAAE,EAAE,KAAK,MAAM,EAAE,WAAW;IACnD,IAAI,IAAI,gBAAgB,EAAE,EAAE,KAAK,MAAM,EAAE,WAAW;IACpD,IAAI;IACJ,IAAI;IACL,CAAC,QAAQ,SAAyB,QAAQ,KAAK,CAAC;GAEjD,MAAM,cAAc,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,CAAC,MAAM;GAEjD,OAAO,CACL,oBAAC,KAAK,QAAN;IAA4B,MAAM,CAAC,IAAI,KAAK;IAAE,MAAM,WAAW;IAAM,MAAM,IAAI,KAAK;IAAQ,EAA1E,IAAI,KAAsE,EAC5F,YAAY,SAAS,KAAK,oBAAC,KAAK,QAAN;IAAqC,MAAM;IAAa,MAAM,WAAW;IAAM,MAAM,IAAI,KAAK;IAAQ,EAApF,OAAO,IAAI,OAAyE,CACjI,CAAC,OAAO,QAAQ;IACjB;EAEF,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,qBAAC,MAAD;GACE,UAAU,WAAW;GACrB,MAAM,WAAW;GACjB,MAAM,WAAW;GACjB,QAAQ,SAAS,cAAc,IAAI,MAAM;IAAE;IAAQ;IAAQ,CAAC;GAC5D,QAAQ,SAAS,cAAc,IAAI,MAAM;IAAE;IAAQ;IAAQ,CAAC;aAL9D;IAOE,oBAAC,KAAK,QAAN;KAAa,MAAM,CAAC,YAAY;KAAE,MAAM;KAA0C,CAAA;IAClF,oBAAC,KAAK,QAAN;KAAa,MAAM,CAAC,IAAI;KAAE,MAAM;KAAS,CAAA;IACzC,oBAAC,KAAK,QAAN;KAAa,MAAM,CAAC,uBAAuB;KAAE,MAAM;KAA4C,CAAA;IAE9F;IACD,oBAAC,QAAD;KACQ;KACN,YAAY,IAAI,KAAK,SAAS;KAC9B,eAAe,IAAI,KAAK,WAAW;KACrB;KACd,YAAY;KACZ,CAAA;IACG;MAEP,oBAAC,MAAD;GAAM,UAAU,SAAS;GAAU,MAAM,SAAS;GAAM,MAAM,SAAS;aACrE,oBAAC,KAAK,QAAN;IAAmB;cAChB;;;iBAGI,IAAI,KAAK,SAAS,SAAS;;;mCAGT,KAAK,SAAS,KAAK,QAAQ,SAAS,KAAK,EAAE,WAAW,KAAK,CAAC;;;;;IAKvE,CAAA;GACT,CAAA,CACN,EAAA,CAAA;;CAGR,CAAC;;;;;;;;;;;ACrIF,MAAa,cAAc,sBAAiC;CAC1D,MAAM;CACN,YAAY;CACZ,QAAQ,MAAM,MAAM;EAClB,IAAI,SAAS,QACX,OAAO,UAAU,MAAM,EAAE,QAAQ,MAAM,CAAC;EAE1C,OAAO,UAAU,MAAM,EAAE,QAAQ,WAAW,CAAC;;CAE/C,YAAY,MAAM;EAChB,OAAO,KAAK,QAAQ,MAAM,WAAW;;CAEvC,gBAAgB,MAAM,MAAM;EAC1B,OAAO,KAAK,QAAQ,MAAM,KAAK;;CAEjC,mBAAmB,MAAM;EACvB,OAAO,KAAK,YAAY,KAAK,YAAY;;CAE5C,EAAE;;;ACfH,MAAa,gBAAgB;AAE7B,MAAa,YAAY,cAAyB,YAAY;CAC5D,MAAM,EACJ,SAAS;EAAE,MAAM;EAAO,YAAY;EAAS,EAC7C,OACA,UAAU,EAAE,EACZ,SACA,WAAW,EAAE,EACb,cACA,QACA,UAAU,cACV,aAAa,iBACb,YAAY,iBAAiB,EAAE,KAC7B;CAEJ,MAAM,aAAa,QAAQ,UAAU;CACrC,MAAM,mBAAmB,QAAQ,eAAe,CAAC,QAAQ,SAAS,+BAA+B,eAAe,KAAA;CAEhH,MAAM,cAAc,QACf;EACC,GAAG;EACH,MAAM,MAAM,OACR,MAAM,QACL,QAA2B;GAC1B,IAAI,MAAM,SAAS,QACjB,OAAO,GAAG,IAAI,MAAM,MAAM,IAAI,CAAC;GAEjC,OAAO,GAAG,UAAU,IAAI,MAAM,CAAC;;EAEtC,GACD,KAAA;CAEJ,OAAO;EACL,MAAM;EACN;EACA,cAAc,CAAC,cAAc,cAAc;EAC3C,OAAO,EACL,oBAAoB,KAAK;GACvB,MAAM,WAAW,eAAe;IAAE,GAAG;IAAa,GAAG;IAAc,GAAG;GAEtE,IAAI,WAAW;IACb;IACA;IACA;IACA;IACA,OAAO;IACP;IACA,QAAQ;KACN,QAAQ;KACR,YAAY,QAAQ,cAAc;KAClC,YAAY;KACZ,gBAAgB,QAAQ,kBAAkB;KAC1C,QAAQ,QAAQ;KAChB,SAAS,QAAQ;KACjB,cAAc,QAAQ;KACvB;IACD;IACD,CAAC;GACF,IAAI,YAAY,SAAS;GACzB,IAAI,iBACF,IAAI,eAAe,gBAAgB;GAErC,IAAI,aAAa,aAAa;GAC9B,IAAI,aAAa,gBAAgB;GACjC,KAAK,MAAM,OAAO,gBAChB,IAAI,aAAa,IAAI;GAGvB,MAAM,OAAO,KAAK,QAAQ,IAAI,OAAO,MAAM,IAAI,OAAO,OAAO,KAAK;GAClE,MAAM,kBAAkB,IAAI,OAAO,SAAS,MAAM,MAAM,EAAE,SAAS,iBAAiB;GAEpF,IAAI,QAAQ,UAAU,CAAC,mBAAmB,CAAC,kBACzC,IAAI,WAAW;IACb,UAAU;IACV,MAAM,KAAK,QAAQ,MAAM,iBAAiB;IAC1C,SAAS,CACP,IAAI,aAAa;KACf,MAAM;KACN,OAAO,CAAC,IAAI,WAAW,eAAe,UAAUC,WAAoBC,OAAkB,CAAC;KACvF,cAAc;KACd,aAAa;KACd,CAAC,CACH;IACF,CAAC;GAGJ,IAAI,CAAC,iBACH,IAAI,WAAW;IACb,UAAU;IACV,MAAM,KAAK,QAAQ,MAAM,kBAAkB;IAC3C,SAAS,CACP,IAAI,aAAa;KACf,MAAM;KACN,OAAO,CAAC,IAAI,WAAWC,SAAa,CAAC;KACrC,cAAc;KACd,aAAa;KACd,CAAC,CACH;IACF,CAAC;KAGP;EACF;EACD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kubb/plugin-mcp",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.22",
|
|
4
4
|
"description": "Generate Model Context Protocol (MCP) tool definitions from your OpenAPI specification. Expose your REST APIs as AI-callable tools for LLMs, Claude, ChatGPT, and other AI assistants.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -47,18 +47,18 @@
|
|
|
47
47
|
"registry": "https://registry.npmjs.org/"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@kubb/core": "5.0.0-beta.
|
|
51
|
-
"@kubb/renderer-jsx": "5.0.0-beta.
|
|
52
|
-
"@kubb/plugin-client": "5.0.0-beta.
|
|
53
|
-
"@kubb/plugin-ts": "5.0.0-beta.
|
|
54
|
-
"@kubb/plugin-zod": "5.0.0-beta.
|
|
50
|
+
"@kubb/core": "5.0.0-beta.22",
|
|
51
|
+
"@kubb/renderer-jsx": "5.0.0-beta.22",
|
|
52
|
+
"@kubb/plugin-client": "5.0.0-beta.22",
|
|
53
|
+
"@kubb/plugin-ts": "5.0.0-beta.22",
|
|
54
|
+
"@kubb/plugin-zod": "5.0.0-beta.22"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@internals/shared": "0.0.0",
|
|
58
58
|
"@internals/utils": "0.0.0"
|
|
59
59
|
},
|
|
60
60
|
"peerDependencies": {
|
|
61
|
-
"@kubb/renderer-jsx": "5.0.0-beta.
|
|
61
|
+
"@kubb/renderer-jsx": "5.0.0-beta.22"
|
|
62
62
|
},
|
|
63
63
|
"size-limit": [
|
|
64
64
|
{
|
|
@@ -17,7 +17,7 @@ export const serverGenerator = defineGenerator<PluginMcp>({
|
|
|
17
17
|
name: 'operations',
|
|
18
18
|
renderer: jsxRendererSync,
|
|
19
19
|
operations(nodes, ctx) {
|
|
20
|
-
const { config, resolver, plugin, driver, root
|
|
20
|
+
const { config, resolver, plugin, driver, root } = ctx
|
|
21
21
|
const { output, paramsCasing, group } = ctx.options
|
|
22
22
|
|
|
23
23
|
const pluginZod = driver.getPlugin(pluginZodName)
|
|
@@ -108,8 +108,8 @@ export const serverGenerator = defineGenerator<PluginMcp>({
|
|
|
108
108
|
baseName={serverFile.baseName}
|
|
109
109
|
path={serverFile.path}
|
|
110
110
|
meta={serverFile.meta}
|
|
111
|
-
banner={resolver.resolveBanner(
|
|
112
|
-
footer={resolver.resolveFooter(
|
|
111
|
+
banner={resolver.resolveBanner(ctx.meta, { output, config })}
|
|
112
|
+
footer={resolver.resolveFooter(ctx.meta, { output, config })}
|
|
113
113
|
>
|
|
114
114
|
<File.Import name={['McpServer']} path={'@modelcontextprotocol/sdk/server/mcp'} />
|
|
115
115
|
<File.Import name={['z']} path={'zod'} />
|
|
@@ -118,8 +118,8 @@ export const serverGenerator = defineGenerator<PluginMcp>({
|
|
|
118
118
|
{imports}
|
|
119
119
|
<Server
|
|
120
120
|
name={name}
|
|
121
|
-
serverName={
|
|
122
|
-
serverVersion={
|
|
121
|
+
serverName={ctx.meta.title ?? 'server'}
|
|
122
|
+
serverVersion={ctx.meta.version ?? '0.0.0'}
|
|
123
123
|
paramsCasing={paramsCasing}
|
|
124
124
|
operations={operationsMapped}
|
|
125
125
|
/>
|
|
@@ -130,7 +130,7 @@ export const serverGenerator = defineGenerator<PluginMcp>({
|
|
|
130
130
|
{`
|
|
131
131
|
{
|
|
132
132
|
"mcpServers": {
|
|
133
|
-
"${
|
|
133
|
+
"${ctx.meta.title || 'server'}": {
|
|
134
134
|
"type": "stdio",
|
|
135
135
|
"command": "npx",
|
|
136
136
|
"args": ["tsx", "${path.relative(path.dirname(jsonFile.path), serverFile.path)}"]
|
package/src/utils.ts
CHANGED
|
@@ -22,43 +22,27 @@ export function zodGroupExpr(entry: string | Array<ZodParam>): string {
|
|
|
22
22
|
* Used as fallback when no named zod schema is available for a path parameter.
|
|
23
23
|
*/
|
|
24
24
|
export function zodExprFromSchemaNode(schema: ast.SchemaNode): string {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
case 'enum': {
|
|
28
|
-
// namedEnumValues takes priority over enumValues
|
|
25
|
+
const baseExpr = (() => {
|
|
26
|
+
if (schema.type === 'enum') {
|
|
29
27
|
const rawValues: Array<string | number | boolean> = schema.namedEnumValues?.length
|
|
30
28
|
? schema.namedEnumValues.map((v) => v.value)
|
|
31
29
|
: (schema.enumValues ?? []).filter((v): v is string | number | boolean => v !== null)
|
|
32
30
|
|
|
33
31
|
if (rawValues.length > 0 && rawValues.every((v) => typeof v === 'string')) {
|
|
34
|
-
|
|
35
|
-
}
|
|
32
|
+
return `z.enum([${rawValues.map((v) => JSON.stringify(v)).join(', ')}])`
|
|
33
|
+
}
|
|
34
|
+
if (rawValues.length > 0) {
|
|
36
35
|
const literals = rawValues.map((v) => `z.literal(${JSON.stringify(v)})`)
|
|
37
|
-
|
|
38
|
-
} else {
|
|
39
|
-
expr = 'z.string()'
|
|
36
|
+
return literals.length === 1 ? literals[0]! : `z.union([${literals.join(', ')}])`
|
|
40
37
|
}
|
|
41
|
-
|
|
38
|
+
return 'z.string()'
|
|
42
39
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
case 'boolean':
|
|
50
|
-
expr = 'z.boolean()'
|
|
51
|
-
break
|
|
52
|
-
case 'array':
|
|
53
|
-
expr = 'z.array(z.unknown())'
|
|
54
|
-
break
|
|
55
|
-
default:
|
|
56
|
-
expr = 'z.string()'
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (schema.nullable) {
|
|
60
|
-
expr = `${expr}.nullable()`
|
|
61
|
-
}
|
|
40
|
+
if (schema.type === 'integer') return 'z.coerce.number()'
|
|
41
|
+
if (schema.type === 'number') return 'z.number()'
|
|
42
|
+
if (schema.type === 'boolean') return 'z.boolean()'
|
|
43
|
+
if (schema.type === 'array') return 'z.array(z.unknown())'
|
|
44
|
+
return 'z.string()'
|
|
45
|
+
})()
|
|
62
46
|
|
|
63
|
-
return
|
|
47
|
+
return schema.nullable ? `${baseExpr}.nullable()` : baseExpr
|
|
64
48
|
}
|