mcp-api-translator 0.1.0 → 0.1.1
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/LICENSE +661 -661
- package/LICENSING.md +58 -58
- package/NOTICE +19 -19
- package/README.md +257 -257
- package/dist/{chunk-KSWSDM52.js → chunk-WNBBH3HV.js} +1 -1
- package/dist/chunk-WNBBH3HV.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib.js +1 -1
- package/package.json +73 -73
- package/dist/chunk-KSWSDM52.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ir/validate.ts","../src/parsers/index.ts","../src/parsers/openapi.ts","../src/curation/naming.ts","../src/parsers/security.ts","../src/parsers/postman.ts","../src/emitters/project.ts","../src/curation/describe.ts","../src/curation/filter.ts","../src/curation/index.ts","../src/manifest.ts","../src/version.ts","../src/emitters/templates.ts","../src/emitters/python.ts","../src/server.ts","../src/tools.ts","../src/runtime/oauth.ts","../src/runtime/client.ts","../src/runtime/server.ts"],"sourcesContent":["/**\n * Validation gate between parsing and emission.\n *\n * Parsers translate untrusted specs into an {@link ApiModel}; emitters then trust that model\n * completely (they interpolate parts of it into generated source). This gate enforces the\n * structural invariants emitters rely on, so a parser bug or a hostile spec fails loudly here\n * with a clear message instead of producing broken — or unsafe — generated code downstream.\n */\nimport type { ApiModel } from \"./model.js\";\n\nconst HTTP_METHODS = new Set([\"GET\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\", \"OPTIONS\", \"HEAD\", \"TRACE\"]);\nconst PARAM_LOCATIONS = new Set([\"path\", \"query\", \"header\", \"cookie\"]);\nconst SCHEME_TYPES = new Set([\"apiKey\", \"http\", \"oauth2\", \"openIdConnect\", \"mutualTLS\"]);\n/** Tool names are used verbatim as JS identifiers and file names in generated projects. */\nconst TOOL_NAME_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst MAX_TOOL_NAME_LENGTH = 64;\n\nfunction isPlainObject(value: unknown): boolean {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Collect every structural problem with a parsed model. Empty result == valid. */\nexport function validateApiModel(model: ApiModel): string[] {\n const issues: string[] = [];\n\n if (typeof model.title !== \"string\" || model.title.trim() === \"\") {\n issues.push(\"title must be a non-empty string\");\n }\n if (typeof model.version !== \"string\") {\n issues.push(\"version must be a string\");\n }\n if (!Array.isArray(model.servers)) {\n issues.push(\"servers must be an array\");\n } else {\n model.servers.forEach((s, i) => {\n if (typeof s !== \"string\" || s.trim() === \"\")\n issues.push(`servers[${i}] must be a non-empty string`);\n });\n }\n\n if (!Array.isArray(model.securitySchemes)) {\n issues.push(\"securitySchemes must be an array\");\n } else {\n model.securitySchemes.forEach((s, i) => {\n const at = `securitySchemes[${i}]`;\n if (!s || typeof s.name !== \"string\" || s.name === \"\")\n issues.push(`${at}.name must be a non-empty string`);\n if (!SCHEME_TYPES.has(s?.type))\n issues.push(`${at}.type \"${s?.type}\" is not a known security scheme type`);\n if (!Array.isArray(s?.envVars) || s.envVars.length === 0) {\n issues.push(`${at}.envVars must be a non-empty array`);\n } else if (!s.envVars.every((v) => typeof v === \"string\" && v !== \"\")) {\n issues.push(`${at}.envVars must contain only non-empty strings`);\n }\n });\n }\n\n if (!Array.isArray(model.operations)) {\n issues.push(\"operations must be an array\");\n } else {\n model.operations.forEach((op, i) => {\n const at = `operations[${i}]`;\n if (typeof op?.toolName !== \"string\" || !TOOL_NAME_RE.test(op.toolName)) {\n issues.push(\n `${at}.toolName \"${op?.toolName}\" is not a valid identifier (^[A-Za-z_][A-Za-z0-9_]*$)`,\n );\n } else if (op.toolName.length > MAX_TOOL_NAME_LENGTH) {\n issues.push(`${at}.toolName exceeds ${MAX_TOOL_NAME_LENGTH} characters`);\n }\n if (typeof op?.method !== \"string\" || !HTTP_METHODS.has(op.method)) {\n issues.push(`${at}.method \"${op?.method}\" is not a supported HTTP method`);\n }\n if (typeof op?.path !== \"string\" || !op.path.startsWith(\"/\")) {\n issues.push(`${at}.path \"${op?.path}\" must be a string starting with \"/\"`);\n }\n // Emitters call .trim() on these, so a non-string (e.g. an object description) must fail here\n // with a clear message rather than as a TypeError during code generation.\n if (op?.summary !== undefined && typeof op.summary !== \"string\") {\n issues.push(`${at}.summary must be a string when present`);\n }\n if (op?.description !== undefined && typeof op.description !== \"string\") {\n issues.push(`${at}.description must be a string when present`);\n }\n if (!Array.isArray(op?.parameters)) {\n issues.push(`${at}.parameters must be an array`);\n } else {\n op.parameters.forEach((p, j) => {\n const pat = `${at}.parameters[${j}]`;\n if (typeof p?.name !== \"string\" || p.name === \"\")\n issues.push(`${pat}.name must be a non-empty string`);\n if (!PARAM_LOCATIONS.has(p?.in))\n issues.push(`${pat}.in \"${p?.in}\" is not a valid parameter location`);\n if (!isPlainObject(p?.schema)) issues.push(`${pat}.schema must be an object`);\n });\n }\n if (op?.requestBody !== undefined && !isPlainObject(op.requestBody?.schema)) {\n issues.push(`${at}.requestBody.schema must be an object`);\n }\n if (!Array.isArray(op?.security)) {\n issues.push(`${at}.security must be an array`);\n }\n });\n }\n\n return issues;\n}\n\n/** Throw a single, aggregated error if the model violates any emitter invariant. */\nexport function assertValidApiModel(model: ApiModel): void {\n const issues = validateApiModel(model);\n if (issues.length > 0) {\n throw new Error(\n `Parsed API model failed validation:\\n${issues.map((i) => ` - ${i}`).join(\"\\n\")}`,\n );\n }\n}\n","/**\n * Source loading, format detection, and parser dispatch.\n *\n * A \"source\" is either inline text (JSON or YAML) or a path to a local file. We parse it into a\n * plain object, detect whether it's an OpenAPI document or a Postman collection, and hand it to\n * the matching parser. This is the registry seam: adding a new input format is one entry here\n * plus a parser module.\n */\nimport { readFile } from \"node:fs/promises\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { ApiModel, SourceFormat } from \"../ir/model.js\";\nimport { assertValidApiModel } from \"../ir/validate.js\";\nimport { parseOpenApi } from \"./openapi.js\";\nimport { parsePostman } from \"./postman.js\";\n\nexport interface SourceInput {\n /** Inline JSON or YAML spec text. */\n spec?: string;\n /** Path to a local spec file (JSON or YAML). */\n specPath?: string;\n /** Force a format instead of auto-detecting. */\n format?: SourceFormat | \"auto\";\n}\n\n/** Upper bound on spec size; guards against accidental/hostile oversized inputs. */\nexport const MAX_SPEC_BYTES = 16 * 1024 * 1024; // 16 MB\n\n/** Parse inline text or read a file, returning the raw spec object. */\nexport async function loadRawSpec(input: SourceInput): Promise<unknown> {\n let text: string;\n if (input.spec && input.spec.trim().length > 0) {\n text = input.spec;\n } else if (input.specPath) {\n text = await readFile(input.specPath, \"utf8\");\n } else {\n throw new Error(\"Provide either `spec` (inline text) or `specPath` (a local file path).\");\n }\n const bytes = Buffer.byteLength(text, \"utf8\");\n if (bytes > MAX_SPEC_BYTES) {\n throw new Error(\n `Spec is ${bytes} bytes, exceeding the ${MAX_SPEC_BYTES}-byte limit. Split it or raise MAX_SPEC_BYTES.`,\n );\n }\n // YAML is a superset of JSON, so a single YAML parse handles both formats.\n try {\n return parseYaml(text);\n } catch (err) {\n throw new Error(`Could not parse spec as JSON or YAML: ${(err as Error).message}`);\n }\n}\n\nexport function detectFormat(raw: unknown): SourceFormat {\n if (raw && typeof raw === \"object\") {\n const obj = raw as Record<string, unknown>;\n if (\"openapi\" in obj || \"swagger\" in obj) return \"openapi\";\n const info = obj.info as Record<string, unknown> | undefined;\n const schema = typeof info?.schema === \"string\" ? info.schema : \"\";\n if (\n schema.includes(\"getpostman.com\") ||\n \"_postman_id\" in (info ?? {}) ||\n Array.isArray(obj.item)\n ) {\n return \"postman\";\n }\n }\n throw new Error(\n 'Could not detect the spec format. Pass `format: \"openapi\"` or `format: \"postman\"` explicitly.',\n );\n}\n\n/** Load, detect, and parse a source into the shared {@link ApiModel}. */\nexport async function parseSource(input: SourceInput): Promise<ApiModel> {\n const raw = await loadRawSpec(input);\n const format = !input.format || input.format === \"auto\" ? detectFormat(raw) : input.format;\n let model: ApiModel;\n switch (format) {\n case \"openapi\":\n model = await parseOpenApi(raw);\n break;\n case \"postman\":\n model = parsePostman(raw);\n break;\n default:\n throw new Error(`Unsupported format: ${format as string}`);\n }\n // Validation gate: emitters trust the model, so reject a malformed one here with a clear error.\n assertValidApiModel(model);\n return model;\n}\n\nexport const SUPPORTED_FORMATS: SourceFormat[] = [\"openapi\", \"postman\"];\n","/**\n * OpenAPI 3.0 / 3.1 (and best-effort Swagger 2.0) -> {@link ApiModel}.\n *\n * We dereference all `$ref`s up front so emitters only ever see resolved schemas. OpenAPI 3.1\n * schemas are already JSON Schema 2020-12; the only normalization needed for 3.0 is converting\n * `nullable: true` to a `\"null\"` type union.\n */\nimport { dereference } from \"@readme/openapi-parser\";\nimport type {\n ApiModel,\n JsonSchema,\n Operation,\n Parameter,\n ParameterLocation,\n RequestBody,\n SecuritySchemeType,\n} from \"../ir/model.js\";\nimport { nameFromMethodPath, sanitizeToolName } from \"../curation/naming.js\";\nimport { assignEnvVars } from \"./security.js\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ntype AnyObj = Record<string, any>;\n\nconst HTTP_METHODS = [\"get\", \"put\", \"post\", \"delete\", \"patch\", \"options\", \"head\", \"trace\"];\n\n/** Recursively convert OpenAPI 3.0 `nullable` into a JSON Schema 2020-12 type union. */\nfunction normalizeSchema(schema: any, isV30: boolean): JsonSchema {\n if (!schema || typeof schema !== \"object\") return schema ?? {};\n const out: AnyObj = Array.isArray(schema) ? [...schema] : { ...schema };\n\n if (isV30 && out.nullable === true) {\n if (typeof out.type === \"string\") out.type = [out.type, \"null\"];\n else if (Array.isArray(out.type) && !out.type.includes(\"null\"))\n out.type = [...out.type, \"null\"];\n delete out.nullable;\n } else if (isV30 && out.nullable === false) {\n delete out.nullable;\n }\n\n if (out.properties && typeof out.properties === \"object\") {\n const props: AnyObj = {};\n for (const [k, v] of Object.entries(out.properties)) props[k] = normalizeSchema(v, isV30);\n out.properties = props;\n }\n if (out.items) out.items = normalizeSchema(out.items, isV30);\n if (out.additionalProperties && typeof out.additionalProperties === \"object\") {\n out.additionalProperties = normalizeSchema(out.additionalProperties, isV30);\n }\n for (const key of [\"allOf\", \"anyOf\", \"oneOf\"]) {\n if (Array.isArray(out[key])) out[key] = out[key].map((s: any) => normalizeSchema(s, isV30));\n }\n return out;\n}\n\nfunction serversFrom(doc: AnyObj): string[] {\n if (Array.isArray(doc.servers) && doc.servers.length > 0) {\n return doc.servers.map((s: AnyObj) => String(s.url)).filter(Boolean);\n }\n // Swagger 2.0 fallback.\n if (doc.host) {\n const scheme = Array.isArray(doc.schemes) && doc.schemes.length > 0 ? doc.schemes[0] : \"https\";\n return [`${scheme}://${doc.host}${doc.basePath ?? \"\"}`];\n }\n return [];\n}\n\nfunction paramFrom(p: AnyObj, isV30: boolean): Parameter {\n // 3.x params carry `schema`; 2.0 non-body params inline the type keywords.\n const schema: JsonSchema = p.schema\n ? normalizeSchema(p.schema, isV30)\n : normalizeSchema(\n {\n type: p.type,\n format: p.format,\n enum: p.enum,\n items: p.items,\n default: p.default,\n },\n isV30,\n );\n return {\n name: String(p.name),\n in: (p.in as ParameterLocation) ?? \"query\",\n required: Boolean(p.required) || p.in === \"path\",\n description: p.description,\n schema,\n };\n}\n\nfunction requestBodyFrom(op: AnyObj, params: AnyObj[], isV30: boolean): RequestBody | undefined {\n // OpenAPI 3.x request body.\n if (op.requestBody?.content) {\n const content = op.requestBody.content as AnyObj;\n const contentType =\n Object.keys(content).find((c) => c.includes(\"json\")) ?? Object.keys(content)[0];\n if (contentType) {\n return {\n required: Boolean(op.requestBody.required),\n contentType,\n description: op.requestBody.description,\n schema: normalizeSchema(content[contentType]?.schema ?? {}, isV30),\n };\n }\n }\n // Swagger 2.0 body parameter.\n const body = params.find((p) => p.in === \"body\");\n if (body?.schema) {\n return {\n required: Boolean(body.required),\n contentType: \"application/json\",\n description: body.description,\n schema: normalizeSchema(body.schema, isV30),\n };\n }\n return undefined;\n}\n\nfunction securitySchemesFrom(doc: AnyObj) {\n const defs: AnyObj = doc.components?.securitySchemes ?? doc.securityDefinitions ?? {};\n const raw = Object.entries(defs).map(([name, def]) => {\n const d = def as AnyObj;\n // Swagger 2.0 used type \"basic\"; normalize to http/basic.\n let type = d.type as SecuritySchemeType;\n let scheme = d.scheme as string | undefined;\n if ((d.type as string) === \"basic\") {\n type = \"http\";\n scheme = \"basic\";\n }\n // OAuth2 client-credentials token endpoint (OpenAPI 3.x flows, or Swagger 2.0 tokenUrl).\n const tokenUrl =\n typeof d.flows?.clientCredentials?.tokenUrl === \"string\"\n ? (d.flows.clientCredentials.tokenUrl as string)\n : d.flow === \"application\" && typeof d.tokenUrl === \"string\"\n ? (d.tokenUrl as string)\n : undefined;\n return {\n name,\n type,\n in: d.in,\n paramName: d.name,\n scheme,\n tokenUrl,\n };\n });\n return assignEnvVars(raw);\n}\n\nexport async function parseOpenApi(raw: unknown): Promise<ApiModel> {\n // Resolve internal `$ref`s only. `external: false` disables the http/file resolvers, so a hostile\n // spec cannot make us fetch a URL or read a local file during parsing (SSRF / info disclosure).\n const doc = (await dereference(\n raw as never,\n { resolve: { external: false } } as never,\n )) as AnyObj;\n const isV30 = typeof doc.openapi === \"string\" ? doc.openapi.startsWith(\"3.0\") : !!doc.swagger;\n\n const securitySchemes = securitySchemesFrom(doc);\n const rootSecurity = securityNames(doc.security);\n\n const operations: Operation[] = [];\n const paths: AnyObj = doc.paths ?? {};\n for (const [path, pathItemRaw] of Object.entries(paths)) {\n const pathItem = pathItemRaw as AnyObj;\n const pathLevelParams: AnyObj[] = Array.isArray(pathItem.parameters) ? pathItem.parameters : [];\n for (const method of HTTP_METHODS) {\n const op = pathItem[method] as AnyObj | undefined;\n if (!op) continue;\n\n const rawParams: AnyObj[] = [\n ...pathLevelParams,\n ...(Array.isArray(op.parameters) ? op.parameters : []),\n ];\n const parameters = rawParams\n .filter((p) => p.in && p.in !== \"body\" && p.in !== \"formData\")\n .map((p) => paramFrom(p, isV30));\n\n const baseName = op.operationId\n ? sanitizeToolName(op.operationId)\n : nameFromMethodPath(method, path);\n\n operations.push({\n toolName: baseName,\n operationId: op.operationId,\n method: method.toUpperCase(),\n path,\n summary: typeof op.summary === \"string\" ? op.summary : undefined,\n description: typeof op.description === \"string\" ? op.description : undefined,\n tags: Array.isArray(op.tags) ? op.tags.map(String) : [],\n parameters,\n requestBody: requestBodyFrom(op, rawParams, isV30),\n security: op.security ? securityNames(op.security) : rootSecurity,\n });\n }\n }\n\n return {\n title: doc.info?.title ?? \"API\",\n version: doc.info?.version ?? \"0.0.0\",\n description: doc.info?.description,\n servers: serversFrom(doc),\n securitySchemes,\n operations,\n sourceFormat: \"openapi\",\n };\n}\n\nfunction securityNames(security: unknown): string[] {\n if (!Array.isArray(security)) return [];\n const names = new Set<string>();\n for (const requirement of security) {\n if (requirement && typeof requirement === \"object\") {\n for (const key of Object.keys(requirement)) names.add(key);\n }\n }\n return [...names];\n}\n","/**\n * Turns operation identifiers into MCP-safe, unique tool names.\n *\n * MCP tool names must be reasonably short and restricted in character set; many real specs\n * either omit `operationId` or use characters that aren't valid. We derive a stable name and\n * de-duplicate collisions deterministically so re-running produces the same output.\n */\n\nconst MAX_NAME_LENGTH = 64;\n\n/** Strip to `[a-zA-Z0-9_]`, collapse separators, trim, and bound the length. */\nexport function sanitizeToolName(raw: string): string {\n let name = raw\n .replace(/[^a-zA-Z0-9]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n if (name.length === 0) name = \"operation\";\n // Tool names must not start with a digit (keeps them valid JS identifiers downstream too).\n if (/^[0-9]/.test(name)) name = `op_${name}`;\n if (name.length > MAX_NAME_LENGTH) name = name.slice(0, MAX_NAME_LENGTH).replace(/_+$/, \"\");\n return name;\n}\n\n/** Fallback name derived from method + path, e.g. GET /pets/{id} -> \"get_pets_by_id\". */\nexport function nameFromMethodPath(method: string, path: string): string {\n const segments = path\n .split(\"/\")\n .filter(Boolean)\n .map((seg) => {\n const m = seg.match(/^\\{(.+)\\}$/);\n return m ? `by_${m[1]}` : seg;\n });\n return sanitizeToolName(`${method.toLowerCase()}_${segments.join(\"_\")}`);\n}\n\n/**\n * Assign a unique tool name. `taken` is mutated to record the assigned name so the caller can\n * thread it across many operations (and across an append against an existing project).\n */\nexport function uniqueToolName(base: string, taken: Set<string>): string {\n const sanitized = sanitizeToolName(base);\n if (!taken.has(sanitized)) {\n taken.add(sanitized);\n return sanitized;\n }\n let i = 2;\n while (taken.has(`${sanitized}_${i}`)) i++;\n const result = `${sanitized}_${i}`;\n taken.add(result);\n return result;\n}\n","/**\n * Shared helpers for turning detected auth into env-var-backed {@link SecurityScheme}s.\n *\n * Credentials are always read from the environment by the generated server — never embedded.\n * We prefer friendly names (API_KEY, API_TOKEN, ...) and only namespace by scheme name when two\n * schemes would otherwise collide.\n */\nimport type { SecurityScheme, SecuritySchemeType } from \"../ir/model.js\";\n\nfunction envPrefix(schemeName: string): string {\n return (\n schemeName\n .replace(/[^a-zA-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .toUpperCase() || \"AUTH\"\n );\n}\n\n/**\n * Env-var namespace for one source API (from its title), e.g. \"Swagger Petstore\" -> \"SWAGGER_PETSTORE\".\n * Used to disambiguate credentials/base URLs when several APIs are aggregated into one server:\n * a mounted tool reads `<NAMESPACE>_API_KEY` in preference to the bare `API_KEY`.\n */\nexport function envNamespace(source: string): string {\n return (\n source\n .replace(/[^a-zA-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .toUpperCase() || \"API\"\n );\n}\n\ninterface RawScheme {\n name: string;\n type: SecuritySchemeType;\n in?: \"header\" | \"query\" | \"cookie\";\n paramName?: string;\n scheme?: string;\n /** OAuth2 client-credentials token endpoint, if present. */\n tokenUrl?: string;\n}\n\n/** Friendly env var slots for a scheme, before collision resolution. */\nfunction friendlyEnvVars(raw: RawScheme): string[] {\n if (raw.type === \"http\" && raw.scheme?.toLowerCase() === \"basic\") {\n return [\"API_USERNAME\", \"API_PASSWORD\"];\n }\n // OAuth2 with a token endpoint = client-credentials: read a client id/secret and fetch a token.\n if (raw.tokenUrl && (raw.type === \"oauth2\" || raw.type === \"openIdConnect\")) {\n return [\"API_CLIENT_ID\", \"API_CLIENT_SECRET\"];\n }\n if (raw.type === \"http\") return [\"API_TOKEN\"]; // bearer and other http schemes\n if (raw.type === \"oauth2\" || raw.type === \"openIdConnect\") return [\"API_TOKEN\"];\n return [\"API_KEY\"]; // apiKey and anything else\n}\n\n/**\n * Assign env vars across all schemes, namespacing by scheme name where the friendly name is\n * already claimed by a different scheme.\n */\nexport function assignEnvVars(rawSchemes: RawScheme[]): SecurityScheme[] {\n const used = new Set<string>();\n return rawSchemes.map((raw) => {\n const friendly = friendlyEnvVars(raw);\n const collides = friendly.some((v) => used.has(v));\n const envVars = collides\n ? friendly.map((v) => `${envPrefix(raw.name)}_${v.replace(/^API_/, \"\")}`)\n : friendly;\n for (const v of envVars) used.add(v);\n return {\n name: raw.name,\n type: raw.type,\n in: raw.in,\n paramName: raw.paramName,\n scheme: raw.scheme,\n tokenUrl: raw.tokenUrl,\n envVars,\n };\n });\n}\n","/**\n * Postman Collection v2.1 -> {@link ApiModel}.\n *\n * Postman collections carry no formal parameter schemas, so this parser is best-effort: it\n * infers JSON Schema from example bodies and treats query/header values as optional strings.\n * Folders become tags; `:var` path segments become path parameters. Base URLs that use Postman\n * `{{variables}}` can't be resolved, so the generated server falls back to API_BASE_URL.\n */\nimport type {\n ApiModel,\n JsonSchema,\n Operation,\n Parameter,\n SecuritySchemeType,\n} from \"../ir/model.js\";\nimport { nameFromMethodPath, sanitizeToolName } from \"../curation/naming.js\";\nimport { assignEnvVars } from \"./security.js\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ntype AnyObj = Record<string, any>;\n\nconst SKIP_HEADERS = new Set([\"content-type\", \"accept\", \"authorization\"]);\n\n/**\n * Postman `description` fields may be a plain string or a `{ content, type }` object. Coerce both\n * to a string (or undefined) so downstream emitters never receive a non-string description.\n */\nfunction asDescription(value: unknown): string | undefined {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\" && typeof (value as AnyObj).content === \"string\") {\n return (value as AnyObj).content;\n }\n return undefined;\n}\n\n/** Infer a JSON Schema from a concrete example value. */\nfunction inferSchema(value: unknown): JsonSchema {\n if (value === null) return {};\n if (Array.isArray(value)) return { type: \"array\", items: inferSchema(value[0] ?? {}) };\n switch (typeof value) {\n case \"string\":\n return { type: \"string\" };\n case \"number\":\n return { type: Number.isInteger(value) ? \"integer\" : \"number\" };\n case \"boolean\":\n return { type: \"boolean\" };\n case \"object\": {\n const properties: AnyObj = {};\n for (const [k, v] of Object.entries(value as AnyObj)) properties[k] = inferSchema(v);\n return { type: \"object\", properties };\n }\n default:\n return {};\n }\n}\n\nfunction rawUrl(url: any): { path: string; pathVars: AnyObj[]; query: AnyObj[] } {\n if (typeof url === \"string\") {\n return { path: normalizePath(url), pathVars: [], query: [] };\n }\n const segments: string[] = Array.isArray(url?.path) ? url.path.map(String) : [];\n const path = normalizePath(\"/\" + segments.join(\"/\"));\n return {\n path,\n pathVars: Array.isArray(url?.variable) ? url.variable : [],\n query: Array.isArray(url?.query) ? url.query : [],\n };\n}\n\n/** Convert Postman `:var` segments to `{var}` and ensure a leading slash. */\nfunction normalizePath(p: string): string {\n let path = p.replace(/^https?:\\/\\/[^/]+/i, \"\"); // drop scheme+host if a raw URL slipped through\n path = path.replace(/\\?.*$/, \"\"); // drop query string\n path = path.replace(/:([a-zA-Z0-9_]+)/g, \"{$1}\");\n if (!path.startsWith(\"/\")) path = \"/\" + path;\n return path || \"/\";\n}\n\nfunction pathParamNames(path: string): string[] {\n return [...path.matchAll(/\\{([^}]+)\\}/g)].map((m) => m[1]!);\n}\n\nfunction mapAuth(auth: AnyObj | undefined): {\n name: string;\n type: SecuritySchemeType;\n in?: \"header\" | \"query\";\n paramName?: string;\n scheme?: string;\n} | null {\n if (!auth?.type) return null;\n switch (auth.type) {\n case \"bearer\":\n return { name: \"bearerAuth\", type: \"http\", scheme: \"bearer\" };\n case \"basic\":\n return { name: \"basicAuth\", type: \"http\", scheme: \"basic\" };\n case \"apikey\": {\n const entries: AnyObj[] = Array.isArray(auth.apikey) ? auth.apikey : [];\n const keyEntry = entries.find((e) => e.key === \"key\");\n const inEntry = entries.find((e) => e.key === \"in\");\n return {\n name: \"apiKeyAuth\",\n type: \"apiKey\",\n in: (inEntry?.value as \"header\" | \"query\") ?? \"header\",\n paramName: (keyEntry?.value as string) ?? \"X-API-Key\",\n };\n }\n case \"oauth2\":\n return { name: \"oauth2\", type: \"oauth2\" };\n default:\n return null;\n }\n}\n\nexport function parsePostman(raw: unknown): ApiModel {\n const doc = raw as AnyObj;\n const operations: Operation[] = [];\n const rawSchemes = new Map<string, ReturnType<typeof mapAuth>>();\n\n const collectionAuth = mapAuth(doc.auth);\n if (collectionAuth) rawSchemes.set(collectionAuth.name, collectionAuth);\n\n const walk = (items: AnyObj[], tags: string[]): void => {\n for (const item of items ?? []) {\n if (Array.isArray(item.item)) {\n walk(item.item, [...tags, String(item.name)]);\n continue;\n }\n const req = item.request as AnyObj | undefined;\n if (!req) continue;\n\n const method = String(req.method ?? \"GET\").toUpperCase();\n const { path, pathVars, query } = rawUrl(req.url);\n\n const effectiveAuth = mapAuth(req.auth) ?? collectionAuth;\n if (req.auth) {\n const s = mapAuth(req.auth);\n if (s) rawSchemes.set(s.name, s);\n }\n\n const parameters: Parameter[] = [];\n for (const name of pathParamNames(path)) {\n const v = pathVars.find((pv) => pv.key === name);\n parameters.push({\n name,\n in: \"path\",\n required: true,\n description: v?.description,\n schema: { type: \"string\" },\n });\n }\n for (const q of query) {\n if (q.disabled) continue;\n parameters.push({\n name: String(q.key),\n in: \"query\",\n required: false,\n description: q.description,\n schema: { type: \"string\" },\n });\n }\n for (const h of Array.isArray(req.header) ? req.header : []) {\n if (h.disabled || SKIP_HEADERS.has(String(h.key).toLowerCase())) continue;\n parameters.push({\n name: String(h.key),\n in: \"header\",\n required: false,\n description: h.description,\n schema: { type: \"string\" },\n });\n }\n\n const requestBody = bodyFrom(req.body);\n const name = item.name\n ? sanitizeToolName(String(item.name))\n : nameFromMethodPath(method, path);\n\n operations.push({\n toolName: name,\n operationId: item.name ? String(item.name) : undefined,\n method,\n path,\n summary: typeof item.name === \"string\" ? item.name : undefined,\n description: asDescription(req.description) ?? asDescription(item.description),\n tags,\n parameters,\n requestBody,\n security: effectiveAuth ? [effectiveAuth.name] : [],\n });\n }\n };\n\n walk(Array.isArray(doc.item) ? doc.item : [], []);\n\n const securitySchemes = assignEnvVars(\n [...rawSchemes.values()].filter((s): s is NonNullable<typeof s> => s !== null),\n );\n\n return {\n title: doc.info?.name ?? \"API\",\n version: \"1.0.0\",\n description: typeof doc.info?.description === \"string\" ? doc.info.description : undefined,\n servers: [], // Postman base URLs typically use {{variables}}; resolved via API_BASE_URL.\n securitySchemes,\n operations,\n sourceFormat: \"postman\",\n };\n}\n\nfunction bodyFrom(body: AnyObj | undefined): RequestBodyOrUndefined {\n if (!body || !body.mode) return undefined;\n if (body.mode === \"raw\" && typeof body.raw === \"string\" && body.raw.trim()) {\n try {\n return {\n required: false,\n contentType: \"application/json\",\n schema: inferSchema(JSON.parse(body.raw)),\n };\n } catch {\n // Body contains template variables or non-JSON text; accept it as a raw string.\n return { required: false, contentType: \"text/plain\", schema: { type: \"string\" } };\n }\n }\n if (body.mode === \"urlencoded\" || body.mode === \"formdata\") {\n const entries: AnyObj[] = Array.isArray(body[body.mode]) ? body[body.mode] : [];\n const properties: AnyObj = {};\n for (const e of entries) if (e.key) properties[String(e.key)] = { type: \"string\" };\n return {\n required: false,\n contentType:\n body.mode === \"urlencoded\" ? \"application/x-www-form-urlencoded\" : \"multipart/form-data\",\n schema: { type: \"object\", properties },\n };\n }\n return undefined;\n}\n\ntype RequestBodyOrUndefined = ApiModel[\"operations\"][number][\"requestBody\"];\n","/**\n * Project emitter: writes a complete generated MCP-server project, and appends to an existing one.\n *\n * `generateProject` scaffolds fresh; `appendToProject` reads the `.mcp-translator.json` manifest,\n * adds only operations not already present (idempotent), regenerates shared infrastructure from\n * the merged model, and never rewrites hand-edited tool files unless `force` is set.\n */\nimport { mkdir, writeFile, readFile, readdir, access } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { ApiModel, JsonSchema, Operation, SecurityScheme } from \"../ir/model.js\";\nimport { buildDescription } from \"../curation/describe.js\";\nimport { curate, TOOL_COUNT_WARN_THRESHOLD } from \"../curation/index.js\";\nimport { applyFilters, type FilterOptions } from \"../curation/filter.js\";\nimport { uniqueToolName } from \"../curation/naming.js\";\nimport { assignEnvVars } from \"../parsers/security.js\";\nimport {\n operationKey,\n readManifest,\n writeManifest,\n MANIFEST_FILENAME,\n MANIFEST_VERSION,\n type Language,\n type ManifestTool,\n type TranslatorManifest,\n} from \"../manifest.js\";\nimport { GENERATOR_NAME, GENERATOR_VERSION } from \"../version.js\";\nimport * as t from \"./templates.js\";\nimport * as py from \"./python.js\";\n\nexport interface GenerateOptions {\n outputDir: string;\n serverName?: string;\n serverVersion?: string;\n transport?: t.Transport;\n filters?: FilterOptions;\n force?: boolean;\n /** Output language; defaults to \"typescript\". */\n language?: Language;\n}\n\nexport interface AppendOptions {\n projectDir: string;\n filters?: FilterOptions;\n force?: boolean;\n}\n\nexport interface EmitSummary {\n projectDir: string;\n serverName: string;\n toolsAdded: number;\n toolsSkipped: number;\n totalTools: number;\n files: string[];\n warnings: string[];\n}\n\n/** Records every file written so the summary can report a manifest of changes. */\nclass FileWriter {\n readonly written: string[] = [];\n constructor(private readonly root: string) {}\n async write(relPath: string, content: string): Promise<void> {\n const full = path.join(this.root, relPath);\n await mkdir(path.dirname(full), { recursive: true });\n await writeFile(full, content, \"utf8\");\n this.written.push(relPath);\n }\n async writeIfAbsent(relPath: string, content: string, force: boolean): Promise<boolean> {\n if (!force && (await exists(path.join(this.root, relPath)))) return false;\n await this.write(relPath, content);\n return true;\n }\n}\n\nasync function exists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function isEmptyDir(dir: string): Promise<boolean> {\n try {\n const entries = await readdir(dir);\n return entries.length === 0;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return true; // doesn't exist yet\n throw err; // surface EACCES/ENOTDIR rather than silently treating as empty\n }\n}\n\n/** Hard ceiling on generated tools; a pathological spec shouldn't scaffold thousands of files. */\nexport const MAX_GENERATED_TOOLS = 1000;\n\nfunction assertToolCount(count: number): void {\n if (count > MAX_GENERATED_TOOLS) {\n throw new Error(\n `Refusing to generate ${count} tools (limit ${MAX_GENERATED_TOOLS}). ` +\n `Narrow the spec with includeTags / methods / pathGlob / excludeOperations.`,\n );\n }\n}\n\nexport function toPackageName(title: string): string {\n const base = title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return (base || \"api\") + \"-mcp\";\n}\n\n/** Build the emit-ready tool descriptor (input schema + request plan) for one operation. */\nexport function operationToToolEmit(op: Operation, sourceTitle: string): t.ToolEmit {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const p of op.parameters) {\n const schema: JsonSchema = { ...p.schema };\n if (p.description && !(\"description\" in schema)) schema.description = p.description;\n properties[p.name] = schema;\n if (p.required) required.push(p.name);\n }\n\n // Substitution is driven by the actual {tokens} in the path, not the declared params: a token\n // with no matching parameter still needs an input so it can be filled in rather than sent\n // literally.\n const pathTokens = [...op.path.matchAll(/\\{([^}]+)\\}/g)].map((m) => m[1]!);\n for (const token of pathTokens) {\n if (!(token in properties)) {\n properties[token] = { type: \"string\" };\n if (!required.includes(token)) required.push(token);\n }\n }\n\n let bodyParam: string | null = null;\n if (op.requestBody) {\n bodyParam = \"body\" in properties ? \"requestBody\" : \"body\";\n const bodySchema: JsonSchema = { ...op.requestBody.schema };\n if (op.requestBody.description && !(\"description\" in bodySchema)) {\n bodySchema.description = op.requestBody.description;\n }\n properties[bodyParam] = bodySchema;\n if (op.requestBody.required) required.push(bodyParam);\n }\n\n const inputSchema: JsonSchema = {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n };\n\n return {\n name: op.toolName,\n method: op.method,\n path: op.path,\n description: buildDescription(op),\n inputSchema,\n sourceTitle,\n plan: {\n method: op.method,\n pathTemplate: op.path,\n pathParams: pathTokens,\n queryParams: op.parameters.filter((p) => p.in === \"query\").map((p) => p.name),\n headerParams: op.parameters.filter((p) => p.in === \"header\").map((p) => p.name),\n cookieParams: op.parameters.filter((p) => p.in === \"cookie\").map((p) => p.name),\n bodyParam,\n contentType: op.requestBody?.contentType ?? null,\n security: op.security,\n },\n };\n}\n\n/** Write the shared infrastructure files common to fresh + append. */\nasync function emitShared(\n fw: FileWriter,\n serverName: string,\n serverVersion: string,\n description: string,\n servers: string[],\n schemes: SecurityScheme[],\n transport: t.Transport,\n allToolNames: string[],\n toolCount: number,\n): Promise<void> {\n const baseUrl = servers[0] ?? \"\";\n await fw.write(\"package.json\", t.packageJson(serverName, serverVersion, transport));\n await fw.write(\"tsconfig.json\", t.tsconfigJson());\n await fw.write(\".gitignore\", t.gitignore());\n await fw.write(\".env.example\", t.envExample(baseUrl, schemes));\n await fw.write(\"Dockerfile\", t.dockerfile());\n await fw.write(\"server.json\", t.serverJson(serverName, serverVersion, description));\n await fw.write(\"client-config.md\", t.clientConfigMd(serverName));\n await fw.write(\n \"README.md\",\n t.readmeMd({ serverName, apiTitle: description, toolCount, schemes, transport }),\n );\n await fw.write(\"src/types.ts\", t.typesTs());\n await fw.write(\"src/config.ts\", t.configTs(baseUrl));\n await fw.write(\"src/auth.ts\", t.authTs(schemes));\n await fw.write(\"src/http/client.ts\", t.httpClientTs());\n await fw.write(\"src/server.ts\", t.serverTs(serverName, serverVersion));\n await fw.write(\"src/index.ts\", t.indexStdioTs(serverName));\n if (transport === \"http\" || transport === \"both\") {\n await fw.write(\"src/index.http.ts\", t.indexHttpTs(serverName));\n }\n await fw.write(\"src/tools/index.ts\", t.toolsIndexTs(allToolNames));\n}\n\n/** A serialized tool record stored in a Python project's tools.json. */\ntype PyToolRecord = { name: string; description: string; inputSchema: unknown; plan: unknown };\n\nfunction toPyToolRecord(tool: t.ToolEmit): PyToolRecord {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n plan: tool.plan,\n };\n}\n\n/** Path to a Python project's tool-data file, relative to the project root. */\nfunction pythonToolsJsonPath(serverName: string): string {\n return `${py.toPackageModule(serverName)}/tools.json`;\n}\n\n/**\n * Write the shared Python infrastructure (everything except tools.json) from the merged model.\n * Parallel to {@link emitShared} for TypeScript; reused by fresh generation and append.\n */\nasync function emitPythonShared(\n fw: FileWriter,\n serverName: string,\n serverVersion: string,\n description: string,\n servers: string[],\n schemes: SecurityScheme[],\n toolCount: number,\n): Promise<void> {\n const baseUrl = servers[0] ?? \"\";\n const pkg = py.toPackageModule(serverName);\n await fw.write(\"pyproject.toml\", py.pyprojectToml(serverName, serverVersion, pkg));\n await fw.write(\".gitignore\", py.gitignorePy());\n await fw.write(\".env.example\", t.envExample(baseUrl, schemes));\n await fw.write(\"Dockerfile\", py.dockerfilePy(pkg));\n await fw.write(\"server.json\", t.serverJson(serverName, serverVersion, description));\n await fw.write(\n \"README.md\",\n py.readmePy({ serverName, pkg, apiTitle: description, toolCount, schemes }),\n );\n await fw.write(`${pkg}/__init__.py`, py.initPy());\n await fw.write(`${pkg}/config.py`, py.configPy(baseUrl));\n await fw.write(`${pkg}/auth.py`, py.authPy(schemes));\n await fw.write(`${pkg}/http_client.py`, py.httpClientPy());\n await fw.write(`${pkg}/server.py`, py.serverPy(serverName));\n await fw.write(`${pkg}/__main__.py`, py.mainPy());\n await fw.write(`${pkg}/tools.py`, py.toolsPy());\n}\n\nexport async function generateProject(\n model: ApiModel,\n options: GenerateOptions,\n): Promise<EmitSummary> {\n const dir = path.resolve(options.outputDir);\n const existingManifest = await readManifest(dir);\n if (existingManifest && !options.force) {\n throw new Error(\n `${dir} is already a generated project. Use extend_mcp_server to add tools, or pass force: true to overwrite.`,\n );\n }\n if (!existingManifest && !options.force && !(await isEmptyDir(dir))) {\n throw new Error(`${dir} is not empty. Pass force: true to overwrite.`);\n }\n\n const serverName = options.serverName ?? toPackageName(model.title);\n const serverVersion = options.serverVersion ?? model.version ?? \"0.1.0\";\n const transport = options.transport ?? \"stdio\";\n const language: Language = options.language ?? \"typescript\";\n const description = model.title + (model.version ? ` (v${model.version})` : \"\");\n\n const { operations, filteredOut } = curate(model, options.filters ?? {});\n assertToolCount(operations.length);\n const tools = operations.map((op) => operationToToolEmit(op, model.title));\n\n const fw = new FileWriter(dir);\n if (language === \"python\") {\n await emitPythonShared(\n fw,\n serverName,\n serverVersion,\n description,\n model.servers,\n model.securitySchemes,\n tools.length,\n );\n await fw.write(\n pythonToolsJsonPath(serverName),\n JSON.stringify(tools.map(toPyToolRecord), null, 2) + \"\\n\",\n );\n } else {\n await emitShared(\n fw,\n serverName,\n serverVersion,\n description,\n model.servers,\n model.securitySchemes,\n transport,\n tools.map((tool) => tool.name),\n tools.length,\n );\n for (const tool of tools) {\n await fw.write(`src/tools/${tool.name}.ts`, t.toolFileTs(tool));\n }\n }\n\n const manifest: TranslatorManifest = {\n manifestVersion: MANIFEST_VERSION,\n generator: GENERATOR_NAME,\n generatorVersion: GENERATOR_VERSION,\n serverName,\n serverVersion,\n description,\n language,\n transport,\n servers: model.servers,\n securitySchemes: model.securitySchemes,\n sources: [\n {\n format: model.sourceFormat,\n title: model.title,\n version: model.version,\n addedAt: new Date().toISOString(),\n },\n ],\n tools: tools.map(\n (tool): ManifestTool => ({\n name: tool.name,\n method: tool.method,\n path: tool.path,\n sourceTitle: tool.sourceTitle,\n }),\n ),\n };\n await fw.write(MANIFEST_FILENAME, JSON.stringify(manifest, null, 2) + \"\\n\");\n\n return {\n projectDir: dir,\n serverName,\n toolsAdded: tools.length,\n toolsSkipped: filteredOut,\n totalTools: tools.length,\n files: fw.written,\n warnings: toolCountWarnings(tools.length),\n };\n}\n\nexport async function appendToProject(\n model: ApiModel,\n options: AppendOptions,\n): Promise<EmitSummary> {\n const dir = path.resolve(options.projectDir);\n const manifest = await readManifest(dir);\n if (!manifest) {\n throw new Error(\n `${dir} has no ${MANIFEST_FILENAME}; it is not a generated project. Use generate_mcp_server instead.`,\n );\n }\n // Refuse a manifest from a newer format than we understand (a missing field == legacy v1).\n if ((manifest.manifestVersion ?? 1) > MANIFEST_VERSION) {\n throw new Error(\n `${MANIFEST_FILENAME} is schema version ${manifest.manifestVersion}, newer than this generator supports (${MANIFEST_VERSION}). Upgrade mcp-api-translator.`,\n );\n }\n const language: Language = manifest.language ?? \"typescript\";\n\n // Merge servers and security schemes.\n const servers = [...new Set([...manifest.servers, ...model.servers])];\n const schemeMap = new Map<string, SecurityScheme>();\n for (const s of manifest.securitySchemes) schemeMap.set(s.name, s);\n for (const s of model.securitySchemes) if (!schemeMap.has(s.name)) schemeMap.set(s.name, s);\n // Re-derive env vars across the *merged* set: per-spec assignment can't see that two APIs both\n // want API_TOKEN, so without this an appended API would silently share the first API's env var.\n // Manifest schemes are first in insertion order, so the original API keeps its existing env vars.\n const schemes = assignEnvVars([...schemeMap.values()]);\n\n // Add only operations not already present (idempotency by method+path).\n const existingKeys = new Set(manifest.tools.map((tool) => operationKey(tool.method, tool.path)));\n const reserved = new Set(manifest.tools.map((tool) => tool.name));\n const filtered = applyFilters(model.operations, options.filters ?? {});\n const newOps = filtered.filter((op) => !existingKeys.has(operationKey(op.method, op.path)));\n newOps.sort((a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method));\n for (const op of newOps) op.toolName = uniqueToolName(op.toolName, reserved);\n\n const newTools = newOps.map((op) => operationToToolEmit(op, model.title));\n const allToolNames = [\n ...manifest.tools.map((tool) => tool.name),\n ...newTools.map((tl) => tl.name),\n ];\n assertToolCount(allToolNames.length);\n\n const fw = new FileWriter(dir);\n const description = manifest.description ?? manifest.serverName;\n let skippedFiles = 0;\n if (language === \"python\") {\n // Python keeps all tool data in one tools.json; merge new records into the existing ones\n // (preserving any hand-edits to existing entries) and regenerate the shared infrastructure.\n const toolsJson = pythonToolsJsonPath(manifest.serverName);\n let existingRecords: PyToolRecord[];\n try {\n existingRecords = JSON.parse(\n await readFile(path.join(dir, toolsJson), \"utf8\"),\n ) as PyToolRecord[];\n } catch {\n throw new Error(\n `${path.join(dir, toolsJson)} is missing or unreadable; cannot extend this Python project.`,\n );\n }\n const allRecords = [...existingRecords, ...newTools.map(toPyToolRecord)];\n await emitPythonShared(\n fw,\n manifest.serverName,\n manifest.serverVersion,\n description,\n servers,\n schemes,\n allRecords.length,\n );\n await fw.write(toolsJson, JSON.stringify(allRecords, null, 2) + \"\\n\");\n } else {\n await emitShared(\n fw,\n manifest.serverName,\n manifest.serverVersion,\n description,\n servers,\n schemes,\n manifest.transport,\n allToolNames,\n allToolNames.length,\n );\n for (const tool of newTools) {\n const wrote = await fw.writeIfAbsent(\n `src/tools/${tool.name}.ts`,\n t.toolFileTs(tool),\n options.force ?? false,\n );\n if (!wrote) skippedFiles++;\n }\n }\n\n const merged: TranslatorManifest = {\n ...manifest,\n manifestVersion: MANIFEST_VERSION,\n generatorVersion: GENERATOR_VERSION,\n servers,\n securitySchemes: schemes,\n sources: [\n ...manifest.sources,\n {\n format: model.sourceFormat,\n title: model.title,\n version: model.version,\n addedAt: new Date().toISOString(),\n },\n ],\n tools: [\n ...manifest.tools,\n ...newTools.map(\n (tool): ManifestTool => ({\n name: tool.name,\n method: tool.method,\n path: tool.path,\n sourceTitle: tool.sourceTitle,\n }),\n ),\n ],\n };\n await fw.write(MANIFEST_FILENAME, JSON.stringify(merged, null, 2) + \"\\n\");\n\n return {\n projectDir: dir,\n serverName: manifest.serverName,\n toolsAdded: newTools.length,\n toolsSkipped: filtered.length - newOps.length + skippedFiles,\n totalTools: allToolNames.length,\n files: fw.written,\n warnings: toolCountWarnings(allToolNames.length),\n };\n}\n\nfunction toolCountWarnings(count: number): string[] {\n if (count > TOOL_COUNT_WARN_THRESHOLD) {\n return [\n `This server exposes ${count} tools (> ${TOOL_COUNT_WARN_THRESHOLD}). Large tool counts hurt model tool-selection. Consider narrowing with includeTags / methods / pathGlob / excludeOperations.`,\n ];\n }\n return [];\n}\n","/**\n * Builds LLM-friendly tool descriptions from whatever the source spec provides.\n *\n * A good description is the single biggest lever on tool-selection accuracy, so we combine the\n * summary, the long description, and per-parameter docs into one bounded block. Specs vary\n * wildly in quality, so this is best-effort: we never invent semantics, we only surface what's\n * there.\n */\nimport type { Operation } from \"../ir/model.js\";\n\nconst MAX_DESCRIPTION_LENGTH = 1024;\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return `${text.slice(0, max - 1).trimEnd()}…`;\n}\n\nexport function buildDescription(op: Operation): string {\n const parts: string[] = [];\n const headline = op.summary?.trim() || op.description?.trim();\n if (headline) parts.push(headline);\n else parts.push(`${op.method} ${op.path}`);\n\n if (op.description && op.description.trim() && op.description.trim() !== headline) {\n parts.push(op.description.trim());\n }\n\n parts.push(`Calls ${op.method} ${op.path}.`);\n\n const documentedParams = op.parameters.filter((p) => p.description?.trim());\n if (documentedParams.length > 0) {\n const lines = documentedParams.map(\n (p) => `- ${p.name} (${p.in}${p.required ? \", required\" : \"\"}): ${p.description!.trim()}`,\n );\n parts.push(`Parameters:\\n${lines.join(\"\\n\")}`);\n }\n\n return truncate(parts.join(\"\\n\\n\"), MAX_DESCRIPTION_LENGTH);\n}\n","/**\n * Curation filters — the part that keeps a 200-endpoint API from becoming 200 low-value tools.\n *\n * Filters are applied before naming so excluded operations never consume a tool name. All\n * matching is case-insensitive and order-independent so results are deterministic.\n */\nimport type { Operation } from \"../ir/model.js\";\n\nexport interface FilterOptions {\n /** Keep only operations carrying at least one of these tags. */\n includeTags?: string[];\n /** Drop operations whose tag/operationId/toolName matches. */\n excludeOperations?: string[];\n /** Keep only these HTTP methods (e.g. [\"GET\", \"POST\"]). */\n methods?: string[];\n /** Glob against the path, e.g. \"/v1/**\" or \"/pets/*\". */\n pathGlob?: string;\n}\n\n/** Minimal, dependency-free glob: supports `*` (one segment) and `**` (any). */\nfunction globToRegExp(glob: string): RegExp {\n const escaped = glob.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const pattern = escaped.replace(/\\*\\*/g, \"\u0000\").replace(/\\*/g, \"[^/]*\").replace(/\u0000/g, \".*\");\n return new RegExp(`^${pattern}$`);\n}\n\nexport function applyFilters(operations: Operation[], opts: FilterOptions): Operation[] {\n const includeTags = opts.includeTags?.map((t) => t.toLowerCase());\n const exclude = opts.excludeOperations?.map((t) => t.toLowerCase());\n const methods = opts.methods?.map((m) => m.toUpperCase());\n const pathRe = opts.pathGlob ? globToRegExp(opts.pathGlob) : undefined;\n\n return operations.filter((op) => {\n if (methods && !methods.includes(op.method.toUpperCase())) return false;\n if (pathRe && !pathRe.test(op.path)) return false;\n if (includeTags && includeTags.length > 0) {\n const opTags = op.tags.map((t) => t.toLowerCase());\n if (!opTags.some((t) => includeTags.includes(t))) return false;\n }\n if (exclude && exclude.length > 0) {\n const candidates = [op.operationId, op.toolName, ...op.tags]\n .filter((v): v is string => Boolean(v))\n .map((v) => v.toLowerCase());\n if (candidates.some((c) => exclude.includes(c))) return false;\n }\n return true;\n });\n}\n","/**\n * Curation pipeline: filter operations, then assign final unique tool names.\n *\n * Runs after parsing and before emission. `reservedNames` lets an append operation keep the\n * names already used by an existing generated project, so newly added tools never collide with\n * (or silently overwrite) the originals.\n */\nimport type { ApiModel, Operation } from \"../ir/model.js\";\nimport { applyFilters, type FilterOptions } from \"./filter.js\";\nimport { uniqueToolName } from \"./naming.js\";\n\n/** Above this many tools, callers should warn and suggest filters. */\nexport const TOOL_COUNT_WARN_THRESHOLD = 40;\n\nexport interface CurationResult {\n operations: Operation[];\n /** Number of operations dropped by filters. */\n filteredOut: number;\n}\n\nexport function curate(\n model: ApiModel,\n filters: FilterOptions,\n reservedNames: Set<string> = new Set(),\n): CurationResult {\n const before = model.operations.length;\n const kept = applyFilters(model.operations, filters);\n\n // Deterministic order so generated output is stable across runs.\n kept.sort((a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method));\n\n for (const op of kept) {\n op.toolName = uniqueToolName(op.toolName, reservedNames);\n }\n\n return { operations: kept, filteredOut: before - kept.length };\n}\n","/**\n * The `.mcp-translator.json` manifest carried by every generated project.\n *\n * It records enough to (a) regenerate the shared infrastructure files on append and (b) detect\n * which operations already exist, so appending the same spec twice is a no-op. It is the single\n * source of truth the append path reads — the original spec is not needed again.\n */\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { SecurityScheme } from \"./ir/model.js\";\n\nexport const MANIFEST_FILENAME = \".mcp-translator.json\";\n\n/**\n * Schema version of the `.mcp-translator.json` format. Bump on a breaking change to the manifest\n * shape; the append path refuses manifests written by a newer (higher) version so it never\n * misreads a format it doesn't understand.\n */\nexport const MANIFEST_VERSION = 1;\n\nexport interface ManifestTool {\n name: string;\n method: string;\n path: string;\n sourceTitle: string;\n}\n\nexport interface ManifestSource {\n format: string;\n title: string;\n version: string;\n addedAt: string;\n}\n\n/** Output language of a generated project. */\nexport type Language = \"typescript\" | \"python\";\n\nexport interface TranslatorManifest {\n /** Schema version of this manifest file; see {@link MANIFEST_VERSION}. */\n manifestVersion: number;\n generator: string;\n generatorVersion: string;\n /** Output language; absent on legacy (pre-Python) manifests, treated as \"typescript\". */\n language?: Language;\n serverName: string;\n serverVersion: string;\n description?: string;\n transport: \"stdio\" | \"http\" | \"both\";\n servers: string[];\n securitySchemes: SecurityScheme[];\n sources: ManifestSource[];\n tools: ManifestTool[];\n}\n\nexport function manifestPath(projectDir: string): string {\n return path.join(projectDir, MANIFEST_FILENAME);\n}\n\nexport async function readManifest(projectDir: string): Promise<TranslatorManifest | null> {\n try {\n const text = await readFile(manifestPath(projectDir), \"utf8\");\n return JSON.parse(text) as TranslatorManifest;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw err;\n }\n}\n\nexport async function writeManifest(\n projectDir: string,\n manifest: TranslatorManifest,\n): Promise<void> {\n await writeFile(manifestPath(projectDir), JSON.stringify(manifest, null, 2) + \"\\n\", \"utf8\");\n}\n\n/** Stable key identifying an operation regardless of its assigned tool name. */\nexport function operationKey(method: string, opPath: string): string {\n return `${method.toUpperCase()} ${opPath}`;\n}\n","/** Generator version stamped into every generated project's manifest. */\nexport const GENERATOR_VERSION = \"0.1.0\";\nexport const GENERATOR_NAME = \"mcp-api-translator\";\n","/**\n * String templates for every file in a generated MCP-server project.\n *\n * Generated TypeScript deliberately uses double-quoted strings and avoids template literals so\n * these host-side templates don't have to escape nested backticks/`${}`. Multi-line docs (README,\n * client config) are built from arrays of lines for the same reason.\n */\nimport type { JsonSchema, SecurityScheme } from \"../ir/model.js\";\nimport { GENERATOR_NAME, GENERATOR_VERSION } from \"../version.js\";\n\nexport type Transport = \"stdio\" | \"http\" | \"both\";\n\nexport interface RequestPlanData {\n method: string;\n pathTemplate: string;\n pathParams: string[];\n queryParams: string[];\n headerParams: string[];\n cookieParams: string[];\n bodyParam: string | null;\n contentType: string | null;\n security: string[];\n}\n\nexport interface ToolEmit {\n name: string;\n method: string;\n path: string;\n description: string;\n inputSchema: JsonSchema;\n plan: RequestPlanData;\n sourceTitle: string;\n}\n\nconst GENERATED_BANNER = `// Generated by ${GENERATOR_NAME} v${GENERATOR_VERSION}. Safe to edit: tool files are\\n// preserved on re-generation/append unless --force is used.`;\n\nexport function packageJson(name: string, version: string, transport: Transport): string {\n const scripts: Record<string, string> = {\n build: \"tsc\",\n start: \"node dist/index.js\",\n };\n if (transport === \"http\" || transport === \"both\") {\n scripts[\"start:http\"] = \"node dist/index.http.js\";\n }\n const pkg = {\n name,\n version,\n private: true,\n type: \"module\",\n bin: { [name]: \"dist/index.js\" },\n scripts,\n dependencies: { \"@modelcontextprotocol/sdk\": \"^1.29.0\" },\n devDependencies: { typescript: \"^5.6.0\", \"@types/node\": \"^22.0.0\" },\n };\n return JSON.stringify(pkg, null, 2) + \"\\n\";\n}\n\nexport function tsconfigJson(): string {\n return (\n JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"NodeNext\",\n moduleResolution: \"NodeNext\",\n lib: [\"ES2022\"],\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: \"dist\",\n rootDir: \"src\",\n declaration: false,\n sourceMap: true,\n },\n include: [\"src\"],\n },\n null,\n 2,\n ) + \"\\n\"\n );\n}\n\nexport function gitignore(): string {\n return [\"node_modules/\", \"dist/\", \".env\", \"*.log\", \"\"].join(\"\\n\");\n}\n\nexport function typesTs(): string {\n return [\n GENERATED_BANNER,\n \"\",\n \"export interface ToolDef {\",\n \" name: string;\",\n \" description: string;\",\n \" inputSchema: Record<string, unknown>;\",\n \" handler: (args: Record<string, unknown>) => Promise<string>;\",\n \"}\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport function configTs(defaultBaseUrl: string): string {\n return [\n GENERATED_BANNER,\n \"\",\n \"export const config = {\",\n ` baseUrl: process.env.API_BASE_URL ?? ${JSON.stringify(defaultBaseUrl)},`,\n \"};\",\n \"\",\n ].join(\"\\n\");\n}\n\n/** Collapse whitespace/newlines so a spec-derived value can't break out of a `//` comment. */\nfunction commentSafe(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction authBlock(scheme: SecurityScheme): string[] {\n const lines: string[] = [];\n const guard = ` if (security.includes(${JSON.stringify(scheme.name)})) {`;\n const label = commentSafe(\n `${scheme.name} (${scheme.type}${scheme.scheme ? \"/\" + scheme.scheme : \"\"})`,\n );\n lines.push(` // ${label}`);\n lines.push(guard);\n if (scheme.type === \"apiKey\") {\n const env = scheme.envVars[0]!;\n const param = scheme.paramName ?? \"X-API-Key\";\n lines.push(` const value = process.env[${JSON.stringify(env)}];`);\n lines.push(\" if (value) {\");\n if (scheme.in === \"query\") {\n lines.push(` url.searchParams.set(${JSON.stringify(param)}, value);`);\n } else if (scheme.in === \"cookie\") {\n lines.push(\n ` headers[\"cookie\"] = (headers[\"cookie\"] ? headers[\"cookie\"] + \"; \" : \"\") + ${JSON.stringify(\n param + \"=\",\n )} + value;`,\n );\n } else {\n lines.push(` headers[${JSON.stringify(param)}] = value;`);\n }\n lines.push(\" }\");\n } else if (scheme.type === \"http\" && scheme.scheme?.toLowerCase() === \"basic\") {\n const [u, p] = scheme.envVars;\n lines.push(` const user = process.env[${JSON.stringify(u)}];`);\n lines.push(` const pass = process.env[${JSON.stringify(p)}];`);\n lines.push(\" if (user && pass) {\");\n lines.push(\n ' headers[\"authorization\"] = \"Basic \" + Buffer.from(user + \":\" + pass).toString(\"base64\");',\n );\n lines.push(\" }\");\n } else if (scheme.tokenUrl) {\n // oauth2 client-credentials: exchange a client id/secret for a bearer token.\n const [id, secret] = scheme.envVars;\n lines.push(` const clientId = process.env[${JSON.stringify(id)}];`);\n lines.push(` const clientSecret = process.env[${JSON.stringify(secret)}];`);\n lines.push(\" if (clientId && clientSecret) {\");\n lines.push(\n ` const token = await getClientCredentialsToken(${JSON.stringify(scheme.tokenUrl)}, clientId, clientSecret);`,\n );\n lines.push(' headers[\"authorization\"] = \"Bearer \" + token;');\n lines.push(\" }\");\n } else {\n // http bearer, oauth2, openIdConnect -> pre-obtained token.\n const env = scheme.envVars[0]!;\n lines.push(` const value = process.env[${JSON.stringify(env)}];`);\n lines.push(' if (value) headers[\"authorization\"] = \"Bearer \" + value;');\n }\n lines.push(\" }\");\n return lines;\n}\n\n/** Emitted token fetch + cache, only when a client-credentials scheme is present. */\nfunction oauthHelperTs(): string[] {\n return [\n \"const _tokenCache = new Map<string, { token: string; expiresAt: number }>();\",\n \"\",\n \"async function getClientCredentialsToken(\",\n \" tokenUrl: string,\",\n \" clientId: string,\",\n \" clientSecret: string,\",\n \"): Promise<string> {\",\n ' const key = tokenUrl + \"|\" + clientId;',\n \" const hit = _tokenCache.get(key);\",\n \" if (hit && hit.expiresAt > Date.now()) return hit.token;\",\n \" const body = new URLSearchParams({\",\n ' grant_type: \"client_credentials\",',\n \" client_id: clientId,\",\n \" client_secret: clientSecret,\",\n \" }).toString();\",\n \" const res = await fetch(tokenUrl, {\",\n ' method: \"POST\",',\n ' headers: { \"content-type\": \"application/x-www-form-urlencoded\" },',\n \" body,\",\n \" });\",\n \" const text = await res.text();\",\n \" if (!res.ok)\",\n ' throw new Error(\"OAuth token request failed: HTTP \" + res.status + \" \" + text.slice(0, 300));',\n \" const json = JSON.parse(text) as { access_token?: string; expires_in?: number };\",\n ' if (!json.access_token) throw new Error(\"OAuth token response had no access_token\");',\n ' const ttl = typeof json.expires_in === \"number\" ? json.expires_in : 3600;',\n \" _tokenCache.set(key, { token: json.access_token, expiresAt: Date.now() + ttl * 1000 - 30000 });\",\n \" return json.access_token;\",\n \"}\",\n \"\",\n ];\n}\n\nexport function authTs(schemes: SecurityScheme[]): string {\n const body = schemes.flatMap(authBlock);\n const hasOAuth = schemes.some((s) => s.tokenUrl);\n const signature = hasOAuth\n ? [\n \"export async function applyAuth(\",\n \" headers: Record<string, string>,\",\n \" url: URL,\",\n \" security: string[],\",\n \"): Promise<void> {\",\n ]\n : [\n \"export function applyAuth(\",\n \" headers: Record<string, string>,\",\n \" url: URL,\",\n \" security: string[],\",\n \"): void {\",\n ];\n return [\n GENERATED_BANNER,\n \"\",\n \"// Injects credentials read from the environment. Secrets are never embedded.\",\n ...(hasOAuth ? oauthHelperTs() : []),\n ...signature,\n ...(body.length > 0 ? body : [\" // No security schemes detected on the source API.\"]),\n \"}\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport function httpClientTs(): string {\n return [\n GENERATED_BANNER,\n \"\",\n 'import { config } from \"../config.js\";',\n 'import { applyAuth } from \"../auth.js\";',\n \"\",\n \"export interface RequestPlan {\",\n \" method: string;\",\n \" pathTemplate: string;\",\n \" pathParams: string[];\",\n \" queryParams: string[];\",\n \" headerParams: string[];\",\n \" cookieParams: string[];\",\n \" bodyParam: string | null;\",\n \" contentType: string | null;\",\n \" security: string[];\",\n \"}\",\n \"\",\n \"function joinUrl(base: string, path: string): string {\",\n ' if (!base) throw new Error(\"API base URL is not set. Set API_BASE_URL in the environment.\");',\n ' return base.replace(/\\\\/+$/, \"\") + \"/\" + path.replace(/^\\\\/+/, \"\");',\n \"}\",\n \"\",\n \"export async function callOperation(\",\n \" plan: RequestPlan,\",\n \" args: Record<string, unknown>,\",\n \"): Promise<string> {\",\n \" let path = plan.pathTemplate;\",\n \" for (const name of plan.pathParams) {\",\n \" const value = args[name];\",\n ' path = path.split(\"{\" + name + \"}\").join(encodeURIComponent(String(value ?? \"\")));',\n \" }\",\n \" const url = new URL(joinUrl(config.baseUrl, path));\",\n \" for (const name of plan.queryParams) {\",\n \" const value = args[name];\",\n \" if (value === undefined || value === null) continue;\",\n \" // Array query values are repeated (?k=1&k=2), the OpenAPI default (form/explode).\",\n \" if (Array.isArray(value)) {\",\n \" for (const v of value) {\",\n \" if (v !== undefined && v !== null) url.searchParams.append(name, String(v));\",\n \" }\",\n \" } else {\",\n \" url.searchParams.set(name, String(value));\",\n \" }\",\n \" }\",\n \" const headers: Record<string, string> = {};\",\n \" for (const name of plan.headerParams) {\",\n \" const value = args[name];\",\n \" if (value === undefined || value === null) continue;\",\n ' headers[name] = Array.isArray(value) ? value.map(String).join(\",\") : String(value);',\n \" }\",\n \" const cookies: string[] = [];\",\n \" for (const name of plan.cookieParams) {\",\n \" const value = args[name];\",\n \" if (value !== undefined && value !== null) {\",\n ' cookies.push(name + \"=\" + encodeURIComponent(String(value)));',\n \" }\",\n \" }\",\n \" if (cookies.length > 0) {\",\n ' headers[\"cookie\"] = (headers[\"cookie\"] ? headers[\"cookie\"] + \"; \" : \"\") + cookies.join(\"; \");',\n \" }\",\n \" let body: string | undefined;\",\n \" if (plan.bodyParam && args[plan.bodyParam] !== undefined) {\",\n \" const raw = args[plan.bodyParam];\",\n ' if (plan.contentType && plan.contentType.indexOf(\"json\") >= 0) {',\n ' headers[\"content-type\"] = \"application/json\";',\n \" body = JSON.stringify(raw);\",\n \" } else {\",\n ' if (plan.contentType) headers[\"content-type\"] = plan.contentType;',\n ' body = typeof raw === \"string\" ? raw : JSON.stringify(raw);',\n \" }\",\n \" }\",\n \" await applyAuth(headers, url, plan.security);\",\n \" const response = await fetch(url, { method: plan.method, headers, body });\",\n \" const text = await response.text();\",\n \" if (!response.ok) {\",\n ' throw new Error(\"HTTP \" + response.status + \" \" + response.statusText + \": \" + text.slice(0, 800));',\n \" }\",\n \" return text;\",\n \"}\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport function toolFileTs(tool: ToolEmit): string {\n return [\n GENERATED_BANNER,\n \"\",\n 'import type { ToolDef } from \"../types.js\";',\n 'import { callOperation } from \"../http/client.js\";',\n \"\",\n `const inputSchema = ${JSON.stringify(tool.inputSchema, null, 2)} as Record<string, unknown>;`,\n \"\",\n `const plan = ${JSON.stringify(tool.plan, null, 2)};`,\n \"\",\n `export const ${tool.name}: ToolDef = {`,\n ` name: ${JSON.stringify(tool.name)},`,\n ` description: ${JSON.stringify(tool.description)},`,\n \" inputSchema,\",\n \" handler: (args) => callOperation(plan, args),\",\n \"};\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport function toolsIndexTs(toolNames: string[]): string {\n const imports = toolNames.map((n) => `import { ${n} } from \"./${n}.js\";`);\n return [\n GENERATED_BANNER,\n \"\",\n 'import type { ToolDef } from \"../types.js\";',\n ...imports,\n \"\",\n `export const tools: ToolDef[] = [${toolNames.join(\", \")}];`,\n \"\",\n ].join(\"\\n\");\n}\n\nexport function serverTs(name: string, version: string): string {\n return [\n GENERATED_BANNER,\n \"\",\n 'import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";',\n \"import {\",\n \" ListToolsRequestSchema,\",\n \" CallToolRequestSchema,\",\n '} from \"@modelcontextprotocol/sdk/types.js\";',\n 'import { tools } from \"./tools/index.js\";',\n \"\",\n \"export function createServer(): Server {\",\n \" const server = new Server(\",\n ` { name: ${JSON.stringify(name)}, version: ${JSON.stringify(version)} },`,\n \" { capabilities: { tools: {} } },\",\n \" );\",\n \"\",\n \" server.setRequestHandler(ListToolsRequestSchema, async () => ({\",\n \" tools: tools.map((t) => ({\",\n \" name: t.name,\",\n \" description: t.description,\",\n \" inputSchema: t.inputSchema,\",\n \" })),\",\n \" }));\",\n \"\",\n \" server.setRequestHandler(CallToolRequestSchema, async (request) => {\",\n \" const tool = tools.find((t) => t.name === request.params.name);\",\n \" if (!tool) {\",\n \" return {\",\n ' content: [{ type: \"text\", text: \"Unknown tool: \" + request.params.name }],',\n \" isError: true,\",\n \" };\",\n \" }\",\n \" try {\",\n \" const text = await tool.handler(\",\n \" (request.params.arguments ?? {}) as Record<string, unknown>,\",\n \" );\",\n ' return { content: [{ type: \"text\", text }] };',\n \" } catch (err) {\",\n \" return {\",\n ' content: [{ type: \"text\", text: \"Error: \" + (err instanceof Error ? err.message : String(err)) }],',\n \" isError: true,\",\n \" };\",\n \" }\",\n \" });\",\n \"\",\n \" return server;\",\n \"}\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport function indexStdioTs(name: string): string {\n return [\n GENERATED_BANNER,\n \"\",\n 'import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";',\n 'import { createServer } from \"./server.js\";',\n \"\",\n \"async function main(): Promise<void> {\",\n \" const server = createServer();\",\n \" const transport = new StdioServerTransport();\",\n \" await server.connect(transport);\",\n ` console.error(${JSON.stringify(name + \" MCP server running on stdio\")});`,\n \"}\",\n \"\",\n \"main().catch((err) => {\",\n \" console.error(err);\",\n \" process.exit(1);\",\n \"});\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport function indexHttpTs(name: string): string {\n return [\n GENERATED_BANNER,\n \"\",\n 'import { createServer as createHttpServer } from \"node:http\";',\n 'import { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";',\n 'import { createServer } from \"./server.js\";',\n \"\",\n \"const port = Number(process.env.PORT ?? 3000);\",\n \"\",\n \"// DNS-rebinding protection: only accept requests whose Host header is in this allowlist, so a\",\n \"// malicious web page cannot rebind to localhost and drive this server. Override for non-local\",\n \"// deployments via MCP_ALLOWED_HOSTS (comma-separated host[:port] values).\",\n 'const defaultHosts = \"127.0.0.1:\" + port + \",localhost:\" + port;',\n \"const allowedHostList = (process.env.MCP_ALLOWED_HOSTS ?? defaultHosts)\",\n ' .split(\",\")',\n \" .map((h) => h.trim())\",\n \" .filter(Boolean);\",\n \"\",\n \"// Stateless Streamable HTTP: a fresh server+transport per request.\",\n \"createHttpServer(async (req, res) => {\",\n ' if (!req.url || !req.url.startsWith(\"/mcp\")) {',\n \" res.statusCode = 404;\",\n ' res.end(\"Not found\");',\n \" return;\",\n \" }\",\n \" const server = createServer();\",\n \" const transport = new StreamableHTTPServerTransport({\",\n \" sessionIdGenerator: undefined,\",\n \" enableDnsRebindingProtection: true,\",\n \" allowedHosts: allowedHostList,\",\n \" });\",\n ' res.on(\"close\", () => {',\n \" void transport.close();\",\n \" void server.close();\",\n \" });\",\n \" await server.connect(transport);\",\n \" await transport.handleRequest(req, res);\",\n \"}).listen(port, () => {\",\n ` console.error(${JSON.stringify(name + \" MCP server on http://localhost:\")} + port + \"/mcp\");`,\n \"});\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport function envExample(baseUrl: string, schemes: SecurityScheme[]): string {\n const lines = [\"# Environment for the generated MCP server.\", \"\"];\n lines.push(\"# Base URL of the upstream API.\");\n lines.push(`API_BASE_URL=${baseUrl || \"https://api.example.com\"}`);\n if (schemes.length > 0) {\n lines.push(\"\");\n lines.push(\"# Credentials (read at runtime; never commit real values).\");\n for (const s of schemes) {\n for (const v of s.envVars) lines.push(`${v}=`);\n }\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nexport function serverJson(name: string, version: string, description: string): string {\n // Minimal MCP Registry-style manifest the user can adapt before publishing.\n const manifest = {\n $schema: \"https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json\",\n name: `io.github.OWNER/${name}`,\n description,\n version,\n packages: [\n {\n registryType: \"npm\",\n identifier: name,\n version,\n transport: { type: \"stdio\" },\n },\n ],\n };\n return JSON.stringify(manifest, null, 2) + \"\\n\";\n}\n\nexport function clientConfigMd(name: string): string {\n return [\n \"# Add this server to an MCP client\",\n \"\",\n \"After `npm install && npm run build`, register the server.\",\n \"\",\n \"## Claude Desktop / Claude Code (`mcp.json` or `claude_desktop_config.json`)\",\n \"\",\n \"```json\",\n \"{\",\n ' \"mcpServers\": {',\n ` \"${name}\": {`,\n ' \"command\": \"node\",',\n ` \"args\": [\"./dist/index.js\"],`,\n ' \"env\": {',\n ' \"API_BASE_URL\": \"https://api.example.com\"',\n \" }\",\n \" }\",\n \" }\",\n \"}\",\n \"```\",\n \"\",\n \"## Cursor (`.cursor/mcp.json`) and Codex use the same `mcpServers` shape.\",\n \"\",\n \"Set any required credential env vars (see `.env.example`).\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport interface ReadmeData {\n serverName: string;\n apiTitle: string;\n toolCount: number;\n schemes: SecurityScheme[];\n transport: Transport;\n}\n\nexport function readmeMd(data: ReadmeData): string {\n const envLines = data.schemes.flatMap((s) => s.envVars).map((v) => \"- `\" + v + \"`\");\n const lines = [\n `# ${data.serverName}`,\n \"\",\n `An MCP server for **${data.apiTitle}**, generated by [${GENERATOR_NAME}](https://github.com/krishgok/mcp-api-translator).`,\n `It exposes ${data.toolCount} tool(s) that call the upstream API directly.`,\n \"\",\n \"## Quickstart\",\n \"\",\n \"```bash\",\n \"npm install\",\n \"npm run build\",\n \"cp .env.example .env # then fill in values\",\n \"npm start # runs over stdio\",\n \"```\",\n \"\",\n \"## Configuration\",\n \"\",\n \"- `API_BASE_URL` — base URL of the upstream API.\",\n ...(envLines.length > 0 ? [\"\", \"Credentials:\", ...envLines] : []),\n \"\",\n \"## Connecting a client\",\n \"\",\n \"See `client-config.md` for ready-to-paste Claude / Cursor / Codex config.\",\n \"\",\n ...(data.transport === \"http\" || data.transport === \"both\"\n ? [\n \"## HTTP transport\",\n \"\",\n \"```bash\",\n \"npm run start:http # Streamable HTTP on PORT (default 3000) at /mcp\",\n \"```\",\n \"\",\n ]\n : []),\n \"## Publishing for discovery\",\n \"\",\n \"Edit `server.json` (set your owner/namespace) and publish to the official MCP Registry\",\n \"so AI clients can discover this server.\",\n \"\",\n \"## Regenerating / extending\",\n \"\",\n \"This project carries a `.mcp-translator.json` manifest. Point mcp-api-translator's\",\n \"`extend_mcp_server` tool at this directory with another spec to add more tools; your\",\n \"hand-edited tool files are preserved.\",\n \"\",\n ];\n return lines.join(\"\\n\");\n}\n\nexport function dockerfile(): string {\n return [\n \"# Build stage: needs devDependencies (typescript) to compile.\",\n \"FROM node:20-alpine AS build\",\n \"WORKDIR /app\",\n \"COPY package*.json ./\",\n \"RUN npm install\",\n \"COPY . .\",\n \"RUN npm run build\",\n \"\",\n \"# Runtime stage: production deps only, runs as the non-root 'node' user.\",\n \"FROM node:20-alpine\",\n \"ENV NODE_ENV=production\",\n \"WORKDIR /app\",\n \"COPY package*.json ./\",\n \"RUN npm install --omit=dev && npm cache clean --force\",\n \"COPY --from=build /app/dist ./dist\",\n \"USER node\",\n 'CMD [\"node\", \"dist/index.js\"]',\n \"\",\n ].join(\"\\n\");\n}\n","/**\n * String templates for a generated **Python** MCP-server project.\n *\n * Mirrors the TypeScript emitter (`templates.ts`) one-for-one so behavior matches: low-level MCP\n * Python SDK, raw JSON-Schema tool inputs (no lossy conversion), env-based auth, stdlib `urllib`\n * for HTTP (the only third-party dependency is `mcp`). Spec-derived strings are JSON-encoded — a\n * JSON string literal is also a valid Python string literal — and comments are newline-stripped.\n */\nimport type { JsonSchema, SecurityScheme } from \"../ir/model.js\";\nimport { GENERATOR_NAME, GENERATOR_VERSION } from \"../version.js\";\n\nconst BANNER = `# Generated by ${GENERATOR_NAME} v${GENERATOR_VERSION}. Safe to edit.`;\n\n/** A serializable tool record written to tools.json and loaded at runtime. */\nexport interface PyTool {\n name: string;\n description: string;\n inputSchema: JsonSchema;\n plan: unknown;\n}\n\n/** Collapse whitespace so a spec-derived value can't break out of a `#` comment. */\nfunction commentSafe(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\n/** Python package name: importable, lower_snake, never leading-digit. */\nexport function toPackageModule(serverName: string): string {\n let mod = serverName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n if (mod.length === 0) mod = \"api_mcp\";\n if (/^[0-9]/.test(mod)) mod = `pkg_${mod}`;\n return mod;\n}\n\nexport function pyprojectToml(name: string, version: string, pkg: string): string {\n return [\n \"[project]\",\n `name = ${JSON.stringify(name)}`,\n `version = ${JSON.stringify(version)}`,\n 'requires-python = \">=3.10\"',\n 'dependencies = [\"mcp>=1.2.0\", \"anyio>=4.0\"]',\n \"\",\n \"[project.scripts]\",\n `${name} = \"${pkg}.__main__:run\"`,\n \"\",\n \"[build-system]\",\n 'requires = [\"hatchling\"]',\n 'build-backend = \"hatchling.build\"',\n \"\",\n \"[tool.hatch.build.targets.wheel]\",\n `packages = [\"${pkg}\"]`,\n \"\",\n ].join(\"\\n\");\n}\n\nexport function gitignorePy(): string {\n return [\"__pycache__/\", \"*.pyc\", \".venv/\", \".env\", \"dist/\", \"*.egg-info/\", \"\"].join(\"\\n\");\n}\n\nexport function initPy(): string {\n return `${BANNER}\\n\"\"\"Generated MCP server package.\"\"\"\\n`;\n}\n\nexport function configPy(defaultBaseUrl: string): string {\n return [\n BANNER,\n \"import os\",\n \"\",\n `BASE_URL = os.environ.get(\"API_BASE_URL\", ${JSON.stringify(defaultBaseUrl)})`,\n \"\",\n ].join(\"\\n\");\n}\n\nfunction authBlockPy(scheme: SecurityScheme): string[] {\n const lines: string[] = [];\n const label = commentSafe(\n `${scheme.name} (${scheme.type}${scheme.scheme ? \"/\" + scheme.scheme : \"\"})`,\n );\n lines.push(` # ${label}`);\n lines.push(` if ${JSON.stringify(scheme.name)} in security:`);\n if (scheme.type === \"apiKey\") {\n const env = scheme.envVars[0]!;\n const param = scheme.paramName ?? \"X-API-Key\";\n lines.push(` value = os.environ.get(${JSON.stringify(env)})`);\n lines.push(\" if value:\");\n if (scheme.in === \"query\") {\n lines.push(` query[${JSON.stringify(param)}] = value`);\n } else if (scheme.in === \"cookie\") {\n lines.push(\n ` headers[\"cookie\"] = (headers[\"cookie\"] + \"; \" if headers.get(\"cookie\") else \"\") + ${JSON.stringify(\n param + \"=\",\n )} + value`,\n );\n } else {\n lines.push(` headers[${JSON.stringify(param)}] = value`);\n }\n } else if (scheme.type === \"http\" && scheme.scheme?.toLowerCase() === \"basic\") {\n const [u, p] = scheme.envVars;\n lines.push(` user = os.environ.get(${JSON.stringify(u)})`);\n lines.push(` password = os.environ.get(${JSON.stringify(p)})`);\n lines.push(\" if user and password:\");\n lines.push(' token = base64.b64encode((user + \":\" + password).encode()).decode()');\n lines.push(' headers[\"authorization\"] = \"Basic \" + token');\n } else if (scheme.tokenUrl) {\n // oauth2 client-credentials: exchange a client id/secret for a bearer token.\n const [id, secret] = scheme.envVars;\n lines.push(` client_id = os.environ.get(${JSON.stringify(id)})`);\n lines.push(` client_secret = os.environ.get(${JSON.stringify(secret)})`);\n lines.push(\" if client_id and client_secret:\");\n lines.push(\n ` token = _get_token(${JSON.stringify(scheme.tokenUrl)}, client_id, client_secret)`,\n );\n lines.push(' headers[\"authorization\"] = \"Bearer \" + token');\n } else {\n // http bearer, oauth2, openIdConnect -> pre-obtained token.\n const env = scheme.envVars[0]!;\n lines.push(` value = os.environ.get(${JSON.stringify(env)})`);\n lines.push(\" if value:\");\n lines.push(' headers[\"authorization\"] = \"Bearer \" + value');\n }\n return lines;\n}\n\n/** Emitted token fetch + cache, only when a client-credentials scheme is present. */\nfunction oauthHelperPy(): string[] {\n return [\n \"_token_cache = {}\",\n \"\",\n \"\",\n \"def _get_token(token_url, client_id, client_secret):\",\n \" key = token_url + '|' + client_id\",\n \" cached = _token_cache.get(key)\",\n \" if cached and cached[1] > time.time():\",\n \" return cached[0]\",\n \" data = urllib.parse.urlencode(\",\n ' {\"grant_type\": \"client_credentials\", \"client_id\": client_id, \"client_secret\": client_secret}',\n \" ).encode()\",\n \" req = urllib.request.Request(\",\n \" token_url,\",\n \" data=data,\",\n ' headers={\"content-type\": \"application/x-www-form-urlencoded\"},',\n ' method=\"POST\",',\n \" )\",\n \" with urllib.request.urlopen(req) as resp:\",\n \" payload = json.loads(resp.read().decode())\",\n ' token = payload.get(\"access_token\")',\n \" if not token:\",\n ' raise RuntimeError(\"OAuth token response had no access_token\")',\n ' ttl = payload.get(\"expires_in\", 3600)',\n \" _token_cache[key] = (token, time.time() + ttl - 30)\",\n \" return token\",\n \"\",\n ];\n}\n\nexport function authPy(schemes: SecurityScheme[]): string {\n const body = schemes.flatMap(authBlockPy);\n const hasOAuth = schemes.some((s) => s.tokenUrl);\n const imports = hasOAuth\n ? [\n \"import base64\",\n \"import json\",\n \"import os\",\n \"import time\",\n \"import urllib.parse\",\n \"import urllib.request\",\n ]\n : [\"import base64\", \"import os\"];\n return [\n BANNER,\n ...imports,\n \"\",\n \"\",\n ...(hasOAuth ? oauthHelperPy() : []),\n ...(hasOAuth ? [\"\"] : []),\n \"def apply_auth(headers, query, security):\",\n ' \"\"\"Inject env-backed credentials. Secrets are never embedded.\"\"\"',\n ...(body.length > 0\n ? body\n : [\" # No security schemes detected on the source API.\", \" pass\"]),\n \"\",\n ].join(\"\\n\");\n}\n\nexport function httpClientPy(): string {\n return [\n BANNER,\n \"import json\",\n \"import urllib.error\",\n \"import urllib.parse\",\n \"import urllib.request\",\n \"\",\n \"from .auth import apply_auth\",\n \"from .config import BASE_URL\",\n \"\",\n \"\",\n \"def call_operation(plan, args):\",\n \" if not BASE_URL:\",\n ' raise RuntimeError(\"API base URL is not set. Set API_BASE_URL in the environment.\")',\n ' path = plan[\"pathTemplate\"]',\n ' for name in plan[\"pathParams\"]:',\n \" value = args.get(name)\",\n ' encoded = urllib.parse.quote(str(value if value is not None else \"\"), safe=\"\")',\n ' path = path.replace(\"{\" + name + \"}\", encoded)',\n \" query = {}\",\n ' for name in plan[\"queryParams\"]:',\n \" value = args.get(name)\",\n \" if value is not None:\",\n \" query[name] = str(value)\",\n \" headers = {}\",\n ' for name in plan[\"headerParams\"]:',\n \" value = args.get(name)\",\n \" if value is not None:\",\n \" headers[name] = str(value)\",\n \" data = None\",\n ' body_param = plan.get(\"bodyParam\")',\n \" if body_param and args.get(body_param) is not None:\",\n \" raw = args[body_param]\",\n ' content_type = plan.get(\"contentType\")',\n ' if content_type and \"json\" in content_type:',\n ' headers[\"content-type\"] = \"application/json\"',\n \" data = json.dumps(raw).encode()\",\n \" else:\",\n \" if content_type:\",\n ' headers[\"content-type\"] = content_type',\n \" data = raw.encode() if isinstance(raw, str) else json.dumps(raw).encode()\",\n ' apply_auth(headers, query, plan[\"security\"])',\n ' url = BASE_URL.rstrip(\"/\") + \"/\" + path.lstrip(\"/\")',\n \" if query:\",\n ' url += \"?\" + urllib.parse.urlencode(query)',\n ' request = urllib.request.Request(url, data=data, headers=headers, method=plan[\"method\"])',\n \" try:\",\n \" with urllib.request.urlopen(request) as response:\",\n \" return response.read().decode()\",\n \" except urllib.error.HTTPError as error:\",\n \" detail = error.read().decode()[:800]\",\n ' raise RuntimeError(\"HTTP \" + str(error.code) + \": \" + detail)',\n \"\",\n ].join(\"\\n\");\n}\n\nexport function toolsPy(): string {\n return [\n BANNER,\n \"import json\",\n \"import pathlib\",\n \"\",\n 'TOOLS = json.loads((pathlib.Path(__file__).parent / \"tools.json\").read_text())',\n \"\",\n ].join(\"\\n\");\n}\n\nexport function serverPy(name: string): string {\n return [\n BANNER,\n \"import mcp.types as types\",\n \"from mcp.server.lowlevel import Server\",\n \"\",\n \"from .http_client import call_operation\",\n \"from .tools import TOOLS\",\n \"\",\n `server = Server(${JSON.stringify(name)})`,\n \"\",\n \"\",\n \"@server.list_tools()\",\n \"async def list_tools():\",\n \" return [\",\n ' types.Tool(name=t[\"name\"], description=t[\"description\"], inputSchema=t[\"inputSchema\"])',\n \" for t in TOOLS\",\n \" ]\",\n \"\",\n \"\",\n \"@server.call_tool()\",\n \"async def call_tool(name, arguments):\",\n ' tool = next((t for t in TOOLS if t[\"name\"] == name), None)',\n \" if tool is None:\",\n ' return [types.TextContent(type=\"text\", text=\"Unknown tool: \" + name)]',\n \" try:\",\n ' text = call_operation(tool[\"plan\"], arguments or {})',\n ' return [types.TextContent(type=\"text\", text=text)]',\n \" except Exception as error: # noqa: BLE001\",\n ' return [types.TextContent(type=\"text\", text=\"Error: \" + str(error))]',\n \"\",\n ].join(\"\\n\");\n}\n\nexport function mainPy(): string {\n return [\n BANNER,\n \"import anyio\",\n \"from mcp.server.stdio import stdio_server\",\n \"\",\n \"from .server import server\",\n \"\",\n \"\",\n \"async def main():\",\n \" async with stdio_server() as (read_stream, write_stream):\",\n \" await server.run(read_stream, write_stream, server.create_initialization_options())\",\n \"\",\n \"\",\n \"def run():\",\n \" anyio.run(main)\",\n \"\",\n \"\",\n 'if __name__ == \"__main__\":',\n \" run()\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport function dockerfilePy(pkg: string): string {\n return [\n \"FROM python:3.12-slim\",\n \"WORKDIR /app\",\n \"COPY . .\",\n \"RUN pip install --no-cache-dir .\",\n `CMD [\"python\", \"-m\", \"${pkg}\"]`,\n \"\",\n ].join(\"\\n\");\n}\n\nexport interface PyReadmeData {\n serverName: string;\n pkg: string;\n apiTitle: string;\n toolCount: number;\n schemes: SecurityScheme[];\n}\n\nexport function readmePy(data: PyReadmeData): string {\n const envLines = data.schemes.flatMap((s) => s.envVars).map((v) => \"- `\" + v + \"`\");\n return [\n `# ${data.serverName}`,\n \"\",\n `A Python MCP server for **${data.apiTitle}**, generated by ${GENERATOR_NAME}.`,\n `It exposes ${data.toolCount} tool(s) that call the upstream API directly.`,\n \"\",\n \"## Quickstart\",\n \"\",\n \"```bash\",\n \"python -m venv .venv && source .venv/bin/activate\",\n \"pip install -e .\",\n \"cp .env.example .env # then fill in values\",\n `python -m ${data.pkg} # runs over stdio`,\n \"```\",\n \"\",\n \"## Configuration\",\n \"\",\n \"- `API_BASE_URL` — base URL of the upstream API.\",\n ...(envLines.length > 0 ? [\"\", \"Credentials:\", ...envLines] : []),\n \"\",\n \"## Connecting a client\",\n \"\",\n \"```json\",\n \"{\",\n ' \"mcpServers\": {',\n ` \"${data.serverName}\": {`,\n ' \"command\": \"python\",',\n ` \"args\": [\"-m\", \"${data.pkg}\"],`,\n ' \"env\": { \"API_BASE_URL\": \"https://api.example.com\" }',\n \" }\",\n \" }\",\n \"}\",\n \"```\",\n \"\",\n ].join(\"\\n\");\n}\n","/** Builds the mcp-api-translator MCP server and registers its tools. */\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerTools } from \"./tools.js\";\nimport { GENERATOR_NAME, GENERATOR_VERSION } from \"./version.js\";\n\nexport function createServer(): McpServer {\n const server = new McpServer({\n name: GENERATOR_NAME,\n version: GENERATOR_VERSION,\n });\n registerTools(server);\n return server;\n}\n","/**\n * The four MCP tools exposed by mcp-api-translator itself.\n *\n * Kept intentionally small: analyze (preview without writing), generate (scaffold a project),\n * extend (append to an existing project), and an introspection tool. All spec inputs accept inline\n * text or a local file path, in JSON or YAML.\n */\nimport { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { parseSource, SUPPORTED_FORMATS, type SourceInput } from \"./parsers/index.js\";\nimport { curate, TOOL_COUNT_WARN_THRESHOLD } from \"./curation/index.js\";\nimport { appendToProject, generateProject, type EmitSummary } from \"./emitters/project.js\";\nimport type { FilterOptions } from \"./curation/filter.js\";\n\nconst sourceShape = {\n spec: z.string().optional().describe(\"Inline spec text (OpenAPI or Postman; JSON or YAML).\"),\n specPath: z.string().optional().describe(\"Path to a local spec file (JSON or YAML).\"),\n format: z\n .enum([\"openapi\", \"postman\", \"auto\"])\n .optional()\n .describe(\"Force a format; defaults to auto-detect.\"),\n};\n\nconst filterShape = {\n includeTags: z.array(z.string()).optional().describe(\"Keep only operations with these tags.\"),\n excludeOperations: z\n .array(z.string())\n .optional()\n .describe(\"Drop operations by operationId, tool name, or tag.\"),\n methods: z\n .array(z.string())\n .optional()\n .describe(\"Keep only these HTTP methods, e.g. [GET, POST].\"),\n pathGlob: z.string().optional().describe('Keep only matching paths, e.g. \"/v1/**\".'),\n};\n\nfunction text(value: string): CallToolResult {\n return { content: [{ type: \"text\", text: value }] };\n}\n\nfunction filtersFrom(args: Record<string, unknown>): FilterOptions {\n return {\n includeTags: args.includeTags as string[] | undefined,\n excludeOperations: args.excludeOperations as string[] | undefined,\n methods: args.methods as string[] | undefined,\n pathGlob: args.pathGlob as string | undefined,\n };\n}\n\nfunction sourceFrom(args: Record<string, unknown>): SourceInput {\n return {\n spec: args.spec as string | undefined,\n specPath: args.specPath as string | undefined,\n format: args.format as SourceInput[\"format\"],\n };\n}\n\nfunction summaryText(verb: string, s: EmitSummary): string {\n const lines = [\n `${verb} MCP server \"${s.serverName}\" at ${s.projectDir}`,\n `Tools added: ${s.toolsAdded} | skipped: ${s.toolsSkipped} | total now: ${s.totalTools}`,\n \"\",\n \"Files written:\",\n ...s.files.map((f) => ` - ${f}`),\n ];\n if (s.warnings.length > 0) lines.push(\"\", \"Warnings:\", ...s.warnings.map((w) => ` ! ${w}`));\n lines.push(\n \"\",\n \"Next steps:\",\n ` cd ${s.projectDir}`,\n \" npm install && npm run build\",\n \" cp .env.example .env # fill in API_BASE_URL and any credentials\",\n \" npm start\",\n \" # See client-config.md to add it to Claude / Cursor / Codex.\",\n );\n return lines.join(\"\\n\");\n}\n\nexport function registerTools(server: McpServer): void {\n server.registerTool(\n \"analyze_spec\",\n {\n title: \"Analyze API spec (preview)\",\n description:\n \"Parse an OpenAPI or Postman spec and preview the MCP tools that would be generated, \" +\n \"without writing any files. Use this to curate (filter/inspect) before generating.\",\n inputSchema: { ...sourceShape, ...filterShape },\n },\n async (args): Promise<CallToolResult> => {\n const model = await parseSource(sourceFrom(args));\n const { operations, filteredOut } = curate(model, filtersFrom(args));\n const report = {\n title: model.title,\n version: model.version,\n sourceFormat: model.sourceFormat,\n servers: model.servers,\n authSchemes: model.securitySchemes.map((s) => ({\n name: s.name,\n type: s.type,\n envVars: s.envVars,\n })),\n operationsTotal: model.operations.length,\n operationsKept: operations.length,\n operationsFilteredOut: filteredOut,\n proposedTools: operations.map((op) => ({\n name: op.toolName,\n method: op.method,\n path: op.path,\n summary: op.summary ?? \"\",\n })),\n };\n const warn =\n operations.length > TOOL_COUNT_WARN_THRESHOLD\n ? `\\n\\n! ${operations.length} tools exceed the ${TOOL_COUNT_WARN_THRESHOLD}-tool guideline; consider includeTags / methods / pathGlob.`\n : \"\";\n return text(JSON.stringify(report, null, 2) + warn);\n },\n );\n\n server.registerTool(\n \"generate_mcp_server\",\n {\n title: \"Generate MCP server\",\n description:\n \"Generate a complete, runnable TypeScript MCP server project from an OpenAPI or Postman \" +\n \"spec. Writes the project to outputDir. Use force to overwrite a non-empty directory.\",\n inputSchema: {\n ...sourceShape,\n outputDir: z.string().describe(\"Directory to write the generated project into.\"),\n serverName: z\n .string()\n .optional()\n .describe(\"npm/package name; defaults from the API title.\"),\n serverVersion: z.string().optional(),\n language: z\n .enum([\"typescript\", \"python\"])\n .optional()\n .describe(\"Output language. Defaults to typescript.\"),\n transport: z\n .enum([\"stdio\", \"http\", \"both\"])\n .optional()\n .describe(\"Transport(s) to generate (TypeScript only). Defaults to stdio.\"),\n force: z.boolean().optional().describe(\"Overwrite a non-empty / existing project.\"),\n ...filterShape,\n },\n },\n async (args): Promise<CallToolResult> => {\n const model = await parseSource(sourceFrom(args));\n const summary = await generateProject(model, {\n outputDir: args.outputDir as string,\n serverName: args.serverName as string | undefined,\n serverVersion: args.serverVersion as string | undefined,\n language: args.language as \"typescript\" | \"python\" | undefined,\n transport: args.transport as \"stdio\" | \"http\" | \"both\" | undefined,\n force: args.force as boolean | undefined,\n filters: filtersFrom(args),\n });\n return text(summaryText(\"Generated\", summary));\n },\n );\n\n server.registerTool(\n \"extend_mcp_server\",\n {\n title: \"Extend an existing generated MCP server\",\n description:\n \"Append the operations from another spec to an already-generated project (identified by \" +\n \"its .mcp-translator.json manifest). Idempotent: operations already present are skipped, \" +\n \"and hand-edited tool files are preserved unless force is set. Enables aggregating multiple \" +\n \"APIs into one MCP server.\",\n inputSchema: {\n projectDir: z.string().describe(\"Path to an existing generated project.\"),\n ...sourceShape,\n force: z.boolean().optional().describe(\"Overwrite existing tool files of the same name.\"),\n ...filterShape,\n },\n },\n async (args): Promise<CallToolResult> => {\n const model = await parseSource(sourceFrom(args));\n const summary = await appendToProject(model, {\n projectDir: args.projectDir as string,\n force: args.force as boolean | undefined,\n filters: filtersFrom(args),\n });\n return text(summaryText(\"Extended\", summary));\n },\n );\n\n server.registerTool(\n \"list_supported_features\",\n {\n title: \"List supported features\",\n description:\n \"Report the input formats, auth schemes, transports, and limits this tool supports.\",\n inputSchema: {},\n },\n async (): Promise<CallToolResult> => {\n const features = {\n inputFormats: SUPPORTED_FORMATS,\n outputLanguages: [\"typescript\", \"python\"],\n modes: {\n generate: \"Scaffold an ownable TypeScript MCP-server project (generate_mcp_server).\",\n serve:\n \"Run a live runtime proxy, no codegen: `mcp-api-translator serve --spec <path>` mounts the spec's operations as MCP tools in-process (repeat --spec to aggregate multiple APIs).\",\n },\n transports: [\"stdio\", \"http\", \"both\"],\n authSchemes: [\n \"apiKey (header/query/cookie)\",\n \"http bearer\",\n \"http basic\",\n \"oauth2 (client-credentials grant, or pre-obtained token)\",\n ],\n curation: [\"includeTags\", \"excludeOperations\", \"methods\", \"pathGlob\"],\n append: true,\n toolCountWarnThreshold: TOOL_COUNT_WARN_THRESHOLD,\n limitations: [\n \"OAuth2 client-credentials grant is supported (token fetched + cached); no interactive authorization-code flows.\",\n \"Generated handlers return JSON/text; no upstream streaming or auto-pagination.\",\n \"Postman parameter types are inferred from examples.\",\n \"Output quality tracks spec quality (operationIds, descriptions).\",\n ],\n };\n return text(JSON.stringify(features, null, 2));\n },\n );\n}\n","/**\n * OAuth2 client-credentials token acquisition + cache for the runtime proxy.\n *\n * When a scheme carries a token endpoint, the proxy exchanges a client id/secret for a short-lived\n * bearer token (grant_type=client_credentials) and caches it until shortly before it expires, so\n * repeated tool calls don't re-hit the token endpoint. Mirrors what the generated `auth` module does.\n */\nimport type { FetchLike } from \"./client.js\";\n\ninterface CacheEntry {\n token: string;\n /** Epoch ms after which the token must be refreshed. */\n expiresAt: number;\n}\n\nconst cache = new Map<string, CacheEntry>();\n\n/** Refresh this many ms before the stated expiry, to avoid using a just-expired token. */\nconst EARLY_REFRESH_MS = 30_000;\nconst DEFAULT_TTL_SECONDS = 3600;\n\n/** Fetch (or return a cached) client-credentials access token for the given endpoint + client. */\nexport async function getClientCredentialsToken(\n tokenUrl: string,\n clientId: string,\n clientSecret: string,\n fetchImpl: FetchLike,\n now: () => number = () => Date.now(),\n): Promise<string> {\n const key = `${tokenUrl}|${clientId}`;\n const hit = cache.get(key);\n if (hit && hit.expiresAt > now()) return hit.token;\n\n const body = new URLSearchParams({\n grant_type: \"client_credentials\",\n client_id: clientId,\n client_secret: clientSecret,\n }).toString();\n const response = await fetchImpl(new URL(tokenUrl), {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body,\n });\n const text = await response.text();\n if (!response.ok) {\n throw new Error(`OAuth token request failed: HTTP ${response.status} ${text.slice(0, 300)}`);\n }\n const json = JSON.parse(text) as { access_token?: string; expires_in?: number };\n if (!json.access_token) throw new Error(\"OAuth token response had no access_token\");\n const ttl = typeof json.expires_in === \"number\" ? json.expires_in : DEFAULT_TTL_SECONDS;\n cache.set(key, { token: json.access_token, expiresAt: now() + ttl * 1000 - EARLY_REFRESH_MS });\n return json.access_token;\n}\n\n/** Clear the token cache (tests only). */\nexport function clearTokenCache(): void {\n cache.clear();\n}\n","/**\n * In-process HTTP executor for the runtime proxy (`serve` mode).\n *\n * This is the no-codegen twin of the emitted `src/http/client.ts` + `src/auth.ts`: it runs the\n * exact same RequestPlan the generator would have written, so a mounted operation behaves\n * identically whether you `serve` it live or `generate` and run the code. Credentials are read\n * from the environment at call time and never stored.\n */\nimport type { SecurityScheme } from \"../ir/model.js\";\nimport type { RequestPlanData } from \"../emitters/templates.js\";\nimport { getClientCredentialsToken } from \"./oauth.js\";\n\nexport interface RuntimeContext {\n /** Resolved upstream base URL (env override or the spec's first server). */\n baseUrl: string;\n /** Schemes whose env vars carry the credentials this operation may need. */\n securitySchemes: SecurityScheme[];\n /** Environment to read credentials from (injected for testability). */\n env: Record<string, string | undefined>;\n /**\n * Per-source env namespace for aggregated servers, e.g. \"SWAGGER_PETSTORE\". When set, a\n * credential is read from `<namespace>_<VAR>` first, falling back to the bare `<VAR>`.\n */\n sourceNamespace?: string;\n}\n\n/** Minimal fetch surface so tests can inject a stub without a real network. */\nexport type FetchLike = (\n url: URL,\n init: { method: string; headers: Record<string, string>; body?: string },\n) => Promise<{ ok: boolean; status: number; statusText: string; text: () => Promise<string> }>;\n\nfunction joinUrl(base: string, path: string): string {\n if (!base) throw new Error(\"API base URL is not set. Set API_BASE_URL in the environment.\");\n return base.replace(/\\/+$/, \"\") + \"/\" + path.replace(/^\\/+/, \"\");\n}\n\n/** Inject env-backed credentials for every scheme this operation declares. */\nasync function applyAuth(\n headers: Record<string, string>,\n url: URL,\n security: string[],\n ctx: RuntimeContext,\n fetchImpl: FetchLike,\n): Promise<void> {\n // Per-source namespace wins over the bare var, so aggregated APIs don't share one credential.\n const readEnv = (name: string): string | undefined =>\n (ctx.sourceNamespace ? ctx.env[`${ctx.sourceNamespace}_${name}`] : undefined) ?? ctx.env[name];\n for (const scheme of ctx.securitySchemes) {\n if (!security.includes(scheme.name)) continue;\n if (scheme.type === \"apiKey\") {\n const value = readEnv(scheme.envVars[0]!);\n if (!value) continue;\n const param = scheme.paramName ?? \"X-API-Key\";\n if (scheme.in === \"query\") {\n url.searchParams.set(param, value);\n } else if (scheme.in === \"cookie\") {\n headers[\"cookie\"] =\n (headers[\"cookie\"] ? headers[\"cookie\"] + \"; \" : \"\") + param + \"=\" + value;\n } else {\n headers[param] = value;\n }\n } else if (scheme.type === \"http\" && scheme.scheme?.toLowerCase() === \"basic\") {\n const [u, p] = scheme.envVars;\n const user = readEnv(u!);\n const pass = readEnv(p!);\n if (user && pass) {\n headers[\"authorization\"] = \"Basic \" + Buffer.from(user + \":\" + pass).toString(\"base64\");\n }\n } else if (scheme.tokenUrl) {\n // oauth2 client-credentials: envVars = [CLIENT_ID, CLIENT_SECRET] -> fetch a bearer token.\n const clientId = readEnv(scheme.envVars[0]!);\n const clientSecret = readEnv(scheme.envVars[1]!);\n if (clientId && clientSecret) {\n const token = await getClientCredentialsToken(\n scheme.tokenUrl,\n clientId,\n clientSecret,\n fetchImpl,\n );\n headers[\"authorization\"] = \"Bearer \" + token;\n }\n } else {\n // http bearer, oauth2, openIdConnect -> pre-obtained token.\n const value = readEnv(scheme.envVars[0]!);\n if (value) headers[\"authorization\"] = \"Bearer \" + value;\n }\n }\n}\n\n/** Execute one operation's request plan against the live upstream and return the response text. */\nexport async function executePlan(\n plan: RequestPlanData,\n args: Record<string, unknown>,\n ctx: RuntimeContext,\n fetchImpl: FetchLike = fetch as unknown as FetchLike,\n): Promise<string> {\n let path = plan.pathTemplate;\n for (const name of plan.pathParams) {\n const value = args[name];\n path = path.split(\"{\" + name + \"}\").join(encodeURIComponent(String(value ?? \"\")));\n }\n const url = new URL(joinUrl(ctx.baseUrl, path));\n for (const name of plan.queryParams) {\n const value = args[name];\n if (value === undefined || value === null) continue;\n // Array query values are repeated (?k=1&k=2), the OpenAPI default (form/explode).\n if (Array.isArray(value)) {\n for (const v of value) {\n if (v !== undefined && v !== null) url.searchParams.append(name, String(v));\n }\n } else {\n url.searchParams.set(name, String(value));\n }\n }\n const headers: Record<string, string> = {};\n for (const name of plan.headerParams) {\n const value = args[name];\n if (value === undefined || value === null) continue;\n headers[name] = Array.isArray(value) ? value.map(String).join(\",\") : String(value);\n }\n const cookies: string[] = [];\n for (const name of plan.cookieParams) {\n const value = args[name];\n if (value !== undefined && value !== null) {\n cookies.push(name + \"=\" + encodeURIComponent(String(value)));\n }\n }\n if (cookies.length > 0) {\n headers[\"cookie\"] = (headers[\"cookie\"] ? headers[\"cookie\"] + \"; \" : \"\") + cookies.join(\"; \");\n }\n let body: string | undefined;\n if (plan.bodyParam && args[plan.bodyParam] !== undefined) {\n const raw = args[plan.bodyParam];\n if (plan.contentType && plan.contentType.indexOf(\"json\") >= 0) {\n headers[\"content-type\"] = \"application/json\";\n body = JSON.stringify(raw);\n } else {\n if (plan.contentType) headers[\"content-type\"] = plan.contentType;\n body = typeof raw === \"string\" ? raw : JSON.stringify(raw);\n }\n }\n await applyAuth(headers, url, plan.security, ctx, fetchImpl);\n const response = await fetchImpl(url, { method: plan.method, headers, body });\n const text = await response.text();\n if (!response.ok) {\n throw new Error(\n \"HTTP \" + response.status + \" \" + response.statusText + \": \" + text.slice(0, 800),\n );\n }\n return text;\n}\n","/**\n * Runtime proxy: expose a spec's operations as live MCP tools in-process — no code generation.\n *\n * `serve` mode mounts one or more {@link ApiModel}s into an {@link ApiProxy} and serves them over a\n * low-level MCP Server. Each tool advertises the same raw JSON-Schema input the generator would have\n * emitted (no lossy zod round-trip) and executes via the shared runtime client, so behavior matches\n * the generated server exactly. Mounting several specs aggregates multiple APIs into one server.\n */\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { CallToolRequestSchema, ListToolsRequestSchema } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ApiModel, JsonSchema, SecurityScheme } from \"../ir/model.js\";\nimport { curate, TOOL_COUNT_WARN_THRESHOLD } from \"../curation/index.js\";\nimport type { FilterOptions } from \"../curation/filter.js\";\nimport { operationToToolEmit } from \"../emitters/project.js\";\nimport { envNamespace } from \"../parsers/security.js\";\nimport { executePlan, type FetchLike, type RuntimeContext } from \"./client.js\";\nimport type { RequestPlanData } from \"../emitters/templates.js\";\nimport { GENERATOR_NAME, GENERATOR_VERSION } from \"../version.js\";\n\ninterface MountedTool {\n name: string;\n description: string;\n inputSchema: JsonSchema;\n plan: RequestPlanData;\n /** This API's first declared server, used unless API_BASE_URL overrides it. */\n defaultBaseUrl: string;\n securitySchemes: SecurityScheme[];\n /** Per-source env namespace (from the API title) for base URL + credential resolution. */\n sourceNamespace: string;\n}\n\nexport interface MountResult {\n mounted: number;\n /** Operations dropped by filters. */\n filteredOut: number;\n toolNames: string[];\n warnings: string[];\n /** Env namespace for this source (from its title). */\n sourceNamespace: string;\n /** Per-source env vars this API reads (base URL + credentials), each with a bare-name fallback. */\n envVars: string[];\n}\n\n/** Holds the live tool set across one or more mounted APIs. */\nexport class ApiProxy {\n private readonly tools = new Map<string, MountedTool>();\n\n /** Curate a model's operations and register them as live tools (deduping names across mounts). */\n mount(model: ApiModel, filters: FilterOptions = {}): MountResult {\n const reserved = new Set(this.tools.keys());\n const { operations, filteredOut } = curate(model, filters, reserved);\n const defaultBaseUrl = model.servers[0] ?? \"\";\n const sourceNamespace = envNamespace(model.title);\n const added: string[] = [];\n for (const op of operations) {\n const emit = operationToToolEmit(op, model.title);\n this.tools.set(emit.name, {\n name: emit.name,\n description: emit.description,\n inputSchema: emit.inputSchema,\n plan: emit.plan,\n defaultBaseUrl,\n securitySchemes: model.securitySchemes,\n sourceNamespace,\n });\n added.push(emit.name);\n }\n const warnings =\n this.tools.size > TOOL_COUNT_WARN_THRESHOLD\n ? [\n `This proxy now exposes ${this.tools.size} tools (> ${TOOL_COUNT_WARN_THRESHOLD}). Large tool counts hurt model tool-selection; narrow with includeTags / methods / pathGlob / excludeOperations, or rely on a client that supports dynamic tool discovery (e.g. Tool Search).`,\n ]\n : [];\n const envVars = [\n `${sourceNamespace}_API_BASE_URL`,\n ...model.securitySchemes.flatMap((s) => s.envVars).map((v) => `${sourceNamespace}_${v}`),\n ];\n return {\n mounted: added.length,\n filteredOut,\n toolNames: added,\n warnings,\n sourceNamespace,\n envVars,\n };\n }\n\n /** Tool descriptors for an MCP `tools/list` response. */\n listTools(): Array<{ name: string; description: string; inputSchema: JsonSchema }> {\n return [...this.tools.values()].map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n }));\n }\n\n get size(): number {\n return this.tools.size;\n }\n\n /** Execute a mounted tool against the live upstream. */\n async call(\n name: string,\n args: Record<string, unknown>,\n env: Record<string, string | undefined>,\n fetchImpl?: FetchLike,\n ): Promise<string> {\n const tool = this.tools.get(name);\n if (!tool) throw new Error(`Unknown tool: ${name}`);\n // Base URL: per-source override wins, then the global override, then the spec's own server.\n const baseUrl =\n env[`${tool.sourceNamespace}_API_BASE_URL`] ?? env.API_BASE_URL ?? tool.defaultBaseUrl;\n const ctx: RuntimeContext = {\n baseUrl,\n securitySchemes: tool.securitySchemes,\n env,\n sourceNamespace: tool.sourceNamespace,\n };\n return executePlan(tool.plan, args, ctx, fetchImpl);\n }\n}\n\n/** Build a low-level MCP Server backed by an {@link ApiProxy}. Mount specs before connecting. */\nexport function createProxyServer(): { server: Server; proxy: ApiProxy } {\n const proxy = new ApiProxy();\n const server = new Server(\n { name: `${GENERATOR_NAME}-proxy`, version: GENERATOR_VERSION },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: proxy.listTools() }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n try {\n const text = await proxy.call(\n request.params.name,\n (request.params.arguments ?? {}) as Record<string, unknown>,\n process.env,\n );\n return { content: [{ type: \"text\" as const, text }] };\n } catch (err) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Error: \" + (err instanceof Error ? err.message : String(err)),\n },\n ],\n isError: true,\n };\n }\n });\n\n return { server, proxy };\n}\n"],"mappings":"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","names":["path","HTTP_METHODS","path","path","name","text","writeFile","readFile","path","text","readFile","text","commentSafe","path","writeFile","readFile","text","path","text","text"]}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/runtime/cli.ts"],"sourcesContent":["/**\
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/runtime/cli.ts"],"sourcesContent":["/**\n * Entry point.\n *\n * Default (no args): run the mcp-api-translator meta-server over stdio (the 4 generator tools).\n * `serve` subcommand: run a runtime proxy that mounts spec(s) as live tools — no codegen.\n */\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { runServe } from \"./runtime/cli.js\";\n\nasync function runMeta(): Promise<void> {\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"mcp-api-translator running on stdio\");\n}\n\nasync function main(): Promise<void> {\n const [mode, ...rest] = process.argv.slice(2);\n if (mode === \"serve\") {\n await runServe(rest);\n } else {\n await runMeta();\n }\n}\n\nmain().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n","/**\n * `serve` mode CLI: launch a runtime proxy MCP server over stdio for one or more specs.\n *\n * mcp-api-translator serve --spec ./api.yaml [--spec ./other.yaml] [filters]\n *\n * Filters mirror the curation options: --include-tag, --methods, --path-glob, --exclude\n * (repeat --spec / --include-tag / --exclude to pass several). No files are written.\n */\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { parseSource } from \"../parsers/index.js\";\nimport type { FilterOptions } from \"../curation/filter.js\";\nimport { createProxyServer } from \"./server.js\";\n\ninterface ServeArgs {\n specs: string[];\n format?: \"openapi\" | \"postman\" | \"auto\";\n filters: FilterOptions;\n}\n\n/** Parse `serve` argv (everything after the `serve` subcommand). */\nexport function parseServeArgs(argv: string[]): ServeArgs {\n const specs: string[] = [];\n const includeTags: string[] = [];\n const excludeOperations: string[] = [];\n let methods: string[] | undefined;\n let pathGlob: string | undefined;\n let format: ServeArgs[\"format\"] | undefined;\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i]!;\n const next = (): string => {\n const v = argv[++i];\n if (v === undefined) throw new Error(`Missing value for ${arg}`);\n return v;\n };\n switch (arg) {\n case \"--spec\":\n specs.push(next());\n break;\n case \"--include-tag\":\n includeTags.push(next());\n break;\n case \"--exclude\":\n excludeOperations.push(next());\n break;\n case \"--methods\":\n methods = next()\n .split(\",\")\n .map((m) => m.trim())\n .filter(Boolean);\n break;\n case \"--path-glob\":\n pathGlob = next();\n break;\n case \"--format\": {\n const f = next();\n if (f !== \"openapi\" && f !== \"postman\" && f !== \"auto\") {\n throw new Error(`--format must be openapi, postman, or auto (got \"${f}\")`);\n }\n format = f;\n break;\n }\n default:\n throw new Error(`Unknown serve option: ${arg}`);\n }\n }\n\n if (specs.length === 0) {\n throw new Error(\"serve requires at least one --spec <path>.\");\n }\n\n const filters: FilterOptions = {};\n if (includeTags.length) filters.includeTags = includeTags;\n if (excludeOperations.length) filters.excludeOperations = excludeOperations;\n if (methods) filters.methods = methods;\n if (pathGlob) filters.pathGlob = pathGlob;\n\n return { specs, format, filters };\n}\n\n/** Mount every requested spec and serve them live over stdio. */\nexport async function runServe(argv: string[]): Promise<void> {\n const { specs, format, filters } = parseServeArgs(argv);\n const { server, proxy } = createProxyServer();\n\n for (const specPath of specs) {\n const model = await parseSource({ specPath, format });\n const result = proxy.mount(model, filters);\n console.error(\n `mounted ${result.mounted} tool(s) from \"${model.title}\" (${specPath})` +\n (result.filteredOut ? `, ${result.filteredOut} filtered out` : \"\"),\n );\n if (specs.length > 1) {\n // When aggregating, each API has its own env namespace so credentials don't collide.\n console.error(` env for this API (bare names also work): ${result.envVars.join(\", \")}`);\n }\n for (const w of result.warnings) console.error(` ! ${w}`);\n }\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(`mcp-api-translator proxy serving ${proxy.size} tool(s) on stdio`);\n}\n"],"mappings":"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","names":["StdioServerTransport","StdioServerTransport"]}
|