openapi-mcp-codegen 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/parser/index.ts","../src/parser/refs.ts","../src/mapper/index.ts","../src/generator/index.ts","../src/generator/templates.ts"],"sourcesContent":["export { parseSpec } from \"./parser/index.js\";\nexport { mapToMcpTools } from \"./mapper/index.js\";\nexport { generate } from \"./generator/index.js\";\nexport type {\n\tMcpToolDefinition,\n\tGenerateOptions,\n\tOpenApiSpec,\n\tMapperOptions,\n\tAuthMode,\n\tPaginationConfig,\n\tPaginationHint,\n} from \"./types.js\";\n","import { readFileSync } from \"node:fs\";\nimport { extname } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { OpenApiSpec } from \"../types.js\";\nimport { resolveRefs } from \"./refs.js\";\n\nexport async function parseSpec(input: string): Promise<OpenApiSpec> {\n\tconst raw = await loadRaw(input);\n\tconst spec = deserialize(raw, input);\n\n\tvalidateSpec(spec);\n\n\treturn resolveRefs(spec);\n}\n\nasync function loadRaw(input: string): Promise<string> {\n\tif (input.startsWith(\"http://\") || input.startsWith(\"https://\")) {\n\t\tconst res = await fetch(input);\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(`Failed to fetch spec from ${input}: ${res.status} ${res.statusText}`);\n\t\t}\n\t\treturn res.text();\n\t}\n\treturn readFileSync(input, \"utf-8\");\n}\n\nfunction deserialize(raw: string, source: string): OpenApiSpec {\n\tconst ext = extname(source).toLowerCase();\n\tif (ext === \".json\") {\n\t\treturn JSON.parse(raw);\n\t}\n\t// Default to YAML for .yaml, .yml, or URLs\n\treturn parseYaml(raw) as OpenApiSpec;\n}\n\nfunction validateSpec(spec: unknown): asserts spec is OpenApiSpec {\n\tconst s = spec as Record<string, unknown>;\n\tif (!s.openapi || typeof s.openapi !== \"string\") {\n\t\tthrow new Error(\"Invalid spec: missing 'openapi' version field\");\n\t}\n\tif (!s.openapi.startsWith(\"3.\")) {\n\t\tthrow new Error(`Unsupported OpenAPI version: ${s.openapi}. Only 3.x is supported.`);\n\t}\n\tif (!s.paths || typeof s.paths !== \"object\") {\n\t\tthrow new Error(\"Invalid spec: missing 'paths' object\");\n\t}\n\tif (!s.info || typeof s.info !== \"object\") {\n\t\tthrow new Error(\"Invalid spec: missing 'info' object\");\n\t}\n}\n","import type { OpenApiSpec } from \"../types.js\";\n\n/**\n * Inline all $ref pointers in the spec. MCP clients (especially Claude Code,\n * Bedrock) don't handle $ref well, so we resolve everything upfront.\n *\n * Handles:\n * - any local JSON pointer (#/components/schemas/Foo, #/components/parameters/Bar, ...)\n * - nested refs (refs inside resolved targets are resolved recursively)\n * - circular refs (replaced with a placeholder to avoid infinite expansion)\n */\nexport function resolveRefs(spec: OpenApiSpec): OpenApiSpec {\n\tconst root = JSON.parse(JSON.stringify(spec)) as Record<string, unknown>;\n\tconst MAX_DEPTH = 64;\n\t// Memoized resolutions. Without this, specs with heavily shared schemas\n\t// (e.g. Stripe: ~500 interconnected components) explode exponentially,\n\t// since every reference site would re-inline the whole subtree.\n\tconst cache = new Map<string, unknown>();\n\n\tfunction lookup(ref: string): unknown {\n\t\tif (!ref.startsWith(\"#/\")) return null;\n\t\tconst parts = ref\n\t\t\t.slice(2)\n\t\t\t.split(\"/\")\n\t\t\t.map((p) => p.replace(/~1/g, \"/\").replace(/~0/g, \"~\"));\n\t\tlet cur: unknown = root;\n\t\tfor (const p of parts) {\n\t\t\tif (cur === null || typeof cur !== \"object\") return null;\n\t\t\tcur = (cur as Record<string, unknown>)[p];\n\t\t}\n\t\treturn cur ?? null;\n\t}\n\n\tfunction resolve(node: unknown, stack: readonly string[], depth: number): unknown {\n\t\tif (node === null || typeof node !== \"object\") return node;\n\t\tif (depth > MAX_DEPTH) {\n\t\t\treturn Array.isArray(node) ? [] : {};\n\t\t}\n\t\tif (Array.isArray(node)) {\n\t\t\treturn node.map((n) => resolve(n, stack, depth + 1));\n\t\t}\n\t\tconst obj = node as Record<string, unknown>;\n\t\tif (typeof obj.$ref === \"string\") {\n\t\t\tconst ref = obj.$ref;\n\t\t\tif (stack.includes(ref)) {\n\t\t\t\t// Circular reference: truncate with a permissive placeholder.\n\t\t\t\treturn { type: \"object\", description: \"(circular reference truncated)\" };\n\t\t\t}\n\t\t\tif (cache.has(ref)) return cache.get(ref);\n\t\t\tconst target = lookup(ref);\n\t\t\tif (target === null || target === undefined) {\n\t\t\t\t// External or unresolvable ref: strip $ref, keep siblings.\n\t\t\t\tconst { $ref: _discard, ...rest } = obj;\n\t\t\t\treturn resolve(rest, stack, depth + 1);\n\t\t\t}\n\t\t\t// Depth resets per component so each is resolved consistently;\n\t\t\t// total nesting stays bounded by cycle detection + memoization.\n\t\t\tconst resolved = resolve(target, [...stack, ref], 0);\n\t\t\tcache.set(ref, resolved);\n\t\t\treturn resolved;\n\t\t}\n\t\tconst out: Record<string, unknown> = {};\n\t\tfor (const [k, v] of Object.entries(obj)) {\n\t\t\tout[k] = resolve(v, stack, depth + 1);\n\t\t}\n\t\treturn out;\n\t}\n\n\treturn resolve(root, [], 0) as OpenApiSpec;\n}\n","import type {\n\tOpenApiSpec,\n\tOperation,\n\tParameter,\n\tMcpToolDefinition,\n\tMapperOptions,\n\tJsonSchema,\n\tSecurityScheme,\n\tPaginationConfig,\n} from \"../types.js\";\n\nconst HTTP_METHODS = [\"get\", \"post\", \"put\", \"patch\", \"delete\"] as const;\n\nexport function mapToMcpTools(spec: OpenApiSpec, options: MapperOptions = {}): McpToolDefinition[] {\n\tconst tools: McpToolDefinition[] = [];\n\tconst detectPagination = options.detectPagination ?? true;\n\tconst usedNames = new Set<string>();\n\n\tfor (const [path, pathItem] of Object.entries(spec.paths)) {\n\t\tfor (const method of HTTP_METHODS) {\n\t\t\tconst operation = pathItem[method];\n\t\t\tif (!operation) continue;\n\t\t\tif (operation[\"x-mcp-exclude\"]) continue;\n\n\t\t\tif (options.excludeTags?.length && operation.tags?.some((t) => options.excludeTags!.includes(t))) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (options.includeTags?.length && !operation.tags?.some((t) => options.includeTags!.includes(t))) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst tool = mapOperation(spec, path, method, operation, pathItem.parameters, detectPagination);\n\t\t\tif (tool) {\n\t\t\t\tif (options.excludeOperations?.includes(tool.name)) continue;\n\t\t\t\ttool.name = uniqueName(tool.name, usedNames);\n\t\t\t\tusedNames.add(tool.name);\n\t\t\t\ttools.push(tool);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn tools;\n}\n\n/** MCP tool names must match ^[a-zA-Z0-9_-]{1,64}$ and be unique per server. */\nfunction uniqueName(name: string, used: Set<string>): string {\n\tlet base = name.slice(0, 60);\n\tif (!used.has(base)) return base;\n\tlet i = 2;\n\twhile (used.has(`${base}_${i}`)) i++;\n\treturn `${base}_${i}`;\n}\n\nfunction mapOperation(\n\tspec: OpenApiSpec,\n\tpath: string,\n\tmethod: string,\n\top: Operation,\n\tpathParams?: Parameter[],\n\tdetectPagination?: boolean,\n): McpToolDefinition | null {\n\tconst name = op[\"x-mcp-name\"] ?? op.operationId ?? generateToolName(method, path);\n\tconst description =\n\t\top[\"x-mcp-description\"] ?? op.summary ?? op.description ?? `${method.toUpperCase()} ${path}`;\n\n\tconst allParams = mergeParams(pathParams, op.parameters);\n\tconst { schema: inputSchema, queryParams, bodyParams, bodyMode, bodyContentType } = buildInputSchema(op, allParams);\n\tconst auth = resolveAuth(spec, op);\n\tconst pagination = detectPagination ? detectPaginationConfig(op, allParams) : null;\n\tconst streaming = isStreamingResponse(op);\n\tconst responseHint = buildResponseHint(op);\n\n\t// If pagination is detected, add cursor and limit to the input schema\n\tif (pagination) {\n\t\tinputSchema.properties = inputSchema.properties ?? {};\n\t\tinputSchema.properties.cursor = {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Opaque pagination cursor. Omit for first page.\",\n\t\t};\n\t\tinputSchema.properties.limit = {\n\t\t\ttype: \"integer\",\n\t\t\tdescription: `Maximum items per page (default: ${pagination.defaultLimit})`,\n\t\t};\n\t\t// Remove original pagination params (offset/page/limit) since we abstract them\n\t\tif (pagination.offsetParam) delete inputSchema.properties[pagination.offsetParam];\n\t\tif (pagination.pageParam) delete inputSchema.properties[pagination.pageParam];\n\t\tif (pagination.limitParam && pagination.limitParam !== \"limit\") {\n\t\t\tdelete inputSchema.properties[pagination.limitParam];\n\t\t}\n\t\t// Remove from required too\n\t\tif (inputSchema.required) {\n\t\t\tinputSchema.required = inputSchema.required.filter(\n\t\t\t\t(r) => r !== pagination.offsetParam && r !== pagination.pageParam,\n\t\t\t);\n\t\t\tif (inputSchema.required.length === 0) inputSchema.required = undefined;\n\t\t}\n\t}\n\n\t// queryParams must reflect the final schema (pagination may remove params)\n\tconst finalQueryParams = queryParams.filter(\n\t\t(q) =>\n\t\t\t!pagination ||\n\t\t\t(q !== pagination.offsetParam && q !== pagination.pageParam && q !== pagination.limitParam && q !== pagination.cursorParam),\n\t);\n\n\tlet fullDescription = pagination ? `${description} (paginated)` : description;\n\tif (responseHint) fullDescription += responseHint;\n\n\treturn {\n\t\tname: sanitizeName(name),\n\t\tdescription: fullDescription,\n\t\tinputSchema,\n\t\tmeta: {\n\t\t\tmethod: method.toUpperCase(),\n\t\t\tpath,\n\t\t\ttags: op.tags ?? [],\n\t\t\tauth,\n\t\t\tpagination,\n\t\t\tstreaming,\n\t\t\tqueryParams: finalQueryParams,\n\t\t\tbodyParams,\n\t\t\tbodyMode,\n\t\t\tbodyContentType,\n\t\t},\n\t};\n}\n\n/** Compact summary of the success response shape so the LLM knows what to expect. */\nfunction buildResponseHint(op: Operation): string | null {\n\tconst resp = op.responses?.[\"200\"] ?? op.responses?.[\"201\"];\n\tconst schema = resp?.content?.[\"application/json\"]?.schema;\n\tif (!schema) return null;\n\n\tlet fields: string[] = [];\n\tlet prefix = \"Returns\";\n\tif (schema.type === \"array\") {\n\t\tprefix = \"Returns array of\";\n\t\tif (schema.items?.properties) fields = Object.keys(schema.items.properties);\n\t} else if (schema.properties) {\n\t\tfields = Object.keys(schema.properties);\n\t}\n\tif (fields.length === 0) return null;\n\n\tconst shown = fields.slice(0, 12);\n\tconst suffix = fields.length > shown.length ? \", ...\" : \"\";\n\treturn ` ${prefix}: { ${shown.join(\", \")}${suffix} }`;\n}\n\nfunction mergeParams(pathParams?: Parameter[], opParams?: Parameter[]): Parameter[] {\n\tconst allParams = [...(pathParams ?? []), ...(opParams ?? [])];\n\tconst seen = new Set<string>();\n\tconst result: Parameter[] = [];\n\t// Reverse so operation-level wins over path-level\n\tfor (const p of allParams.reverse()) {\n\t\tconst key = `${p.in}:${p.name}`;\n\t\tif (!seen.has(key)) {\n\t\t\tseen.add(key);\n\t\t\tresult.push(p);\n\t\t}\n\t}\n\treturn result;\n}\n\ninterface BuiltInput {\n\tschema: JsonSchema;\n\tqueryParams: string[];\n\tbodyParams: Array<[string, string]>;\n\tbodyMode: \"none\" | \"fields\" | \"whole\";\n\tbodyContentType: \"json\" | \"form\";\n}\n\nfunction buildInputSchema(op: Operation, params: Parameter[]): BuiltInput {\n\tconst properties: Record<string, JsonSchema> = {};\n\tconst required: string[] = [];\n\tconst queryParams: string[] = [];\n\tconst bodyParams: Array<[string, string]> = [];\n\tlet bodyMode: \"none\" | \"fields\" | \"whole\" = \"none\";\n\n\tfor (const param of params) {\n\t\tif (param.in === \"header\" || param.in === \"cookie\") continue;\n\t\tproperties[param.name] = {\n\t\t\t...param.schema,\n\t\t\tdescription: param.description ?? param.schema?.description,\n\t\t};\n\t\tif (param.in === \"query\") queryParams.push(param.name);\n\t\tif (param.required) {\n\t\t\trequired.push(param.name);\n\t\t}\n\t}\n\n\t// JSON preferred; fall back to form-encoded (Stripe-style APIs use it exclusively)\n\tconst content = op.requestBody?.content;\n\tconst bodySchema = content?.[\"application/json\"]?.schema ?? content?.[\"application/x-www-form-urlencoded\"]?.schema;\n\tconst bodyContentType: \"json\" | \"form\" =\n\t\t!content?.[\"application/json\"] && content?.[\"application/x-www-form-urlencoded\"] ? \"form\" : \"json\";\n\tif (bodySchema) {\n\t\tif (bodySchema.type === \"object\" && bodySchema.properties) {\n\t\t\tbodyMode = \"fields\";\n\t\t\tfor (const [key, val] of Object.entries(bodySchema.properties)) {\n\t\t\t\t// Avoid collision with path/query params of the same name\n\t\t\t\tlet propKey = key;\n\t\t\t\tif (propKey in properties) propKey = `body_${key}`;\n\t\t\t\tproperties[propKey] = val;\n\t\t\t\tbodyParams.push([propKey, key]);\n\t\t\t\tif (bodySchema.required?.includes(key)) {\n\t\t\t\t\trequired.push(propKey);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tbodyMode = \"whole\";\n\t\t\tlet bodyKey = \"body\";\n\t\t\tif (bodyKey in properties) bodyKey = \"request_body\";\n\t\t\tproperties[bodyKey] = {\n\t\t\t\t...bodySchema,\n\t\t\t\tdescription: op.requestBody?.description ?? bodySchema.description,\n\t\t\t};\n\t\t\tbodyParams.push([bodyKey, \"*\"]);\n\t\t\tif (op.requestBody?.required) {\n\t\t\t\trequired.push(bodyKey);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tschema: {\n\t\t\ttype: \"object\",\n\t\t\tproperties,\n\t\t\trequired: required.length > 0 ? required : undefined,\n\t\t},\n\t\tqueryParams,\n\t\tbodyParams,\n\t\tbodyMode,\n\t\tbodyContentType,\n\t};\n}\n\nfunction detectPaginationConfig(op: Operation, params: Parameter[]): PaginationConfig | null {\n\t// Check for explicit x-mcp-pagination hint\n\tconst hint = op[\"x-mcp-pagination\"];\n\tif (hint) {\n\t\treturn {\n\t\t\ttype: hint.type,\n\t\t\tlimitParam: hint.limitParam ?? \"limit\",\n\t\t\toffsetParam: hint.offsetParam,\n\t\t\tpageParam: hint.pageParam,\n\t\t\tcursorParam: hint.cursorParam,\n\t\t\tcursorPath: hint.cursorPath ?? \"next_cursor\",\n\t\t\ttotalPath: hint.totalPath ?? \"total\",\n\t\t\titemsPath: hint.itemsPath ?? \"items\",\n\t\t\tdefaultLimit: 20,\n\t\t};\n\t}\n\n\t// Auto-detect from parameter names (only for GET operations)\n\tconst paramNames = params.map((p) => p.name.toLowerCase());\n\n\tconst hasLimit = paramNames.some((n) => n === \"limit\" || n === \"per_page\" || n === \"page_size\" || n === \"pagesize\");\n\tif (!hasLimit) return null;\n\n\tconst limitParam = params.find((p) => {\n\t\tconst n = p.name.toLowerCase();\n\t\treturn n === \"limit\" || n === \"per_page\" || n === \"page_size\" || n === \"pagesize\";\n\t})!;\n\n\t// Cursor-based pagination\n\tconst cursorParam = params.find((p) => {\n\t\tconst n = p.name.toLowerCase();\n\t\treturn n === \"cursor\" || n === \"after\" || n === \"next_token\" || n === \"page_token\" || n === \"starting_after\";\n\t});\n\tif (cursorParam) {\n\t\treturn {\n\t\t\ttype: \"cursor\",\n\t\t\tlimitParam: limitParam.name,\n\t\t\tcursorParam: cursorParam.name,\n\t\t\tcursorPath: \"next_cursor\",\n\t\t\ttotalPath: \"total\",\n\t\t\titemsPath: \"items\",\n\t\t\tdefaultLimit: 20,\n\t\t};\n\t}\n\n\t// Offset-based pagination\n\tconst offsetParam = params.find((p) => {\n\t\tconst n = p.name.toLowerCase();\n\t\treturn n === \"offset\" || n === \"skip\";\n\t});\n\tif (offsetParam) {\n\t\treturn {\n\t\t\ttype: \"offset\",\n\t\t\tlimitParam: limitParam.name,\n\t\t\toffsetParam: offsetParam.name,\n\t\t\tcursorPath: \"next_cursor\",\n\t\t\ttotalPath: \"total\",\n\t\t\titemsPath: \"items\",\n\t\t\tdefaultLimit: 20,\n\t\t};\n\t}\n\n\t// Page-based pagination\n\tconst pageParam = params.find((p) => {\n\t\tconst n = p.name.toLowerCase();\n\t\treturn n === \"page\" || n === \"page_number\" || n === \"pagenumber\";\n\t});\n\tif (pageParam) {\n\t\treturn {\n\t\t\ttype: \"page\",\n\t\t\tlimitParam: limitParam.name,\n\t\t\tpageParam: pageParam.name,\n\t\t\tcursorPath: \"next_cursor\",\n\t\t\ttotalPath: \"total\",\n\t\t\titemsPath: \"items\",\n\t\t\tdefaultLimit: 20,\n\t\t};\n\t}\n\n\treturn null;\n}\n\nfunction isStreamingResponse(op: Operation): boolean {\n\tif (!op.responses) return false;\n\tconst successResponse = op.responses[\"200\"] ?? op.responses[\"201\"];\n\tif (!successResponse?.content) return false;\n\treturn (\n\t\t\"text/event-stream\" in successResponse.content ||\n\t\t\"application/x-ndjson\" in successResponse.content ||\n\t\t\"application/stream+json\" in successResponse.content\n\t);\n}\n\nfunction resolveAuth(spec: OpenApiSpec, op: Operation): SecurityScheme | null {\n\tconst securityReqs = op.security ?? spec.security ?? [];\n\tif (securityReqs.length === 0) return null;\n\n\tconst schemeName = Object.keys(securityReqs[0])[0];\n\tif (!schemeName) return null;\n\n\treturn spec.components?.securitySchemes?.[schemeName] ?? null;\n}\n\nfunction generateToolName(method: string, path: string): string {\n\tconst segments = path\n\t\t.split(\"/\")\n\t\t.filter(Boolean)\n\t\t.map((s) => {\n\t\t\tif (s.startsWith(\"{\") && s.endsWith(\"}\")) {\n\t\t\t\treturn `by_${s.slice(1, -1)}`;\n\t\t\t}\n\t\t\treturn s;\n\t\t});\n\treturn `${method}_${segments.join(\"_\")}`;\n}\n\nfunction sanitizeName(name: string): string {\n\treturn name.replace(/[^a-zA-Z0-9_]/g, \"_\").replace(/_+/g, \"_\");\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { GenerateOptions } from \"../types.js\";\nimport { renderServerCode } from \"./templates.js\";\n\nexport async function generate(opts: GenerateOptions): Promise<void> {\n\tmkdirSync(opts.outputDir, { recursive: true });\n\tmkdirSync(join(opts.outputDir, \"src\"), { recursive: true });\n\n\twriteFileSync(join(opts.outputDir, \"src\", \"server.ts\"), renderServerCode(opts));\n\n\twriteFileSync(\n\t\tjoin(opts.outputDir, \"package.json\"),\n\t\tJSON.stringify(\n\t\t\t{\n\t\t\t\tname: slugify(opts.serverName),\n\t\t\t\tversion: \"0.1.0\",\n\t\t\t\ttype: \"module\",\n\t\t\t\tscripts: {\n\t\t\t\t\tbuild: \"tsc\",\n\t\t\t\t\tstart: \"node dist/server.js\",\n\t\t\t\t},\n\t\t\t\tdependencies: {\n\t\t\t\t\t\"@modelcontextprotocol/sdk\": \"^1.29.0\",\n\t\t\t\t\tzod: \"^3.23.0\",\n\t\t\t\t},\n\t\t\t\tdevDependencies: {\n\t\t\t\t\ttypescript: \"^5.7.0\",\n\t\t\t\t\t\"@types/node\": \"^22.0.0\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tnull,\n\t\t\t2,\n\t\t),\n\t);\n\n\twriteFileSync(\n\t\tjoin(opts.outputDir, \"tsconfig.json\"),\n\t\tJSON.stringify(\n\t\t\t{\n\t\t\t\tcompilerOptions: {\n\t\t\t\t\ttarget: \"ES2022\",\n\t\t\t\t\tmodule: \"Node16\",\n\t\t\t\t\tmoduleResolution: \"Node16\",\n\t\t\t\t\toutDir: \"dist\",\n\t\t\t\t\trootDir: \"src\",\n\t\t\t\t\tstrict: true,\n\t\t\t\t\tesModuleInterop: true,\n\t\t\t\t\tskipLibCheck: true,\n\t\t\t\t\tdeclaration: true,\n\t\t\t\t},\n\t\t\t\tinclude: [\"src/**/*\"],\n\t\t\t},\n\t\t\tnull,\n\t\t\t2,\n\t\t),\n\t);\n\n\twriteFileSync(\n\t\tjoin(opts.outputDir, \".env.example\"),\n\t\tgenerateEnvExample(opts),\n\t);\n}\n\nfunction slugify(name: string): string {\n\treturn name\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-|-$/g, \"\");\n}\n\nfunction generateEnvExample(opts: GenerateOptions): string {\n\tconst lines = [\"# Generated by openapi-to-mcp\", \"\"];\n\tconst server = opts.spec.servers?.[0];\n\tlines.push(`API_BASE_URL=${server?.url ?? \"https://api.example.com\"}`);\n\n\tif (opts.auth === \"api-key\") {\n\t\tlines.push(\"API_KEY=your-api-key-here\");\n\t} else if (opts.auth === \"bearer\") {\n\t\tlines.push(\"API_TOKEN=your-bearer-token-here\");\n\t} else if (opts.auth === \"oauth2\") {\n\t\tlines.push(\"OAUTH_CLIENT_ID=\");\n\t\tlines.push(\"OAUTH_CLIENT_SECRET=\");\n\t\tlines.push(\"OAUTH_TOKEN_URL=\");\n\t} else if (opts.auth === \"oauth2-auth-code\") {\n\t\tlines.push(\"OAUTH_CLIENT_ID=\");\n\t\tlines.push(\"OAUTH_CLIENT_SECRET=\");\n\t\tlines.push(\"OAUTH_AUTH_URL=\");\n\t\tlines.push(\"OAUTH_TOKEN_URL=\");\n\t\tlines.push(\"OAUTH_SCOPES=\");\n\t\tlines.push(\"OAUTH_REDIRECT_PORT=8976\");\n\t}\n\n\treturn lines.join(\"\\n\") + \"\\n\";\n}\n","import type { GenerateOptions, JsonSchema, McpToolDefinition, AuthMode } from \"../types.js\";\n\nexport function renderServerCode(opts: GenerateOptions): string {\n\tconst imports = buildImports(opts);\n\tconst toolRegistrations = opts.tools.map((t) => renderToolHandler(t, opts.auth)).join(\"\\n\\n\");\n\tconst serverSetup = buildServerSetup(opts);\n\n\treturn `${imports}\n\nconst server = new McpServer({\n\tname: ${JSON.stringify(opts.serverName)},\n\tversion: \"0.1.0\",\n});\n\nconst API_BASE_URL = process.env.API_BASE_URL ?? ${JSON.stringify(opts.spec.servers?.[0]?.url ?? \"\")};\n\n${renderAuthHelper(opts)}\n\n${renderPaginationHelper(opts)}\n\n${renderRequestHelpers(opts)}\n\n${toolRegistrations}\n\n${serverSetup}\n`;\n}\n\nfunction buildServerSetup(opts: GenerateOptions): string {\n\tif (opts.transport === \"stdio\") {\n\t\treturn `async function main() {\n\tconst transport = new StdioServerTransport();\n\tawait server.connect(transport);\n}\n\nmain().catch(console.error);`;\n\t}\n\t// Streamable HTTP\n\treturn `const PORT = parseInt(process.env.PORT ?? \"3000\", 10);\n\nasync function main() {\n\tconst transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n\tawait server.connect(transport);\n\n\tconst httpServer = createServer(async (req, res) => {\n\t\tconst url = new URL(req.url ?? \"/\", \\`http://\\${req.headers.host}\\`);\n\t\tif (url.pathname === \"/mcp\") {\n\t\t\ttry {\n\t\t\t\tawait transport.handleRequest(req, res);\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\"Error handling MCP request:\", err);\n\t\t\t\tif (!res.headersSent) {\n\t\t\t\t\tres.writeHead(500, { \"Content-Type\": \"application/json\" });\n\t\t\t\t\tres.end(JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32603, message: \"Internal server error\" }, id: null }));\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tres.writeHead(404);\n\t\t\tres.end(\"Not found\");\n\t\t}\n\t});\n\n\thttpServer.listen(PORT, () => {\n\t\tconsole.log(\\`MCP server listening on http://localhost:\\${PORT}/mcp\\`);\n\t});\n}\n\nmain().catch(console.error);`;\n}\n\nfunction buildImports(opts: GenerateOptions): string {\n\tconst lines = [\n\t\t`import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";`,\n\t];\n\n\tif (opts.transport === \"stdio\") {\n\t\tlines.push(\n\t\t\t`import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";`,\n\t\t);\n\t} else {\n\t\tlines.push(\n\t\t\t`import { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";`,\n\t\t\t`import { createServer } from \"node:http\";`,\n\t\t);\n\t}\n\n\tlines.push(`import { z } from \"zod\";`);\n\n\tif (opts.auth === \"oauth2-auth-code\") {\n\t\tlines.push(\n\t\t\t`import { createServer as createHttpServer } from \"node:http\";`,\n\t\t\t`import { randomBytes, createHash } from \"node:crypto\";`,\n\t\t);\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nfunction renderAuthHelper(opts: GenerateOptions): string {\n\tif (opts.auth === \"none\") {\n\t\treturn `function authHeaders(): Record<string, string> {\n\treturn {};\n}`;\n\t}\n\tif (opts.auth === \"api-key\") {\n\t\tconst apiKeyScheme = Object.values(opts.spec.components?.securitySchemes ?? {})\n\t\t\t.find((s) => s.type === \"apiKey\");\n\t\tconst headerName = apiKeyScheme?.name ?? \"X-API-Key\";\n\t\treturn `function authHeaders(): Record<string, string> {\n\tconst key = process.env.API_KEY;\n\tif (!key) throw new Error(\"API_KEY environment variable is required\");\n\treturn { ${JSON.stringify(headerName)}: key };\n}`;\n\t}\n\tif (opts.auth === \"bearer\") {\n\t\treturn `function authHeaders(): Record<string, string> {\n\tconst token = process.env.API_TOKEN;\n\tif (!token) throw new Error(\"API_TOKEN environment variable is required\");\n\treturn { \"Authorization\": \\`Bearer \\${token}\\` };\n}`;\n\t}\n\tif (opts.auth === \"oauth2-auth-code\") {\n\t\treturn renderOAuth2AuthCodeHelper(opts);\n\t}\n\t// oauth2 (client credentials)\n\treturn renderOAuth2CCHelper();\n}\n\nfunction renderOAuth2CCHelper(): string {\n\treturn `let cachedToken: { token: string; expiresAt: number } | null = null;\n\nasync function getOAuthToken(): Promise<string> {\n\tif (cachedToken && Date.now() < cachedToken.expiresAt) {\n\t\treturn cachedToken.token;\n\t}\n\tconst tokenUrl = process.env.OAUTH_TOKEN_URL;\n\tconst clientId = process.env.OAUTH_CLIENT_ID;\n\tconst clientSecret = process.env.OAUTH_CLIENT_SECRET;\n\tif (!tokenUrl || !clientId || !clientSecret) {\n\t\tthrow new Error(\"OAUTH_TOKEN_URL, OAUTH_CLIENT_ID, and OAUTH_CLIENT_SECRET are required\");\n\t}\n\tconst res = await fetch(tokenUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\tbody: new URLSearchParams({\n\t\t\tgrant_type: \"client_credentials\",\n\t\t\tclient_id: clientId,\n\t\t\tclient_secret: clientSecret,\n\t\t}),\n\t});\n\tif (!res.ok) throw new Error(\\`OAuth token request failed: \\${res.status}\\`);\n\tconst data = await res.json() as { access_token: string; expires_in?: number };\n\tcachedToken = {\n\t\ttoken: data.access_token,\n\t\texpiresAt: Date.now() + ((data.expires_in ?? 3600) - 60) * 1000,\n\t};\n\treturn cachedToken.token;\n}\n\nasync function authHeaders(): Promise<Record<string, string>> {\n\tconst token = await getOAuthToken();\n\treturn { \"Authorization\": \\`Bearer \\${token}\\` };\n}`;\n}\n\nfunction renderOAuth2AuthCodeHelper(opts: GenerateOptions): string {\n\t// Extract OAuth2 flow details from spec\n\tconst oauthScheme = Object.values(opts.spec.components?.securitySchemes ?? {})\n\t\t.find((s) => s.type === \"oauth2\");\n\tconst flow = oauthScheme?.flows?.authorizationCode;\n\tconst defaultAuthUrl = flow?.authorizationUrl ?? \"\";\n\tconst defaultTokenUrl = flow?.tokenUrl ?? \"\";\n\tconst defaultScopes = Object.keys(flow?.scopes ?? {}).join(\" \");\n\n\treturn `interface TokenStore {\n\taccessToken: string;\n\trefreshToken?: string;\n\texpiresAt: number;\n}\n\nlet tokenStore: TokenStore | null = null;\n\nconst OAUTH_AUTH_URL = process.env.OAUTH_AUTH_URL ?? ${JSON.stringify(defaultAuthUrl)};\nconst OAUTH_TOKEN_URL = process.env.OAUTH_TOKEN_URL ?? ${JSON.stringify(defaultTokenUrl)};\nconst OAUTH_CLIENT_ID = process.env.OAUTH_CLIENT_ID ?? \"\";\nconst OAUTH_CLIENT_SECRET = process.env.OAUTH_CLIENT_SECRET ?? \"\";\nconst OAUTH_REDIRECT_PORT = parseInt(process.env.OAUTH_REDIRECT_PORT ?? \"8976\", 10);\nconst OAUTH_REDIRECT_URI = \\`http://localhost:\\${OAUTH_REDIRECT_PORT}/callback\\`;\nconst OAUTH_SCOPES = process.env.OAUTH_SCOPES ?? ${JSON.stringify(defaultScopes)};\n\nfunction generatePKCE(): { verifier: string; challenge: string } {\n\tconst verifier = randomBytes(32).toString(\"base64url\");\n\tconst challenge = createHash(\"sha256\").update(verifier).digest(\"base64url\");\n\treturn { verifier, challenge };\n}\n\nasync function refreshAccessToken(): Promise<string> {\n\tif (!tokenStore?.refreshToken) throw new Error(\"No refresh token available\");\n\tconst res = await fetch(OAUTH_TOKEN_URL, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\tbody: new URLSearchParams({\n\t\t\tgrant_type: \"refresh_token\",\n\t\t\trefresh_token: tokenStore.refreshToken,\n\t\t\tclient_id: OAUTH_CLIENT_ID,\n\t\t\t...(OAUTH_CLIENT_SECRET ? { client_secret: OAUTH_CLIENT_SECRET } : {}),\n\t\t}),\n\t});\n\tif (!res.ok) {\n\t\ttokenStore = null;\n\t\tthrow new Error(\\`Token refresh failed: \\${res.status}\\`);\n\t}\n\tconst data = await res.json() as {\n\t\taccess_token: string;\n\t\trefresh_token?: string;\n\t\texpires_in?: number;\n\t};\n\ttokenStore = {\n\t\taccessToken: data.access_token,\n\t\trefreshToken: data.refresh_token ?? tokenStore.refreshToken,\n\t\texpiresAt: Date.now() + ((data.expires_in ?? 3600) - 60) * 1000,\n\t};\n\treturn tokenStore.accessToken;\n}\n\nasync function authorizeInteractive(): Promise<string> {\n\tif (!OAUTH_CLIENT_ID) throw new Error(\"OAUTH_CLIENT_ID is required\");\n\tif (!OAUTH_AUTH_URL || !OAUTH_TOKEN_URL) {\n\t\tthrow new Error(\"OAUTH_AUTH_URL and OAUTH_TOKEN_URL are required\");\n\t}\n\n\tconst { verifier, challenge } = generatePKCE();\n\tconst state = randomBytes(16).toString(\"hex\");\n\n\tconst authUrl = new URL(OAUTH_AUTH_URL);\n\tauthUrl.searchParams.set(\"response_type\", \"code\");\n\tauthUrl.searchParams.set(\"client_id\", OAUTH_CLIENT_ID);\n\tauthUrl.searchParams.set(\"redirect_uri\", OAUTH_REDIRECT_URI);\n\tauthUrl.searchParams.set(\"state\", state);\n\tauthUrl.searchParams.set(\"code_challenge\", challenge);\n\tauthUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n\tif (OAUTH_SCOPES) authUrl.searchParams.set(\"scope\", OAUTH_SCOPES);\n\n\tconsole.error(\\`\\\\nOpen this URL to authorize:\\\\n\\${authUrl.toString()}\\\\n\\`);\n\n\tconst code = await new Promise<string>((resolve, reject) => {\n\t\tconst srv = createHttpServer((req, res) => {\n\t\t\tconst url = new URL(req.url ?? \"/\", \\`http://localhost:\\${OAUTH_REDIRECT_PORT}\\`);\n\t\t\tif (url.pathname !== \"/callback\") {\n\t\t\t\tres.writeHead(404);\n\t\t\t\tres.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst receivedState = url.searchParams.get(\"state\");\n\t\t\tconst receivedCode = url.searchParams.get(\"code\");\n\t\t\tconst error = url.searchParams.get(\"error\");\n\n\t\t\tif (error) {\n\t\t\t\tres.writeHead(400);\n\t\t\t\tres.end(\\`Authorization error: \\${error}\\`);\n\t\t\t\tsrv.close();\n\t\t\t\treject(new Error(\\`OAuth error: \\${error}\\`));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (receivedState !== state || !receivedCode) {\n\t\t\t\tres.writeHead(400);\n\t\t\t\tres.end(\"Invalid callback\");\n\t\t\t\tsrv.close();\n\t\t\t\treject(new Error(\"Invalid OAuth callback\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tres.writeHead(200, { \"Content-Type\": \"text/html\" });\n\t\t\tres.end(\"<h1>Authorization successful!</h1><p>You can close this tab.</p>\");\n\t\t\tsrv.close();\n\t\t\tresolve(receivedCode);\n\t\t});\n\n\t\tsrv.listen(OAUTH_REDIRECT_PORT, () => {\n\t\t\tconsole.error(\\`Waiting for OAuth callback on port \\${OAUTH_REDIRECT_PORT}...\\`);\n\t\t});\n\n\t\tsetTimeout(() => {\n\t\t\tsrv.close();\n\t\t\treject(new Error(\"OAuth callback timed out after 120 seconds\"));\n\t\t}, 120_000);\n\t});\n\n\tconst tokenRes = await fetch(OAUTH_TOKEN_URL, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\tbody: new URLSearchParams({\n\t\t\tgrant_type: \"authorization_code\",\n\t\t\tcode,\n\t\t\tredirect_uri: OAUTH_REDIRECT_URI,\n\t\t\tclient_id: OAUTH_CLIENT_ID,\n\t\t\tcode_verifier: verifier,\n\t\t\t...(OAUTH_CLIENT_SECRET ? { client_secret: OAUTH_CLIENT_SECRET } : {}),\n\t\t}),\n\t});\n\tif (!tokenRes.ok) throw new Error(\\`Token exchange failed: \\${tokenRes.status}\\`);\n\n\tconst tokenData = await tokenRes.json() as {\n\t\taccess_token: string;\n\t\trefresh_token?: string;\n\t\texpires_in?: number;\n\t};\n\ttokenStore = {\n\t\taccessToken: tokenData.access_token,\n\t\trefreshToken: tokenData.refresh_token,\n\t\texpiresAt: Date.now() + ((tokenData.expires_in ?? 3600) - 60) * 1000,\n\t};\n\treturn tokenStore.accessToken;\n}\n\nasync function authHeaders(): Promise<Record<string, string>> {\n\tif (tokenStore && Date.now() < tokenStore.expiresAt) {\n\t\treturn { \"Authorization\": \\`Bearer \\${tokenStore.accessToken}\\` };\n\t}\n\tif (tokenStore?.refreshToken) {\n\t\ttry {\n\t\t\tconst token = await refreshAccessToken();\n\t\t\treturn { \"Authorization\": \\`Bearer \\${token}\\` };\n\t\t} catch {\n\t\t\t// Refresh failed, re-authorize\n\t\t}\n\t}\n\tconst token = await authorizeInteractive();\n\treturn { \"Authorization\": \\`Bearer \\${token}\\` };\n}`;\n}\n\nfunction renderPaginationHelper(opts: GenerateOptions): string {\n\tconst hasPaginated = opts.tools.some((t) => t.meta.pagination);\n\tif (!hasPaginated) return \"\";\n\n\treturn `// Pagination cursor encoding/decoding\nfunction encodeCursor(data: Record<string, unknown>): string {\n\treturn Buffer.from(JSON.stringify(data)).toString(\"base64url\");\n}\n\nfunction decodeCursor(cursor: string): Record<string, unknown> {\n\ttry {\n\t\treturn JSON.parse(Buffer.from(cursor, \"base64url\").toString(\"utf-8\"));\n\t} catch {\n\t\tthrow new Error(\"Invalid pagination cursor\");\n\t}\n}`;\n}\n\nfunction renderToolHandler(tool: McpToolDefinition, authMode: AuthMode): string {\n\tif (tool.meta.pagination) {\n\t\treturn renderPaginatedToolHandler(tool, authMode);\n\t}\n\tif (tool.meta.streaming) {\n\t\treturn renderStreamingToolHandler(tool, authMode);\n\t}\n\treturn renderSimpleToolHandler(tool, authMode);\n}\n\nfunction renderSimpleToolHandler(tool: McpToolDefinition, authMode: AuthMode): string {\n\tconst zodSchema = jsonSchemaToZod(tool.inputSchema);\n\tconst authCall = isAsyncAuth(authMode) ? \"await authHeaders()\" : \"authHeaders()\";\n\tconst pathInterpolation = interpolatePath(tool.meta.path);\n\tconst query = tool.meta.queryParams.length\n\t\t? ` + buildQuery(p, ${JSON.stringify(tool.meta.queryParams)})`\n\t\t: \"\";\n\tconst hasBody = tool.meta.bodyMode !== \"none\" && tool.meta.method !== \"GET\";\n\tconst isForm = tool.meta.bodyContentType === \"form\";\n\tconst pickCall = `pickBody(p, ${JSON.stringify(tool.meta.bodyParams)})`;\n\tconst bodyLine = hasBody\n\t\t? `\\n\\t\\t\\tbody: ${isForm ? `formEncode(${pickCall}).toString()` : `JSON.stringify(${pickCall})`},`\n\t\t: \"\";\n\tconst contentType = hasBody && isForm ? \"application/x-www-form-urlencoded\" : \"application/json\";\n\n\treturn `server.tool(\n\t${JSON.stringify(tool.name)},\n\t${JSON.stringify(tool.description)},\n\t${zodSchema},\n\tasync (params) => {\n\t\tconst p: Record<string, unknown> = params;\n\t\tconst url = \\`\\${API_BASE_URL}${pathInterpolation}\\`${query};\n\t\tconst headers: Record<string, string> = { ...${authCall}, \"Content-Type\": ${JSON.stringify(contentType)} };\n\t\tconst res = await fetch(url, {\n\t\t\tmethod: ${JSON.stringify(tool.meta.method)},\n\t\t\theaders,${bodyLine}\n\t\t});\n\t\tconst data = await res.text();\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\" as const, text: data }],\n\t\t};\n\t},\n);`;\n}\n\nfunction renderPaginatedToolHandler(tool: McpToolDefinition, authMode: AuthMode): string {\n\tconst zodSchema = jsonSchemaToZod(tool.inputSchema);\n\tconst authCall = isAsyncAuth(authMode) ? \"await authHeaders()\" : \"authHeaders()\";\n\tconst pg = tool.meta.pagination!;\n\tconst pathInterpolation = interpolatePath(tool.meta.path);\n\tconst passThrough = JSON.stringify(tool.meta.queryParams);\n\n\t// Build the pagination param injection based on type\n\tlet paginationLogic: string;\n\tif (pg.type === \"offset\") {\n\t\tpaginationLogic = `\\t\\t// Decode cursor to get offset, or start from 0\n\t\tconst pageLimit = typeof p.limit === \"number\" ? p.limit : ${pg.defaultLimit};\n\t\tlet offset = 0;\n\t\tif (typeof p.cursor === \"string\") {\n\t\t\tconst decoded = decodeCursor(p.cursor);\n\t\t\toffset = (decoded.offset as number) ?? 0;\n\t\t}\n\t\tconst queryParams: Record<string, string> = {};\n\t\tfor (const k of ${passThrough}) {\n\t\t\tconst v = p[k];\n\t\t\tif (v !== undefined && v !== null) queryParams[k] = String(v);\n\t\t}\n\t\tqueryParams[${JSON.stringify(pg.limitParam)}] = String(pageLimit);\n\t\tqueryParams[${JSON.stringify(pg.offsetParam!)}] = String(offset);\n\t\tconst qs = new URLSearchParams(queryParams).toString();\n\t\tconst url = \\`\\${API_BASE_URL}${pathInterpolation}\\` + (qs ? \"?\" + qs : \"\");`;\n\t} else if (pg.type === \"page\") {\n\t\tpaginationLogic = `\\t\\t// Decode cursor to get page number, or start from 1\n\t\tconst pageLimit = typeof p.limit === \"number\" ? p.limit : ${pg.defaultLimit};\n\t\tlet page = 1;\n\t\tif (typeof p.cursor === \"string\") {\n\t\t\tconst decoded = decodeCursor(p.cursor);\n\t\t\tpage = (decoded.page as number) ?? 1;\n\t\t}\n\t\tconst queryParams: Record<string, string> = {};\n\t\tfor (const k of ${passThrough}) {\n\t\t\tconst v = p[k];\n\t\t\tif (v !== undefined && v !== null) queryParams[k] = String(v);\n\t\t}\n\t\tqueryParams[${JSON.stringify(pg.limitParam)}] = String(pageLimit);\n\t\tqueryParams[${JSON.stringify(pg.pageParam!)}] = String(page);\n\t\tconst qs = new URLSearchParams(queryParams).toString();\n\t\tconst url = \\`\\${API_BASE_URL}${pathInterpolation}\\` + (qs ? \"?\" + qs : \"\");`;\n\t} else {\n\t\t// cursor type: pass cursor directly\n\t\tpaginationLogic = `\\t\\tconst pageLimit = typeof p.limit === \"number\" ? p.limit : ${pg.defaultLimit};\n\t\tconst queryParams: Record<string, string> = {};\n\t\tfor (const k of ${passThrough}) {\n\t\t\tconst v = p[k];\n\t\t\tif (v !== undefined && v !== null) queryParams[k] = String(v);\n\t\t}\n\t\tqueryParams[${JSON.stringify(pg.limitParam)}] = String(pageLimit);\n\t\tif (typeof p.cursor === \"string\") {\n\t\t\tconst decoded = decodeCursor(p.cursor);\n\t\t\tqueryParams[${JSON.stringify(pg.cursorParam ?? \"cursor\")}] = decoded.cursor as string;\n\t\t}\n\t\tconst qs = new URLSearchParams(queryParams).toString();\n\t\tconst url = \\`\\${API_BASE_URL}${pathInterpolation}\\` + (qs ? \"?\" + qs : \"\");`;\n\t}\n\n\t// Build response wrapping logic\n\tlet nextCursorLogic: string;\n\tif (pg.type === \"offset\") {\n\t\tnextCursorLogic = `\\t\\tconst nextOffset = offset + pageLimit;\n\t\tconst total = parsed?.${pg.totalPath} as number | undefined;\n\t\tconst hasMore = total !== undefined ? nextOffset < total : items.length >= pageLimit;\n\t\tconst nextCursor = hasMore ? encodeCursor({ offset: nextOffset }) : null;`;\n\t} else if (pg.type === \"page\") {\n\t\tnextCursorLogic = `\\t\\tconst total = parsed?.${pg.totalPath} as number | undefined;\n\t\tconst totalPages = total !== undefined ? Math.ceil(total / pageLimit) : undefined;\n\t\tconst hasMore = totalPages !== undefined ? page < totalPages : items.length >= pageLimit;\n\t\tconst nextCursor = hasMore ? encodeCursor({ page: page + 1 }) : null;`;\n\t} else {\n\t\tnextCursorLogic = `\\t\\tconst apiCursor = parsed?.${pg.cursorPath} as string | undefined;\n\t\tconst hasMore = !!apiCursor;\n\t\tconst nextCursor = hasMore ? encodeCursor({ cursor: apiCursor }) : null;`;\n\t}\n\n\treturn `server.tool(\n\t${JSON.stringify(tool.name)},\n\t${JSON.stringify(tool.description)},\n\t${zodSchema},\n\tasync (params) => {\n\t\tconst p: Record<string, unknown> = params;\n${paginationLogic}\n\t\tconst headers: Record<string, string> = { ...${authCall}, \"Content-Type\": \"application/json\" };\n\t\tconst res = await fetch(url, { method: \"GET\", headers });\n\t\tconst data = await res.text();\n\t\tlet parsed: Record<string, unknown> | null = null;\n\t\ttry { parsed = JSON.parse(data); } catch {}\n\t\tconst items = (parsed && Array.isArray(parsed.${pg.itemsPath}) ? parsed.${pg.itemsPath} : parsed) as unknown[];\n${nextCursorLogic}\n\t\tconst result = {\n\t\t\titems,\n\t\t\thas_more: hasMore,\n\t\t\t...(nextCursor ? { next_cursor: nextCursor } : {}),\n\t\t\t...(parsed?.${pg.totalPath} !== undefined ? { total: parsed.${pg.totalPath} } : {}),\n\t\t};\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\" as const, text: JSON.stringify(result, null, 2) }],\n\t\t};\n\t},\n);`;\n}\n\nfunction renderStreamingToolHandler(tool: McpToolDefinition, authMode: AuthMode): string {\n\tconst zodSchema = jsonSchemaToZod(tool.inputSchema);\n\tconst authCall = isAsyncAuth(authMode) ? \"await authHeaders()\" : \"authHeaders()\";\n\tconst pathInterpolation = interpolatePath(tool.meta.path);\n\tconst query = tool.meta.queryParams.length\n\t\t? ` + buildQuery(p, ${JSON.stringify(tool.meta.queryParams)})`\n\t\t: \"\";\n\n\treturn `server.tool(\n\t${JSON.stringify(tool.name)},\n\t${JSON.stringify(tool.description + \" (streaming)\")},\n\t${zodSchema},\n\tasync (params) => {\n\t\tconst p: Record<string, unknown> = params;\n\t\tconst url = \\`\\${API_BASE_URL}${pathInterpolation}\\`${query};\n\t\tconst headers: Record<string, string> = { ...${authCall}, \"Accept\": \"text/event-stream\" };\n\t\tconst res = await fetch(url, { method: ${JSON.stringify(tool.meta.method)}, headers });\n\t\tif (!res.body) {\n\t\t\treturn { content: [{ type: \"text\" as const, text: \"No response body\" }] };\n\t\t}\n\t\tconst reader = res.body.getReader();\n\t\tconst decoder = new TextDecoder();\n\t\tconst chunks: string[] = [];\n\t\twhile (true) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) break;\n\t\t\tchunks.push(decoder.decode(value, { stream: true }));\n\t\t}\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\" as const, text: chunks.join(\"\") }],\n\t\t};\n\t},\n);`;\n}\n\nfunction isAsyncAuth(authMode: AuthMode): boolean {\n\treturn authMode === \"oauth2\" || authMode === \"oauth2-auth-code\";\n}\n\n/** Interpolate OpenAPI path template into a JS template literal using params. */\nfunction interpolatePath(path: string): string {\n\treturn path.replace(\n\t\t/\\{([^}]+)\\}/g,\n\t\t(_m, name: string) => `\\${encodeURIComponent(String(p[${JSON.stringify(name)}] ?? \"\"))}`,\n\t);\n}\n\n/** Runtime helpers shared by all generated handlers; rendered once per server. */\nfunction renderRequestHelpers(opts: GenerateOptions): string {\n\tconst needsBody = opts.tools.some((t) => t.meta.bodyMode !== \"none\");\n\tconst needsQuery = opts.tools.some((t) => t.meta.queryParams.length > 0 && !t.meta.pagination);\n\n\tconst parts: string[] = [];\n\tif (needsQuery) {\n\t\tparts.push(`function buildQuery(params: Record<string, unknown>, keys: string[]): string {\n\tconst entries: Array<[string, string]> = [];\n\tfor (const k of keys) {\n\t\tconst v = params[k];\n\t\tif (v === undefined || v === null) continue;\n\t\tentries.push([k, String(v)]);\n\t}\n\treturn entries.length ? \"?\" + new URLSearchParams(entries).toString() : \"\";\n}`);\n\t}\n\tif (needsBody) {\n\t\tparts.push(`function pickBody(params: Record<string, unknown>, pairs: string[][]): unknown {\n\tif (pairs.length === 1 && pairs[0][1] === \"*\") return params[pairs[0][0]];\n\tconst out: Record<string, unknown> = {};\n\tfor (const [propKey, fieldKey] of pairs) {\n\t\tif (params[propKey] !== undefined) out[fieldKey] = params[propKey];\n\t}\n\treturn out;\n}`);\n\t}\n\tconst needsForm = opts.tools.some(\n\t\t(t) => t.meta.bodyMode !== \"none\" && t.meta.bodyContentType === \"form\" && t.meta.method !== \"GET\",\n\t);\n\tif (needsForm) {\n\t\tparts.push(`function formEncode(value: unknown, prefix = \"\", out = new URLSearchParams()): URLSearchParams {\n\tif (value === null || value === undefined) return out;\n\tif (typeof value === \"object\") {\n\t\tif (Array.isArray(value)) {\n\t\t\tvalue.forEach((v, i) => formEncode(v, prefix ? \\`\\${prefix}[\\${i}]\\` : String(i), out));\n\t\t} else {\n\t\t\tfor (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n\t\t\t\tformEncode(v, prefix ? \\`\\${prefix}[\\${k}]\\` : k, out);\n\t\t\t}\n\t\t}\n\t} else if (prefix) {\n\t\tout.append(prefix, String(value));\n\t}\n\treturn out;\n}`);\n\t}\n\treturn parts.join(\"\\n\\n\");\n}\n\nconst MAX_ZOD_DEPTH = 4;\nconst MAX_DESCRIBE_LENGTH = 300;\n\nfunction jsonSchemaToZod(schema: McpToolDefinition[\"inputSchema\"]): string {\n\tconst entries = Object.entries(schema.properties ?? {});\n\tif (entries.length === 0) return \"{}\";\n\n\tconst fields = entries.map(([name, prop]) => {\n\t\tlet zodType = schemaToZodType(prop, 0);\n\t\tif (!schema.required?.includes(name)) {\n\t\t\tzodType += \".optional()\";\n\t\t}\n\t\tif (prop.description) {\n\t\t\tzodType += `.describe(${JSON.stringify(truncate(prop.description, MAX_DESCRIBE_LENGTH))})`;\n\t\t}\n\t\treturn `\\t\\t${JSON.stringify(name)}: ${zodType},`;\n\t});\n\n\treturn `{\\n${fields.join(\"\\n\")}\\n\\t}`;\n}\n\nfunction truncate(s: string, max: number): string {\n\treturn s.length > max ? `${s.slice(0, max - 3)}...` : s;\n}\n\nfunction schemaToZodType(schema: JsonSchema, depth: number): string {\n\tif (depth > MAX_ZOD_DEPTH) return \"z.unknown()\";\n\tlet zod = baseZodType(schema, depth);\n\tconst isNullable =\n\t\tschema.nullable === true || (Array.isArray(schema.type) && schema.type.includes(\"null\"));\n\tif (isNullable && zod !== \"z.unknown()\" && zod !== \"z.null()\") {\n\t\tzod += \".nullable()\";\n\t}\n\treturn zod;\n}\n\nfunction baseZodType(schema: JsonSchema, depth: number): string {\n\tif (schema.enum && schema.enum.length > 0) {\n\t\tconst nonNull = schema.enum.filter((v) => v !== null);\n\t\tif (nonNull.length === 0) return \"z.null()\";\n\t\tif (nonNull.every((v) => typeof v === \"string\")) {\n\t\t\treturn `z.enum([${nonNull.map((v) => JSON.stringify(v)).join(\", \")}])`;\n\t\t}\n\t\tconst literals = nonNull.map((v) => `z.literal(${JSON.stringify(v)})`);\n\t\treturn literals.length === 1 ? literals[0] : `z.union([${literals.join(\", \")}])`;\n\t}\n\n\tconst variants = schema.oneOf ?? schema.anyOf;\n\tif (variants && variants.length > 0) {\n\t\tconst subs = [\n\t\t\t...new Set(\n\t\t\t\tvariants\n\t\t\t\t\t.filter((v) => v.type !== \"null\")\n\t\t\t\t\t.slice(0, 5)\n\t\t\t\t\t.map((v) => schemaToZodType(v, depth + 1)),\n\t\t\t),\n\t\t];\n\t\tif (subs.length === 0) return \"z.unknown()\";\n\t\tif (subs.length === 1) return subs[0];\n\t\treturn `z.union([${subs.join(\", \")}])`;\n\t}\n\n\tif (schema.allOf && schema.allOf.length > 0) {\n\t\tconst merged: JsonSchema = { type: \"object\", properties: {}, required: [] };\n\t\tfor (const part of schema.allOf) {\n\t\t\tif (part.properties) Object.assign(merged.properties!, part.properties);\n\t\t\tif (part.required) merged.required!.push(...part.required);\n\t\t}\n\t\tif (Object.keys(merged.properties!).length > 0) {\n\t\t\treturn renderZodObject(merged, depth);\n\t\t}\n\t\treturn \"z.unknown()\";\n\t}\n\n\tconst type = Array.isArray(schema.type)\n\t\t? schema.type.find((t) => t !== \"null\")\n\t\t: schema.type;\n\n\tswitch (type) {\n\t\tcase \"integer\":\n\t\t\treturn \"z.number().int()\";\n\t\tcase \"number\":\n\t\t\treturn \"z.number()\";\n\t\tcase \"boolean\":\n\t\t\treturn \"z.boolean()\";\n\t\tcase \"array\":\n\t\t\treturn `z.array(${schema.items ? schemaToZodType(schema.items, depth + 1) : \"z.unknown()\"})`;\n\t\tcase \"object\":\n\t\t\treturn renderZodObject(schema, depth);\n\t\tcase \"string\":\n\t\t\treturn \"z.string()\";\n\t\tdefault:\n\t\t\tif (schema.properties) return renderZodObject(schema, depth);\n\t\t\treturn \"z.string()\";\n\t}\n}\n\nfunction renderZodObject(schema: JsonSchema, depth: number): string {\n\tconst entries = Object.entries(schema.properties ?? {});\n\tif (entries.length === 0 || depth >= MAX_ZOD_DEPTH) {\n\t\treturn \"z.record(z.unknown())\";\n\t}\n\tconst fields = entries.map(([key, val]) => {\n\t\tlet zod = schemaToZodType(val, depth + 1);\n\t\tif (!schema.required?.includes(key)) zod += \".optional()\";\n\t\treturn `${JSON.stringify(key)}: ${zod}`;\n\t});\n\treturn `z.object({ ${fields.join(\", \")} }).passthrough()`;\n}\n"],"mappings":"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","names":["parseYaml","import_node_fs","import_node_path"]}
@@ -0,0 +1,5 @@
1
+ export { parseSpec } from "./parser/index.js";
2
+ export { mapToMcpTools } from "./mapper/index.js";
3
+ export { generate } from "./generator/index.js";
4
+ export type { McpToolDefinition, GenerateOptions, OpenApiSpec, MapperOptions, AuthMode, PaginationConfig, PaginationHint, } from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,5 @@
1
+ export { parseSpec } from "./parser/index.js";
2
+ export { mapToMcpTools } from "./mapper/index.js";
3
+ export { generate } from "./generator/index.js";
4
+ export type { McpToolDefinition, GenerateOptions, OpenApiSpec, MapperOptions, AuthMode, PaginationConfig, PaginationHint, } from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,YAAY,EACX,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,aAAa,EACb,QAAQ,EACR,gBAAgB,EAChB,cAAc,GACd,MAAM,YAAY,CAAC"}