@powerduck/openapi-mcp-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/core/spec-utils.ts","../src/core/openapi-loader.ts","../src/core/tool-generator.ts","../src/registry/prompt-registry.ts","../src/registry/resource-registry.ts","../src/core/request-builder.ts","../src/core/global-utils.ts","../src/core/http-executor.ts","../src/mcp/create-server.ts","../src/mcp/transport-stdio.ts","../src/mcp/transport-http.ts","../src/server/auth.ts","../src/config/config-store.ts","../src/runtime/service-registry.ts","../src/server/admin-server.ts"],"names":["isPlainObject","loadYaml","validate","dereference","fs","media","cached","output","path","MAX_DESCRIPTION_LENGTH","indexCache","buildIndex","randomUUID","axios","AxiosHeaders","data","McpError","ErrorCode","Server","ListToolsRequestSchema","CallToolRequestSchema","ListPromptsRequestSchema","GetPromptRequestSchema","ListResourcesRequestSchema","ListResourceTemplatesRequestSchema","ReadResourceRequestSchema","StdioServerTransport","describe","StreamableHTTPServerTransport","isInitializeRequest","SSEServerTransport","createHash","timingSafeEqual","os","fileURLToPath","express","cors","multer","createServer"],"mappings":"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","file":"index.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import type { ParameterLocation } from \"@/types\";\nimport type {\n Document,\n OperationObject,\n ParameterObject,\n PathItemObject,\n} from \"@scalar/openapi-types/3.2\";\n\n/**\n * HTTP methods recognized as operations inside a Path Item Object.\n *\n * `query` is included because the 2025 HTTP QUERY method is a first-class\n * operation key in OpenAPI 3.2. Any other key on a path item (summary,\n * description, servers, parameters, $ref, vendor extensions, and the 3.2\n * `additionalOperations` map) must never be treated as a standard operation.\n */\nexport const HTTP_METHODS = [\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"options\",\n \"head\",\n \"patch\",\n \"trace\",\n \"query\",\n] as const;\n\nexport type HttpMethod = (typeof HTTP_METHODS)[number];\n\nconst HTTP_METHOD_SET: ReadonlySet<string> = new Set<string>(HTTP_METHODS);\n\n/**\n * Path Item keys that are structural metadata rather than operations. Used to\n * avoid emitting spurious issues while walking a path item.\n */\nconst PATH_ITEM_METADATA_KEYS: ReadonlySet<string> = new Set([\n \"$ref\",\n \"summary\",\n \"description\",\n \"servers\",\n \"parameters\",\n \"additionalOperations\",\n]);\n\n/** Parameter locations this library can map onto an HTTP request. */\nexport const PARAMETER_LOCATIONS = [\n \"path\",\n \"query\",\n \"header\",\n \"cookie\",\n] as const;\n\nconst PARAMETER_LOCATION_SET: ReadonlySet<string> = new Set<string>(\n PARAMETER_LOCATIONS,\n);\n\n/**\n * Locations that OpenAPI 3.2 defines but this library does not map onto tool\n * arguments. They are recognized explicitly so the operator gets a precise\n * warning instead of a silently dropped parameter.\n */\nconst KNOWN_UNSUPPORTED_LOCATIONS: ReadonlySet<string> = new Set([\n \"querystring\",\n]);\n\n/**\n * Header names that must never become tool arguments: they are controlled by\n * the transport layer, and letting a model set them breaks the request.\n */\nconst RESERVED_HEADER_NAMES: ReadonlySet<string> = new Set([\n \"accept\",\n \"content-type\",\n \"authorization\",\n \"host\",\n \"content-length\",\n \"connection\",\n \"transfer-encoding\",\n]);\n\n/**\n * Practical upper bound for a generated identifier. Several MCP clients reject\n * or visually truncate longer tool names, so the generator needs a documented\n * limit to work against.\n */\nexport const MAX_GENERATED_NAME_LENGTH = 64;\n\n/**\n * A parameter validated to carry the fields this library relies on.\n *\n * The upstream `ParameterObject` type is a union (schema form vs. content\n * form), so it is normalized into a single permissive shape after runtime\n * validation.\n */\nexport interface NormalizedParameter {\n name: string;\n in: ParameterLocation;\n required: boolean;\n description?: string | undefined;\n deprecated?: boolean | undefined;\n style?: string | undefined;\n explode?: boolean | undefined;\n allowReserved?: boolean | undefined;\n allowEmptyValue?: boolean | undefined;\n /** Present when the parameter uses the `schema` form. */\n schema?: Record<string, unknown> | undefined;\n /** Present when the parameter uses the `content` form. */\n content?: Record<string, unknown> | undefined;\n /** Media type selected from `content`, when the content form is used. */\n contentMediaType?: string | undefined;\n /** True when the transport owns this value and it must not be exposed. */\n reserved?: boolean | undefined;\n /** The original object, kept for callers that need untouched data. */\n raw: ParameterObject;\n}\n\n/** A single resolved operation together with its owning path item. */\nexport interface ResolvedOperation {\n path: string;\n /**\n * Lower-cased HTTP method. Normally a {@link HttpMethod}, but may be any\n * token when it originates from the OpenAPI 3.2 `additionalOperations` map.\n */\n method: string;\n operation: OperationObject;\n pathItem: PathItemObject;\n /** Guaranteed non-empty and unique across the document. */\n operationId: string;\n /** True when the id was synthesized because the document omitted it. */\n operationIdGenerated: boolean;\n /** False when the method came from `additionalOperations`. */\n isStandardMethod: boolean;\n}\n\n/**\n * Public alias kept for library consumers. `ResolvedOperation` is the internal\n * name; both refer to the exact same shape.\n */\nexport type OperationEntry = ResolvedOperation;\n\n/** Codes attached to non-fatal problems found while walking a document. */\nexport type SpecWalkIssueCode =\n | \"invalid-paths-object\"\n | \"invalid-path-template\"\n | \"invalid-path-item\"\n | \"invalid-operation\"\n | \"invalid-parameter\"\n | \"unsupported-parameter-location\"\n | \"reserved-parameter\"\n | \"unresolved-ref\"\n | \"duplicate-operation-id\"\n | \"generated-operation-id\"\n | \"truncated-operation-id\";\n\n/** Non-fatal issues collected while walking the document. */\nexport interface SpecWalkIssue {\n path: string;\n method?: string | undefined;\n code: SpecWalkIssueCode;\n message: string;\n}\n\n/** Sink that tolerates being absent, so callers never need a temporary array. */\ntype IssueSink = SpecWalkIssue[] | undefined;\n\nfunction report(sink: IssueSink, issue: SpecWalkIssue): void {\n sink?.push(issue);\n}\n\nexport function isPlainObject(\n value: unknown,\n): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Returns true when the value still carries an unresolved JSON Reference. */\nexport function isReference(value: unknown): boolean {\n return isPlainObject(value) && typeof value.$ref === \"string\";\n}\n\n/**\n * Deterministic, dependency-free 32-bit hash (FNV-1a). Used only to keep\n * truncated identifiers unique and stable across runs; it is never used for\n * anything security relevant.\n */\nfunction stableDigest(input: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < input.length; index += 1) {\n hash ^= input.charCodeAt(index);\n // 32-bit FNV prime multiplication without overflowing into float space.\n hash = Math.imul(hash, 0x01000193) >>> 0;\n }\n return hash.toString(36).padStart(7, \"0\").slice(0, 7);\n}\n\n/**\n * Shortens an identifier to {@link MAX_GENERATED_NAME_LENGTH} while preserving\n * uniqueness by appending a hash of the original value.\n */\nexport function truncateGeneratedName(\n name: string,\n limit: number = MAX_GENERATED_NAME_LENGTH,\n): string {\n if (name.length <= limit) return name;\n const digest = stableDigest(name);\n const keep = Math.max(1, limit - digest.length - 1);\n return `${name.slice(0, keep).replace(/_+$/, \"\")}_${digest}`;\n}\n\n/**\n * Extracts the `{name}` template variables from a path template.\n * Duplicates are collapsed; order follows first appearance.\n */\nexport function extractPathTemplateVariables(pathTemplate: string): string[] {\n const found = new Set<string>();\n const pattern = /\\{([^{}/]+)\\}/g;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(pathTemplate)) !== null) {\n const name = match[1]?.trim();\n if (name) found.add(name);\n }\n return [...found];\n}\n\n/** Picks the media type to use for a parameter expressed in `content` form. */\nfunction selectContentMediaType(\n content: Record<string, unknown>,\n): string | undefined {\n const keys = Object.keys(content);\n if (keys.length === 0) return undefined;\n // The spec allows exactly one entry; prefer JSON if a tolerant document\n // supplies several.\n const json = keys.find((key) => /\\bjson\\b/i.test(key));\n return json ?? keys[0];\n}\n\n/**\n * Normalizes a raw parameter entry. Returns null when the entry is unusable,\n * which happens for unresolved references, missing `name` / `in`, unsupported\n * locations, or a malformed schema/content combination.\n */\nexport function normalizeParameter(\n candidate: unknown,\n): NormalizedParameter | null {\n if (!isPlainObject(candidate)) return null;\n if (isReference(candidate)) return null;\n\n const name = candidate.name;\n const location = candidate.in;\n if (typeof name !== \"string\" || name.trim().length === 0) return null;\n if (typeof location !== \"string\") return null;\n if (!PARAMETER_LOCATION_SET.has(location)) return null;\n\n const hasSchema = isPlainObject(candidate.schema);\n const hasContent =\n isPlainObject(candidate.content) &&\n Object.keys(candidate.content as Record<string, unknown>).length > 0;\n // The spec requires exactly one of `schema` or `content`. Accepting both\n // would make the request builder's behaviour depend on evaluation order.\n if (hasSchema && hasContent) return null;\n\n // Path parameters are required by definition; the spec mandates\n // required=true, but tolerant documents omit it, so it is forced here rather\n // than trusted from input.\n const trimmedName = name.trim();\n const required = location === \"path\" ? true : candidate.required === true;\n\n const normalized: NormalizedParameter = {\n name: trimmedName,\n in: location as ParameterLocation,\n required,\n raw: candidate as ParameterObject,\n };\n\n if (\n location === \"header\" &&\n RESERVED_HEADER_NAMES.has(trimmedName.toLowerCase())\n ) {\n normalized.reserved = true;\n }\n\n if (typeof candidate.description === \"string\") {\n normalized.description = candidate.description;\n }\n if (typeof candidate.deprecated === \"boolean\") {\n normalized.deprecated = candidate.deprecated;\n }\n if (typeof candidate.style === \"string\") normalized.style = candidate.style;\n if (typeof candidate.explode === \"boolean\") {\n normalized.explode = candidate.explode;\n }\n if (typeof candidate.allowReserved === \"boolean\") {\n normalized.allowReserved = candidate.allowReserved;\n }\n if (typeof candidate.allowEmptyValue === \"boolean\") {\n normalized.allowEmptyValue = candidate.allowEmptyValue;\n }\n if (hasSchema) {\n normalized.schema = candidate.schema as Record<string, unknown>;\n }\n if (hasContent) {\n const content = candidate.content as Record<string, unknown>;\n normalized.content = content;\n const mediaType = selectContentMediaType(content);\n if (mediaType) normalized.contentMediaType = mediaType;\n }\n\n return normalized;\n}\n\n/**\n * Effective style for a parameter, applying the defaults mandated by the spec\n * when the document does not state one explicitly.\n */\nexport function effectiveStyle(parameter: NormalizedParameter): string {\n if (parameter.style) return parameter.style;\n switch (parameter.in) {\n case \"query\":\n case \"cookie\":\n return \"form\";\n case \"path\":\n case \"header\":\n default:\n return \"simple\";\n }\n}\n\n/** Effective explode flag. The spec default is true only when style is `form`. */\nexport function effectiveExplode(parameter: NormalizedParameter): boolean {\n if (typeof parameter.explode === \"boolean\") return parameter.explode;\n return effectiveStyle(parameter) === \"form\";\n}\n\n/**\n * Merges path-item level parameters with operation level parameters.\n *\n * Per the specification the merge key is the pair (name, in), and an operation\n * level entry overrides an inherited one. Entries that cannot be normalized are\n * dropped and reported through `issues` instead of silently corrupting output.\n */\nexport function collectOperationParameters(\n pathItem: PathItemObject | undefined,\n operation: OperationObject | undefined,\n issues?: SpecWalkIssue[],\n context?: { path: string; method: string },\n): NormalizedParameter[] {\n const merged = new Map<string, NormalizedParameter>();\n const contextPath = context?.path ?? \"\";\n const contextMethod = context?.method;\n\n const absorb = (list: unknown, origin: \"path-item\" | \"operation\"): void => {\n if (list === undefined || list === null) return;\n if (!Array.isArray(list)) {\n report(issues, {\n path: contextPath,\n method: contextMethod,\n code: \"invalid-parameter\",\n message: `The ${origin} \"parameters\" field is not an array and was ignored.`,\n });\n return;\n }\n\n for (const entry of list) {\n const normalized = normalizeParameter(entry);\n if (!normalized) {\n const location = isPlainObject(entry) ? entry.in : undefined;\n if (\n typeof location === \"string\" &&\n KNOWN_UNSUPPORTED_LOCATIONS.has(location)\n ) {\n report(issues, {\n path: contextPath,\n method: contextMethod,\n code: \"unsupported-parameter-location\",\n message: `Parameter location \"${location}\" is not supported and was skipped.`,\n });\n continue;\n }\n report(issues, {\n path: contextPath,\n method: contextMethod,\n code: isReference(entry) ? \"unresolved-ref\" : \"invalid-parameter\",\n message: `Skipped an unusable ${origin} parameter entry.`,\n });\n continue;\n }\n\n if (normalized.reserved) {\n report(issues, {\n path: contextPath,\n method: contextMethod,\n code: \"reserved-parameter\",\n message: `Header parameter \"${normalized.name}\" is managed by the transport and will not be exposed as an argument.`,\n });\n }\n\n merged.set(`${normalized.in}:${normalized.name}`, normalized);\n }\n };\n\n absorb(pathItem?.parameters, \"path-item\");\n absorb(operation?.parameters, \"operation\");\n\n return [...merged.values()];\n}\n\n/**\n * Builds a deterministic, identifier-safe fallback name for an operation that\n * omits `operationId`. The result is stable across runs for the same document,\n * which matters because tool names are persisted by clients.\n */\nexport function synthesizeOperationId(\n method: string,\n pathTemplate: string,\n): string {\n const segments = pathTemplate\n .split(\"/\")\n .map((segment) => segment.trim())\n .filter(Boolean)\n .map((segment) => {\n const templated = segment.match(/^\\{(.+)\\}$/);\n if (templated) return `by_${templated[1]}`;\n return segment;\n })\n .map((segment) => segment.replace(/[^A-Za-z0-9]+/g, \"_\"))\n .map((segment) => segment.replace(/^_+|_+$/g, \"\"))\n .filter(Boolean);\n\n const safeMethod =\n method\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\") || \"call\";\n\n const base = [safeMethod, ...segments].join(\"_\");\n const cleaned = base.replace(/_{2,}/g, \"_\").replace(/^_+|_+$/g, \"\");\n return cleaned || `${safeMethod}_root`;\n}\n\n/**\n * Ensures a candidate name is unique within `taken` by appending a numeric\n * suffix, and registers the result. The original name is returned untouched\n * when it is already free.\n */\nexport function ensureUniqueName(\n candidate: string,\n taken: Set<string>,\n): string {\n if (!taken.has(candidate)) {\n taken.add(candidate);\n return candidate;\n }\n let counter = 2;\n let next = `${candidate}_${counter}`;\n while (taken.has(next)) {\n counter += 1;\n next = `${candidate}_${counter}`;\n }\n taken.add(next);\n return next;\n}\n\n/** Reads a path item's 3.2 `additionalOperations` map, if present and usable. */\nfunction readAdditionalOperations(\n pathItem: Record<string, unknown>,\n): Array<[string, unknown]> {\n const extra = pathItem.additionalOperations;\n if (!isPlainObject(extra)) return [];\n return Object.entries(extra);\n}\n\n/**\n * Walks every operation in the document.\n *\n * Guarantees for consumers:\n * - only operation keys are yielded, never path item metadata;\n * - OpenAPI 3.2 `additionalOperations` entries are included, flagged via\n * `isStandardMethod: false`;\n * - malformed path items and operations are skipped, never thrown on;\n * - `operationId` is always a non-empty string, unique across the document,\n * and no longer than {@link MAX_GENERATED_NAME_LENGTH}.\n *\n * Non-fatal problems are appended to `issues` when the caller supplies an array.\n */\nexport function* iterateOperations(\n spec: Document | null | undefined,\n issues?: SpecWalkIssue[],\n): Generator<ResolvedOperation> {\n if (!spec) return;\n if (spec.paths === undefined || spec.paths === null) return;\n if (!isPlainObject(spec.paths)) {\n report(issues, {\n path: \"\",\n code: \"invalid-paths-object\",\n message: 'The document\\'s \"paths\" field is not an object.',\n });\n return;\n }\n\n const usedIds = new Set<string>();\n\n for (const [pathTemplate, rawPathItem] of Object.entries(spec.paths)) {\n // Vendor extensions at the paths level must be ignored.\n if (pathTemplate.startsWith(\"x-\")) continue;\n\n if (!pathTemplate.startsWith(\"/\")) {\n report(issues, {\n path: pathTemplate,\n code: \"invalid-path-template\",\n message: 'Path templates must start with \"/\"; entry was skipped.',\n });\n continue;\n }\n\n if (!isPlainObject(rawPathItem)) {\n report(issues, {\n path: pathTemplate,\n code: \"invalid-path-item\",\n message: \"Path item is not an object and was skipped.\",\n });\n continue;\n }\n if (isReference(rawPathItem)) {\n report(issues, {\n path: pathTemplate,\n code: \"unresolved-ref\",\n message: \"Path item still contains an unresolved $ref and was skipped.\",\n });\n continue;\n }\n\n const pathItem = rawPathItem as PathItemObject;\n\n const candidates: Array<{\n key: string;\n value: unknown;\n standard: boolean;\n }> = [];\n\n for (const [key, value] of Object.entries(rawPathItem)) {\n if (key.startsWith(\"x-\")) continue;\n if (PATH_ITEM_METADATA_KEYS.has(key)) continue;\n if (!HTTP_METHOD_SET.has(key.toLowerCase())) continue;\n candidates.push({ key: key.toLowerCase(), value, standard: true });\n }\n\n for (const [key, value] of readAdditionalOperations(rawPathItem)) {\n const method = key.trim().toLowerCase();\n if (!method) continue;\n // A standard method repeated here would create two tools for one route.\n if (candidates.some((candidate) => candidate.key === method)) continue;\n candidates.push({ key: method, value, standard: false });\n }\n\n for (const { key: method, value: rawOperation, standard } of candidates) {\n if (!isPlainObject(rawOperation)) {\n report(issues, {\n path: pathTemplate,\n method,\n code: \"invalid-operation\",\n message: \"Operation is not an object and was skipped.\",\n });\n continue;\n }\n if (isReference(rawOperation)) {\n report(issues, {\n path: pathTemplate,\n method,\n code: \"unresolved-ref\",\n message:\n \"Operation still contains an unresolved $ref and was skipped.\",\n });\n continue;\n }\n\n const operation = rawOperation as OperationObject;\n const declaredId =\n typeof (operation as { operationId?: unknown }).operationId === \"string\"\n ? (operation as { operationId: string }).operationId.trim()\n : \"\";\n\n let generated = false;\n let candidate = declaredId;\n if (!candidate) {\n candidate = synthesizeOperationId(method, pathTemplate);\n generated = true;\n report(issues, {\n path: pathTemplate,\n method,\n code: \"generated-operation-id\",\n message: `Missing operationId; generated \"${candidate}\".`,\n });\n }\n\n const capped = truncateGeneratedName(candidate);\n if (capped !== candidate) {\n report(issues, {\n path: pathTemplate,\n method,\n code: \"truncated-operation-id\",\n message: `operationId \"${candidate}\" exceeded ${MAX_GENERATED_NAME_LENGTH} characters and was shortened to \"${capped}\".`,\n });\n }\n\n const operationId = ensureUniqueName(capped, usedIds);\n if (operationId !== capped) {\n report(issues, {\n path: pathTemplate,\n method,\n code: \"duplicate-operation-id\",\n message: `Duplicate operationId \"${capped}\"; renamed to \"${operationId}\".`,\n });\n }\n\n yield {\n path: pathTemplate,\n method,\n operation,\n pathItem,\n operationId,\n operationIdGenerated: generated,\n isStandardMethod: standard,\n };\n }\n }\n}\n\n/** Convenience wrapper returning a materialized array. */\nexport function listOperations(\n spec: Document | null | undefined,\n issues?: SpecWalkIssue[],\n): ResolvedOperation[] {\n return [...iterateOperations(spec, issues)];\n}\n\n/**\n * Reads the operationId exactly as declared by the document, or an empty\n * string when it is absent or blank.\n */\nfunction declaredOperationId(entry: ResolvedOperation): string {\n const value = (entry.operation as { operationId?: unknown }).operationId;\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\n/** Pre-computed lookup structures for one parsed document. */\nexport interface OperationIndex {\n operations: ResolvedOperation[];\n /** Keyed by the effective id, which is what clients see as the tool name. */\n byOperationId: Map<string, ResolvedOperation>;\n /**\n * Keyed by the id declared in the document. Only unambiguous entries are\n * present: a declared id claimed by several operations, or one that another\n * operation already owns as its effective id, is excluded.\n */\n byDeclaredId: Map<string, ResolvedOperation>;\n}\n\n/**\n * Cache keyed by the parsed document instance. A new object is produced each\n * time a specification is applied, so entries become collectable as soon as the\n * previous document is dropped.\n */\nconst indexCache = new WeakMap<Document, OperationIndex>();\n\nfunction buildIndex(spec: Document): OperationIndex {\n const operations = listOperations(spec);\n const byOperationId = new Map<string, ResolvedOperation>();\n for (const entry of operations) {\n // iterateOperations already guarantees uniqueness of the effective id.\n byOperationId.set(entry.operationId, entry);\n }\n\n const declaredCounts = new Map<string, number>();\n for (const entry of operations) {\n const declared = declaredOperationId(entry);\n if (!declared) continue;\n declaredCounts.set(declared, (declaredCounts.get(declared) ?? 0) + 1);\n }\n\n const byDeclaredId = new Map<string, ResolvedOperation>();\n for (const entry of operations) {\n const declared = declaredOperationId(entry);\n if (!declared) continue;\n if (declaredCounts.get(declared) !== 1) continue;\n // Never let a declared id shadow another operation's effective id.\n if (byOperationId.has(declared)) continue;\n byDeclaredId.set(declared, entry);\n }\n\n return { operations, byOperationId, byDeclaredId };\n}\n\n/** Returns the cached lookup index for a document, building it on first use. */\nexport function getOperationIndex(\n spec: Document | null | undefined,\n): OperationIndex {\n if (!spec) {\n return {\n operations: [],\n byOperationId: new Map(),\n byDeclaredId: new Map(),\n };\n }\n const cached = indexCache.get(spec);\n if (cached) return cached;\n const built = buildIndex(spec);\n indexCache.set(spec, built);\n return built;\n}\n\n/**\n * Locates an operation by id, in O(1) after the first call.\n *\n * The effective id produced by {@link iterateOperations} always wins, because\n * that is the name the tool generator exposes and therefore the only value a\n * client can legitimately send. A declared id is consulted only as a fallback,\n * and only when it is unambiguous — otherwise a document mixing declared and\n * synthesized ids could route a call to the wrong endpoint without any error.\n *\n * Returns null instead of throwing: an unknown id is a caller-level condition\n * (bad tool name), not a malformed document.\n */\nexport function findOperationById(\n spec: Document | null | undefined,\n operationId: string,\n): OperationEntry | null {\n if (typeof operationId !== \"string\") return null;\n const target = operationId.trim();\n if (!target) return null;\n\n const index = getOperationIndex(spec);\n return (\n index.byOperationId.get(target) ?? index.byDeclaredId.get(target) ?? null\n );\n}\n\n/** Describes one operationId claimed by more than one operation. */\nexport interface DuplicateOperationId {\n operationId: string;\n occurrences: Array<{ method: string; path: string }>;\n}\n\n/**\n * Reports every operationId declared more than once. Synthesized ids are\n * excluded because they are derived from method + path and are unique by\n * construction; only author-declared ids can collide.\n *\n * This is a validation helper, not part of the generation path — tool naming\n * already de-duplicates via {@link ensureUniqueName}, so a duplicate id\n * degrades the tool names rather than breaking the server. Use it to warn the\n * operator.\n */\nexport function findDuplicateOperationIds(\n spec: Document | null | undefined,\n): DuplicateOperationId[] {\n const seen = new Map<string, Array<{ method: string; path: string }>>();\n\n for (const entry of getOperationIndex(spec).operations) {\n const declared = declaredOperationId(entry);\n if (!declared) continue;\n\n const bucket = seen.get(declared);\n if (bucket) {\n bucket.push({ method: entry.method, path: entry.path });\n } else {\n seen.set(declared, [{ method: entry.method, path: entry.path }]);\n }\n }\n\n const duplicates: DuplicateOperationId[] = [];\n for (const [operationId, occurrences] of seen) {\n if (occurrences.length > 1) duplicates.push({ operationId, occurrences });\n }\n return duplicates;\n}\n\n/**\n * Throws when the document declares the same operationId twice. Kept as a\n * separate strict entry point so library consumers can choose between failing\n * fast at load time and merely surfacing a warning.\n */\nexport function assertUniqueOperationIds(\n spec: Document | null | undefined,\n): void {\n const duplicates = findDuplicateOperationIds(spec);\n if (duplicates.length === 0) return;\n\n const detail = duplicates\n .map((duplicate) => {\n const where = duplicate.occurrences\n .map((item) => `${item.method.toUpperCase()} ${item.path}`)\n .join(\", \");\n return `\"${duplicate.operationId}\" (${where})`;\n })\n .join(\"; \");\n\n throw new Error(`Duplicate operationId values in specification: ${detail}`);\n}\n","import fs from \"node:fs\";\nimport { load as loadYaml } from \"js-yaml\";\n\nimport { validate, dereference } from \"@scalar/openapi-parser\";\nimport type { Document } from \"@scalar/openapi-types/3.2\";\nimport { assertUniqueOperationIds } from \"./spec-utils\";\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseRaw(rawText: string, isYaml: boolean): unknown {\n if (isYaml) {\n try {\n return loadYaml(rawText);\n } catch (error) {\n throw new Error(\n `Failed to parse YAML: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n try {\n return JSON.parse(rawText);\n } catch (error) {\n throw new Error(\n `Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nasync function validateAndDereference(doc: unknown): Promise<Document> {\n if (!isPlainObject(doc)) {\n throw new Error(\"The OpenAPI document must be a JSON or YAML object.\");\n }\n if (typeof doc.openapi !== \"string\" || !doc.openapi.trim()) {\n throw new Error(\n 'The OpenAPI document must include a non-empty \"openapi\" field.',\n );\n }\n if (!isPlainObject(doc.info)) {\n throw new Error('The OpenAPI document must include a valid \"info\" object.');\n }\n if (typeof doc.info.title !== \"string\" || !doc.info.title.trim()) {\n throw new Error(\n 'The OpenAPI document must include a non-empty \"info.title\" value.',\n );\n }\n if (typeof doc.info.version !== \"string\" || !doc.info.version.trim()) {\n throw new Error(\n 'The OpenAPI document must include a non-empty \"info.version\" value.',\n );\n }\n\n const validationResult = await validate(doc);\n if (!validationResult.valid) {\n const errors = (validationResult.errors ?? [])\n .map((item) => (typeof item === \"string\" ? item : JSON.stringify(item)))\n .join(\"; \");\n throw new Error(\n `The OpenAPI document is invalid: ${errors || \"Unknown validation error.\"}`,\n );\n }\n\n const dereferenced = await dereference(doc);\n if (dereferenced.errors?.length) {\n const errors = dereferenced.errors\n .map((item) => (typeof item === \"string\" ? item : JSON.stringify(item)))\n .join(\"; \");\n throw new Error(`Failed to dereference the OpenAPI document: ${errors}`);\n }\n\n const schema = dereferenced.schema as Document;\n if (!schema.paths || Object.keys(schema.paths).length === 0) {\n throw new Error(\"The OpenAPI document does not define any paths.\");\n }\n\n assertUniqueOperationIds(schema);\n return schema;\n}\n\nexport async function loadOpenApiSpec(filePath: string): Promise<Document> {\n const raw = fs.readFileSync(filePath, \"utf8\");\n return validateAndDereference(parseRaw(raw, /\\.ya?ml$/i.test(filePath)));\n}\n\nexport async function parseSpecContent(\n rawText: string,\n isYaml: boolean,\n): Promise<Document> {\n if (!rawText.trim()) {\n throw new Error(\"The OpenAPI content is empty.\");\n }\n return validateAndDereference(parseRaw(rawText, isYaml));\n}\n","import { type Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n Document,\n MediaTypeObject,\n OperationObject,\n PathItemObject,\n RequestBodyObject,\n} from \"@scalar/openapi-types/3.2\";\nimport {\n collectOperationParameters,\n ensureUniqueName,\n extractPathTemplateVariables,\n isPlainObject,\n isReference,\n iterateOperations,\n truncateGeneratedName,\n type NormalizedParameter,\n type SpecWalkIssue,\n} from \"./spec-utils\";\nimport type { BodyEncoding } from \"../types\";\n\nexport interface InputSchema {\n type: \"object\";\n properties: Record<string, Record<string, unknown>>;\n required?: string[] | undefined;\n additionalProperties: boolean;\n}\n\nexport interface ArgumentBinding {\n key: string;\n name: string;\n in: \"path\" | \"query\" | \"header\" | \"cookie\";\n parameter: NormalizedParameter;\n}\n\nexport interface OmittedParameter {\n name: string;\n in: string;\n reason: string;\n}\n\nexport interface ToolBinding {\n toolName: string;\n path: string;\n pathItem: PathItemObject;\n method: string;\n isStandardMethod: boolean;\n operation: OperationObject;\n arguments: ArgumentBinding[];\n bodyKey: string | null;\n bodyEncoding: BodyEncoding | null;\n bodyMediaType: string | null;\n bodyRequired: boolean;\n omittedParameters: OmittedParameter[];\n fullySupported: boolean;\n degradationReasons: string[];\n usageNotes: string[];\n}\n\nexport interface GeneratedTool {\n tool: Tool;\n binding: ToolBinding;\n}\n\nexport interface GenerateToolsResult {\n tools: Tool[];\n bindings: ToolBinding[];\n issues: SpecWalkIssue[];\n}\n\nconst BODY_PREFERENCE: Array<{\n test: (mediaType: string) => boolean;\n encoding: BodyEncoding;\n}> = [\n { test: (m) => m === \"application/json\", encoding: \"json\" },\n { test: (m) => /^application\\/[\\w.+-]+\\+json$/.test(m), encoding: \"json\" },\n {\n test: (m) => m === \"application/x-www-form-urlencoded\",\n encoding: \"form-urlencoded\",\n },\n { test: (m) => m === \"multipart/form-data\", encoding: \"multipart\" },\n { test: (m) => m.startsWith(\"text/\"), encoding: \"text\" },\n { test: (m) => m === \"application/octet-stream\", encoding: \"binary\" },\n];\n\nconst BODY_KEY = \"body\";\nconst FALLBACK_BODY_KEY = \"requestBody\";\n\nconst BODYLESS_METHODS: ReadonlySet<string> = new Set([\"get\", \"head\", \"trace\"]);\n\nconst READ_ONLY_METHODS: ReadonlySet<string> = new Set([\n \"get\",\n \"head\",\n \"options\",\n \"trace\",\n \"query\",\n]);\n\nconst IDEMPOTENT_METHODS: ReadonlySet<string> = new Set([\n \"get\",\n \"head\",\n \"options\",\n \"trace\",\n \"put\",\n \"delete\",\n \"query\",\n]);\n\nconst MAX_DESCRIPTION_LENGTH = 1_024;\n\nfunction truncateText(text: string, limit: number): string {\n if (text.length <= limit) return text;\n return `${text.slice(0, Math.max(0, limit - 1)).trimEnd()}…`;\n}\n\nfunction stripMediaTypeParameters(mediaType: string): string {\n const semicolon = mediaType.indexOf(\";\");\n const base = semicolon === -1 ? mediaType : mediaType.slice(0, semicolon);\n return base.trim().toLowerCase();\n}\n\nfunction extractParameterSchema(\n parameter: NormalizedParameter,\n): Record<string, unknown> | null {\n if (parameter.schema) return parameter.schema;\n\n if (parameter.content) {\n const entries = Object.entries(parameter.content).filter(([, media]) =>\n isPlainObject(media),\n );\n\n const jsonEntry =\n entries.find(([mediaType]) =>\n /json/.test(stripMediaTypeParameters(mediaType)),\n ) ?? entries[0];\n\n if (!jsonEntry) return null;\n\n const media = jsonEntry[1] as MediaTypeObject;\n if (isPlainObject(media.schema)) {\n return media.schema as Record<string, unknown>;\n }\n }\n\n return null;\n}\n\nfunction stripReadOnly(\n schema: unknown,\n memo: WeakMap<object, unknown> = new WeakMap(),\n): unknown {\n if (Array.isArray(schema)) {\n const cached = memo.get(schema);\n if (cached !== undefined) return cached;\n const output: unknown[] = [];\n memo.set(schema, output);\n for (const entry of schema) output.push(stripReadOnly(entry, memo));\n return output;\n }\n\n if (!isPlainObject(schema)) return schema;\n\n const cached = memo.get(schema);\n if (cached !== undefined) return cached;\n\n const output: Record<string, unknown> = {};\n memo.set(schema, output);\n\n for (const [key, value] of Object.entries(schema)) {\n if (key === \"properties\" && isPlainObject(value)) {\n const properties: Record<string, unknown> = {};\n for (const [propertyName, propertySchema] of Object.entries(value)) {\n if (isPlainObject(propertySchema) && propertySchema.readOnly === true) {\n continue;\n }\n properties[propertyName] = stripReadOnly(propertySchema, memo);\n }\n output.properties = properties;\n continue;\n }\n if (\n key === \"items\" ||\n key === \"additionalProperties\" ||\n key === \"not\" ||\n key === \"allOf\" ||\n key === \"anyOf\" ||\n key === \"oneOf\" ||\n key === \"prefixItems\" ||\n key === \"patternProperties\" ||\n key === \"$defs\"\n ) {\n output[key] = stripReadOnly(value, memo);\n continue;\n }\n output[key] = value;\n }\n\n if (Array.isArray(output.required) && isPlainObject(output.properties)) {\n const properties = output.properties as Record<string, unknown>;\n const filtered = (output.required as unknown[]).filter(\n (entry) => typeof entry === \"string\" && entry in properties,\n );\n if (filtered.length > 0) output.required = filtered;\n else delete output.required;\n }\n\n return output;\n}\n\nfunction buildParameterSchema(\n parameter: NormalizedParameter,\n): Record<string, unknown> {\n const resolved = extractParameterSchema(parameter);\n const base: Record<string, unknown> = resolved\n ? { ...(stripReadOnly(resolved) as Record<string, unknown>) }\n : { type: \"string\" };\n\n const notes: string[] = [];\n if (parameter.description) notes.push(parameter.description);\n notes.push(`Sent as a ${parameter.in} parameter named \"${parameter.name}\".`);\n if (parameter.deprecated) notes.push(\"This parameter is deprecated.\");\n\n const existingDescription =\n typeof base.description === \"string\" ? base.description : undefined;\n const description = existingDescription\n ? [existingDescription, ...notes.slice(parameter.description ? 1 : 0)]\n .filter(Boolean)\n .join(\" \")\n : notes.join(\" \");\n\n base.description = truncateText(description, MAX_DESCRIPTION_LENGTH);\n return base;\n}\n\nfunction selectBodyMedia(body: RequestBodyObject): {\n mediaType: string;\n media: MediaTypeObject;\n encoding: BodyEncoding;\n} | null {\n if (!isPlainObject(body.content)) return null;\n\n const candidates = Object.entries(body.content)\n .filter(([, media]) => isPlainObject(media))\n .map(([mediaType, media]) => ({\n mediaType,\n normalized: stripMediaTypeParameters(mediaType),\n media: media as MediaTypeObject,\n }));\n\n for (const preference of BODY_PREFERENCE) {\n const hit = candidates.find((candidate) =>\n preference.test(candidate.normalized),\n );\n if (hit) {\n return {\n mediaType: hit.mediaType,\n media: hit.media,\n encoding: preference.encoding,\n };\n }\n }\n return null;\n}\n\nfunction buildAnnotations(\n method: string,\n isStandardMethod: boolean,\n title: string,\n): NonNullable<Tool[\"annotations\"]> {\n const annotations: NonNullable<Tool[\"annotations\"]> = { title };\n\n if (!isStandardMethod) {\n annotations.readOnlyHint = false;\n annotations.destructiveHint = true;\n annotations.idempotentHint = false;\n annotations.openWorldHint = true;\n return annotations;\n }\n\n const readOnly = READ_ONLY_METHODS.has(method);\n annotations.readOnlyHint = readOnly;\n annotations.destructiveHint = readOnly ? false : method === \"delete\";\n annotations.idempotentHint = IDEMPOTENT_METHODS.has(method);\n annotations.openWorldHint = true;\n return annotations;\n}\n\nfunction buildToolForOperation(\n toolName: string,\n path: string,\n pathItem: PathItemObject,\n method: string,\n isStandardMethod: boolean,\n operation: OperationObject,\n parameters: NormalizedParameter[],\n): GeneratedTool {\n const properties: Record<string, Record<string, unknown>> = {};\n const required: string[] = [];\n const argumentBindings: ArgumentBinding[] = [];\n const degradationReasons: string[] = [];\n const usageNotes: string[] = [];\n const omittedParameters: OmittedParameter[] = [];\n const usedKeys = new Set<string>();\n\n const exposedParameters: NormalizedParameter[] = [];\n for (const parameter of parameters) {\n if (parameter.reserved) {\n omittedParameters.push({\n name: parameter.name,\n in: parameter.in,\n reason:\n \"Managed by the transport layer; supplied from the server configuration.\",\n });\n continue;\n }\n exposedParameters.push(parameter);\n }\n\n const bodyObject =\n operation.requestBody && !isReference(operation.requestBody)\n ? (operation.requestBody as RequestBodyObject)\n : null;\n\n const bodyAllowed = !BODYLESS_METHODS.has(method);\n const bodySelection =\n bodyObject && bodyAllowed ? selectBodyMedia(bodyObject) : null;\n\n if (bodyObject && !bodyAllowed) {\n degradationReasons.push(\n `The document declares a request body for ${method.toUpperCase()}, which cannot carry a payload; it was ignored.`,\n );\n }\n\n let bodyKey: string | null = null;\n if (bodySelection) {\n const clashes = exposedParameters.some(\n (parameter) => parameter.name === BODY_KEY,\n );\n bodyKey = clashes ? FALLBACK_BODY_KEY : BODY_KEY;\n usedKeys.add(bodyKey);\n }\n\n for (const parameter of exposedParameters) {\n let key = parameter.name;\n if (usedKeys.has(key)) {\n key = `${parameter.in}_${parameter.name}`;\n }\n key = ensureUniqueName(key, usedKeys);\n\n if (!parameter.schema && !parameter.content) {\n degradationReasons.push(\n `Parameter \"${parameter.name}\" (${parameter.in}) has no schema; treated as a string.`,\n );\n }\n\n properties[key] = buildParameterSchema(parameter);\n if (parameter.required) required.push(key);\n\n argumentBindings.push({\n key,\n name: parameter.name,\n in: parameter.in,\n parameter,\n });\n }\n\n const declaredPathParameters = new Set(\n exposedParameters\n .filter((parameter) => parameter.in === \"path\")\n .map((parameter) => parameter.name),\n );\n for (const variable of extractPathTemplateVariables(path)) {\n if (!declaredPathParameters.has(variable)) {\n degradationReasons.push(\n `Path template variable \"{${variable}}\" has no matching path parameter definition.`,\n );\n }\n }\n\n if (bodySelection && bodyKey) {\n const rawSchema = isPlainObject(bodySelection.media.schema)\n ? (stripReadOnly(bodySelection.media.schema) as Record<string, unknown>)\n : null;\n\n let bodySchema: Record<string, unknown>;\n if (rawSchema) {\n bodySchema = { ...rawSchema };\n } else if (bodySelection.encoding === \"binary\") {\n bodySchema = { type: \"string\", contentEncoding: \"base64\" };\n } else if (bodySelection.encoding === \"text\") {\n bodySchema = { type: \"string\" };\n } else {\n bodySchema = { type: \"object\", additionalProperties: true };\n degradationReasons.push(\n `Request body for \"${bodySelection.mediaType}\" has no schema; accepting a free-form object.`,\n );\n }\n\n if (bodySelection.encoding === \"multipart\") {\n usageNotes.push(\n \"Multipart bodies are sent as encoded fields; binary file parts must be supplied as base64 strings.\",\n );\n }\n\n const bodyDescription = [\n bodyObject?.description,\n `Request body encoded as ${bodySelection.mediaType}.`,\n ]\n .filter(Boolean)\n .join(\" \");\n bodySchema.description = truncateText(\n bodyDescription,\n MAX_DESCRIPTION_LENGTH,\n );\n\n properties[bodyKey] = bodySchema;\n if (bodyObject?.required === true) required.push(bodyKey);\n } else if (bodyObject && bodyAllowed) {\n const available = isPlainObject(bodyObject.content)\n ? Object.keys(bodyObject.content).join(\", \") || \"none\"\n : \"none\";\n degradationReasons.push(\n `No supported request body media type (available: ${available}).`,\n );\n } else if (isReference(operation.requestBody)) {\n degradationReasons.push(\n \"Request body still contains an unresolved $ref and was ignored.\",\n );\n }\n\n const fullySupported = degradationReasons.length === 0;\n\n const inputSchema: InputSchema = {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n additionalProperties: !fullySupported,\n };\n\n const label = `${method.toUpperCase()} ${path}`;\n const descriptionParts = [operation.summary, operation.description].filter(\n (entry): entry is string =>\n typeof entry === \"string\" && entry.trim().length > 0,\n );\n if (descriptionParts.length === 0) descriptionParts.push(label);\n if ((operation as { deprecated?: unknown }).deprecated === true) {\n descriptionParts.push(\"[DEPRECATED]\");\n }\n if (!isStandardMethod) {\n descriptionParts.push(`[CUSTOM METHOD ${method.toUpperCase()}]`);\n }\n if (omittedParameters.length > 0) {\n descriptionParts.push(\n `[SERVER-MANAGED: ${omittedParameters.map((entry) => entry.name).join(\", \")}]`,\n );\n }\n if (usageNotes.length > 0) {\n descriptionParts.push(`[NOTE] ${usageNotes.join(\" \")}`);\n }\n if (!fullySupported) {\n descriptionParts.push(`[PARTIAL SUPPORT] ${degradationReasons.join(\" \")}`);\n }\n\n const tool: Tool = {\n name: toolName,\n description: truncateText(\n descriptionParts.join(\" — \"),\n MAX_DESCRIPTION_LENGTH,\n ),\n inputSchema: inputSchema as unknown as Tool[\"inputSchema\"],\n annotations: buildAnnotations(\n method,\n isStandardMethod,\n operation.summary?.trim() || label,\n ),\n };\n\n const binding: ToolBinding = {\n toolName,\n path,\n pathItem,\n method,\n isStandardMethod,\n operation,\n arguments: argumentBindings,\n bodyKey,\n bodyEncoding: bodySelection?.encoding ?? null,\n bodyMediaType: bodySelection?.mediaType ?? null,\n bodyRequired: bodyObject?.required === true && bodySelection !== null,\n omittedParameters,\n fullySupported,\n degradationReasons,\n usageNotes,\n };\n\n return { tool, binding };\n}\n\nexport function generateToolsDetailed(\n spec: Document | null | undefined,\n): GenerateToolsResult {\n const issues: SpecWalkIssue[] = [];\n const tools: Tool[] = [];\n const bindings: ToolBinding[] = [];\n const usedToolNames = new Set<string>();\n\n for (const resolved of iterateOperations(spec, issues)) {\n const parameters = collectOperationParameters(\n resolved.pathItem,\n resolved.operation,\n issues,\n { path: resolved.path, method: resolved.method },\n );\n\n const toolName = ensureUniqueName(\n truncateGeneratedName(resolved.operationId),\n usedToolNames,\n );\n\n const generated = buildToolForOperation(\n toolName,\n resolved.path,\n resolved.pathItem,\n resolved.method,\n resolved.isStandardMethod,\n resolved.operation,\n parameters,\n );\n tools.push(generated.tool);\n bindings.push(generated.binding);\n }\n\n return { tools, bindings, issues };\n}\n\nexport function generateTools(spec: Document | null | undefined): Tool[] {\n return generateToolsDetailed(spec).tools;\n}\n\nexport const RESERVED_BODY_KEYS = [BODY_KEY, FALLBACK_BODY_KEY] as const;\n\nconst resultCache = new WeakMap<object, GenerateToolsResult>();\nconst bindingIndexCache = new WeakMap<object, Map<string, ToolBinding>>();\n\nconst EMPTY_RESULT: GenerateToolsResult = Object.freeze({\n tools: [],\n bindings: [],\n issues: [],\n}) as GenerateToolsResult;\n\nexport function getGeneratedTools(\n spec: Document | null | undefined,\n): GenerateToolsResult {\n if (!spec) return EMPTY_RESULT;\n const cached = resultCache.get(spec);\n if (cached) return cached;\n const generated = generateToolsDetailed(spec);\n resultCache.set(spec, generated);\n return generated;\n}\n\nexport function getBindingIndex(\n spec: Document | null | undefined,\n): Map<string, ToolBinding> {\n if (!spec) return new Map();\n const cached = bindingIndexCache.get(spec);\n if (cached) return cached;\n const index = new Map<string, ToolBinding>();\n for (const binding of getGeneratedTools(spec).bindings) {\n index.set(binding.toolName, binding);\n }\n bindingIndexCache.set(spec, index);\n return index;\n}\n\nexport const buildBindingIndex = getBindingIndex;\n","import type {\n GetPromptResult,\n Prompt,\n PromptArgument,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { Document } from \"@scalar/openapi-types/3.2\";\nimport type { GeneratedPrompt } from \"../types\";\nimport {\n collectOperationParameters,\n iterateOperations,\n} from \"../core/spec-utils\";\n\n/** Upper bound for a generated prompt name, keeping client UIs readable. */\nconst MAX_PROMPT_NAME_LENGTH = 96;\n/** Upper bound for generated descriptions. */\nconst MAX_DESCRIPTION_LENGTH = 400;\n/** Upper bound for the serialized user-supplied arguments echoed into a message. */\nconst MAX_ARGS_TEXT_LENGTH = 4_000;\n/** Defensive cap so a hostile or generated spec cannot exhaust memory. */\nconst MAX_OPERATIONS = 2_000;\n\ntype PromptBuilder = (args: Record<string, unknown>) => GetPromptResult;\n\ninterface PromptEntry {\n prompt: GeneratedPrompt;\n build: PromptBuilder;\n}\n\ninterface PromptIndex {\n ordered: GeneratedPrompt[];\n byName: Map<string, PromptEntry>;\n}\n\n/**\n * Cache keyed by the parsed document instance. A new document object is produced\n * every time a specification is applied, so entries become collectable as soon\n * as the old specification is dropped.\n */\nconst indexCache = new WeakMap<Document, PromptIndex>();\n\n/** Collapse arbitrary identifier text into a safe, stable prompt name segment. */\nfunction sanitizeSegment(raw: string): string {\n const normalized = raw\n .normalize(\"NFKD\")\n .replace(/[^A-Za-z0-9]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return normalized.length > 0 ? normalized : \"operation\";\n}\n\nfunction truncate(text: string, limit: number): string {\n if (text.length <= limit) return text;\n return `${text.slice(0, Math.max(0, limit - 1)).trimEnd()}…`;\n}\n\n/** Build a description from optional spec text with a guaranteed fallback. */\nfunction describe(primary: string | undefined, fallback: string): string {\n const candidate = typeof primary === \"string\" ? primary.trim() : \"\";\n return truncate(\n candidate.length > 0 ? candidate : fallback,\n MAX_DESCRIPTION_LENGTH,\n );\n}\n\n/**\n * Serialize caller-provided arguments defensively: circular structures, BigInt\n * values and oversized payloads must never crash or flood a prompt response.\n */\nfunction safeSerializeArgs(args: Record<string, unknown>): string {\n const keys = Object.keys(args);\n if (keys.length === 0) return \"(none)\";\n\n const seen = new WeakSet<object>();\n let serialized: string;\n try {\n serialized = JSON.stringify(\n args,\n (_key, value: unknown) => {\n if (typeof value === \"bigint\") return value.toString();\n if (typeof value === \"function\" || typeof value === \"symbol\") {\n return `[${typeof value}]`;\n }\n if (value && typeof value === \"object\") {\n if (seen.has(value as object)) return \"[Circular]\";\n seen.add(value as object);\n }\n return value;\n },\n 2,\n );\n } catch {\n return `(unserializable arguments: ${keys.join(\", \")})`;\n }\n\n if (typeof serialized !== \"string\") return \"(none)\";\n return truncate(serialized, MAX_ARGS_TEXT_LENGTH);\n}\n\nfunction userMessage(text: string): GetPromptResult[\"messages\"][number] {\n return { role: \"user\", content: { type: \"text\", text } };\n}\n\nfunction makeResult(description: string, text: string): GetPromptResult {\n return { description, messages: [userMessage(text)] };\n}\n\n/** Reduce spec parameters to unique, well-formed MCP prompt arguments. */\nfunction toPromptArguments(\n parameters: ReturnType<typeof collectOperationParameters>,\n): PromptArgument[] {\n const result: PromptArgument[] = [];\n const used = new Set<string>();\n\n for (const parameter of parameters) {\n const rawName =\n typeof parameter.name === \"string\" ? parameter.name.trim() : \"\";\n if (!rawName) continue;\n\n // Prompt argument names must be unique; disambiguate by location on clash.\n let name = rawName;\n if (used.has(name)) {\n const location = typeof parameter.in === \"string\" ? parameter.in : \"arg\";\n name = `${rawName}_${location}`;\n let suffix = 2;\n while (used.has(name)) {\n name = `${rawName}_${location}_${suffix}`;\n suffix += 1;\n }\n }\n used.add(name);\n\n result.push({\n name,\n description: describe(\n parameter.description,\n `Input for the ${parameter.in ?? \"unknown\"} parameter \"${rawName}\".`,\n ),\n // Sample generation must never hard-fail on a missing hint.\n required: false,\n });\n }\n\n return result;\n}\n\nfunction buildIndex(spec: Document): PromptIndex {\n const ordered: GeneratedPrompt[] = [];\n const byName = new Map<string, PromptEntry>();\n\n const title = spec.info?.title?.trim() || \"Untitled API\";\n const version = spec.info?.version?.trim() || \"unknown\";\n\n const register = (prompt: Prompt, build: PromptBuilder): void => {\n const generated = prompt as GeneratedPrompt;\n // First registration wins so global prompts cannot be shadowed by a spec.\n if (byName.has(generated.name)) return;\n byName.set(generated.name, { prompt: generated, build });\n ordered.push(generated);\n };\n\n // Collect operations once; every prompt below reuses this snapshot.\n const operations: Array<{\n path: string;\n method: string;\n operationId: string;\n summary: string;\n description: string | undefined;\n deprecated: boolean;\n args: PromptArgument[];\n parameterHints: string;\n }> = [];\n\n let truncatedOperations = false;\n for (const entry of iterateOperations(spec)) {\n if (operations.length >= MAX_OPERATIONS) {\n truncatedOperations = true;\n break;\n }\n const method = String(entry.method ?? \"get\").toUpperCase();\n const parameters = collectOperationParameters(\n entry.pathItem,\n entry.operation,\n );\n const args = toPromptArguments(parameters);\n operations.push({\n path: entry.path,\n method,\n operationId: entry.operationId,\n summary: entry.operation.summary?.trim() || `${method} ${entry.path}`,\n description: entry.operation.description,\n deprecated: entry.operation.deprecated === true,\n args,\n parameterHints:\n parameters.length > 0\n ? parameters\n .map(\n (parameter) =>\n `- ${parameter.name} (${parameter.in}${parameter.required ? \", required\" : \"\"})`,\n )\n .join(\"\\n\")\n : \"- (this operation declares no parameters)\",\n });\n }\n\n register(\n {\n name: \"spec_overview\",\n description: `Summarize the scope, conventions and major capabilities of \"${truncate(title, 60)}\".`,\n arguments: [],\n },\n () =>\n makeResult(\n \"High-level orientation for the loaded API specification.\",\n [\n `Summarize the API \"${title}\" (version \"${version}\").`,\n `It exposes ${operations.length} callable operation(s)${truncatedOperations ? \" (list truncated for size)\" : \"\"}.`,\n \"Cover: authentication requirements, the main resource groups, naming conventions,\",\n \"pagination style, and any caveats a client should know before integrating.\",\n ].join(\"\\n\"),\n ),\n );\n\n register(\n {\n name: \"integration_guardrails\",\n description: \"Describe how to call this API safely and incrementally.\",\n arguments: [],\n },\n () =>\n makeResult(\n \"Conservative integration guidance for the loaded API specification.\",\n [\n `Provide conservative integration guidance for \"${title}\" (version \"${version}\").`,\n \"Address: retry and backoff policy, idempotency of mutating calls, pagination expectations,\",\n \"rate-limit handling, error-response interpretation, and data-safety or PII considerations.\",\n \"Prefer read-only verification steps before recommending any destructive call.\",\n ].join(\"\\n\"),\n ),\n );\n\n const usedOperationSlugs = new Set<string>();\n\n for (const operation of operations) {\n // Ensure a stable, collision-free, protocol-safe slug per operation.\n let slug = truncate(\n sanitizeSegment(operation.operationId),\n MAX_PROMPT_NAME_LENGTH - 12,\n ).replace(/…$/, \"\");\n if (usedOperationSlugs.has(slug)) {\n let suffix = 2;\n while (usedOperationSlugs.has(`${slug}_${suffix}`)) suffix += 1;\n slug = `${slug}_${suffix}`;\n }\n usedOperationSlugs.add(slug);\n\n const label = `${operation.method} ${operation.path}`;\n const deprecationNote = operation.deprecated\n ? \"\\nNote: this operation is marked deprecated in the specification; mention safer alternatives if any exist.\"\n : \"\";\n\n register(\n {\n name: `explain_${slug}`,\n description: describe(\n operation.description,\n `Explain how to use ${label}.`,\n ),\n arguments: [],\n },\n () =>\n makeResult(\n `Explanation of ${label}.`,\n [\n `Explain the operation \"${operation.operationId}\" (${label}).`,\n `Summary: ${operation.summary}`,\n \"Describe required inputs, optional inputs, request body rules, authentication needs,\",\n \"and the likely success and error response shapes.\",\n \"Parameters:\",\n operation.parameterHints,\n ].join(\"\\n\") + deprecationNote,\n ),\n );\n\n register(\n {\n name: `plan_${slug}`,\n description: `Create an execution plan for ${label}.`,\n arguments: [],\n },\n () =>\n makeResult(\n `Execution plan for ${label}.`,\n [\n `Create a step-by-step execution plan for \"${operation.operationId}\" (${label}).`,\n \"List every required parameter, any preconditions or prerequisite calls,\",\n \"the exact call to make, and how to validate the response before proceeding.\",\n \"Parameters:\",\n operation.parameterHints,\n ].join(\"\\n\") + deprecationNote,\n ),\n );\n\n register(\n {\n name: `sample_${slug}`,\n description: `Generate realistic sample arguments for ${label}.`,\n arguments: operation.args,\n },\n (args) =>\n makeResult(\n `Sample arguments for ${label}.`,\n [\n `Generate realistic sample arguments for \"${operation.operationId}\" (${label}).`,\n \"Use production-like placeholders that satisfy the declared types and formats.\",\n \"Do not invent real credentials, tokens, or personal data.\",\n \"Parameters:\",\n operation.parameterHints,\n \"Values already provided by the caller:\",\n safeSerializeArgs(args),\n ].join(\"\\n\"),\n ),\n );\n }\n\n return { ordered, byName };\n}\n\nfunction getIndex(spec: Document): PromptIndex {\n const cached = indexCache.get(spec);\n if (cached) return cached;\n const built = buildIndex(spec);\n indexCache.set(spec, built);\n return built;\n}\n\n/** List every prompt exposed for the given specification. */\nexport function generatePrompts(spec: Document): GeneratedPrompt[] {\n // Return a shallow copy so callers cannot mutate the cached registry.\n return getIndex(spec).ordered.slice();\n}\n\n/** Report whether a prompt name is served by this specification. */\nexport function hasPrompt(spec: Document, name: string): boolean {\n return getIndex(spec).byName.has(name);\n}\n\n/**\n * Resolve a prompt by name. Returns null when the prompt is unknown so the\n * transport layer can answer with the correct JSON-RPC error.\n */\nexport function resolvePrompt(\n spec: Document,\n name: string,\n args: Record<string, unknown> = {},\n): GetPromptResult | null {\n if (typeof name !== \"string\" || name.length === 0) return null;\n\n const entry = getIndex(spec).byName.get(name);\n if (!entry) return null;\n\n const safeArgs =\n args && typeof args === \"object\" && !Array.isArray(args) ? args : {};\n\n try {\n return entry.build(safeArgs);\n } catch (error) {\n // A malformed spec fragment must degrade to a usable prompt, not a crash.\n const message = error instanceof Error ? error.message : String(error);\n return makeResult(\n entry.prompt.description ?? name,\n `The prompt \"${name}\" could not be fully rendered from the specification (${message}). Explain what you can from the surrounding API context.`,\n );\n }\n}\n","import type { Document } from \"@scalar/openapi-types/3.2\";\nimport type { GeneratedResource, ResourceContentItem } from \"../types\";\nimport { generatePrompts } from \"./prompt-registry\";\nimport { generateToolsDetailed } from \"../core/tool-generator\";\nimport { iterateOperations } from \"../core/spec-utils\";\n\nexport function generateResources(spec: Document): GeneratedResource[] {\n return [\n {\n uri: \"openapi://spec/summary\",\n name: \"OpenAPI Spec Summary\",\n description: \"High-level API metadata and counts.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"openapi://spec/raw-info\",\n name: \"OpenAPI Info Object\",\n description: \"The OpenAPI info metadata.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"openapi://catalog/tools\",\n name: \"Tool Catalog\",\n description: \"The generated MCP tool catalog.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"openapi://catalog/prompts\",\n name: \"Prompt Catalog\",\n description: \"The generated MCP prompt catalog.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"openapi://catalog/resources\",\n name: \"Resource Catalog\",\n description: \"The generated MCP resource catalog.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"openapi://catalog/operations\",\n name: \"Operation Catalog\",\n description: \"The full operation catalog.\",\n mimeType: \"application/json\",\n },\n {\n uri: \"openapi://spec/document\",\n name: \"OpenAPI Document\",\n description: \"The dereferenced OpenAPI document.\",\n mimeType: \"application/json\",\n },\n ];\n}\n\nexport function readResource(spec: Document, uri: string): ResourceContentItem | null {\n if (uri === \"openapi://spec/summary\") {\n return {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(\n {\n title: spec.info?.title ?? null,\n version: spec.info?.version ?? null,\n openapi: spec.openapi,\n servers: spec.servers ?? [],\n operationCount: Array.from(iterateOperations(spec)).length,\n },\n null,\n 2,\n ),\n };\n }\n\n if (uri === \"openapi://spec/raw-info\") {\n return {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(spec.info ?? {}, null, 2),\n };\n }\n\n if (uri === \"openapi://catalog/tools\") {\n return {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(generateToolsDetailed(spec), null, 2),\n };\n }\n\n if (uri === \"openapi://catalog/prompts\") {\n return {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify({ prompts: generatePrompts(spec) }, null, 2),\n };\n }\n\n if (uri === \"openapi://catalog/resources\") {\n return {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify({ resources: generateResources(spec) }, null, 2),\n };\n }\n\n if (uri === \"openapi://catalog/operations\") {\n return {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(\n Array.from(iterateOperations(spec)).map((item) => ({\n operationId: item.operationId,\n method: item.method,\n path: item.path,\n summary: item.operation.summary ?? null,\n description: item.operation.description ?? null,\n })),\n null,\n 2,\n ),\n };\n }\n\n if (uri === \"openapi://spec/document\") {\n return {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(spec, null, 2),\n };\n }\n\n return null;\n}\n","import type {\n OperationObject,\n PathItemObject,\n} from \"@scalar/openapi-types/3.2\";\nimport {\n collectOperationParameters,\n effectiveExplode,\n effectiveStyle,\n type NormalizedParameter,\n} from \"./spec-utils\";\nimport type { ArgumentBinding, ToolBinding } from \"./tool-generator\";\n\n/**\n * Headers whose value is owned by the transport or the HTTP layer itself. A\n * document is free to declare them as parameters, but honouring that would let a\n * model rewrite the authenticated identity, break the framing of the request, or\n * defeat the executor's content negotiation, so they are dropped here as a second\n * line of defence behind the generator's `reserved` flag.\n */\nconst RESERVED_HEADERS: ReadonlySet<string> = new Set([\n \"host\",\n \"content-length\",\n \"content-type\",\n \"transfer-encoding\",\n \"connection\",\n \"keep-alive\",\n \"upgrade\",\n \"te\",\n \"trailer\",\n \"expect\",\n \"authorization\",\n \"proxy-authorization\",\n \"proxy-connection\",\n \"accept-encoding\",\n \"cookie\",\n]);\n\n/** A parameter or argument that was deliberately not sent, with the reason. */\nexport interface DroppedArgument {\n key: string;\n reason: string;\n}\n\nexport interface BuiltRequest {\n /**\n * Absolute URL without a query string. The query is kept separate so the\n * executor can log it in a structured form and so encoding happens exactly\n * once, inside `query`.\n */\n url: string;\n /**\n * Fully-formed query parameters. `URLSearchParams` is the only shape that can\n * represent the repeated keys produced by an exploded array — the default for\n * query parameters — and it applies percent-encoding once on `toString()`.\n */\n query: URLSearchParams;\n headers: Record<string, string>;\n body: unknown;\n /** Reported so the executor can surface silently ignored arguments in a log. */\n dropped: DroppedArgument[];\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Renders a scalar the way a URL expects it.\n *\n * `JSON.stringify` is deliberately not used as a fallback: a nested value that\n * reaches here means the style rules could not describe it, and emitting a JSON\n * blob would produce a request the upstream cannot parse while looking like it\n * worked. The caller is responsible for rejecting such values instead.\n */\nfunction renderScalar(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n if (\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\"\n ) {\n return String(value);\n }\n // Dates are common in hand-written arguments and have an unambiguous wire form.\n if (value instanceof Date) return value.toISOString();\n return String(value);\n}\n\n/**\n * Percent-encodes one *component* of a path parameter.\n *\n * Encoding must happen per element, never on the assembled string: the commas,\n * dots and semicolons that separate elements are structural, and encoding them\n * would turn `a,b` into a single value containing a literal comma.\n */\nfunction encodeComponent(value: string): string {\n return encodeURIComponent(value);\n}\n\n/** True when a value carries nothing that can be serialized into a request. */\nfunction isEmptyValue(value: unknown): boolean {\n return value === undefined || value === null || value === \"\";\n}\n\n/**\n * Serializes a path parameter according to `style` and `explode`.\n *\n * The returned string replaces the whole `{name}` placeholder, including the\n * leading `.` or `;` that the label and matrix styles introduce — those styles\n * own their entire path segment.\n */\nfunction serializePathParameter(\n name: string,\n value: unknown,\n style: string,\n explode: boolean,\n): string {\n const encodedName = encodeComponent(name);\n\n if (Array.isArray(value)) {\n const parts = value\n .filter((entry) => entry !== undefined && entry !== null)\n .map((entry) => encodeComponent(renderScalar(entry)));\n\n switch (style) {\n case \"label\":\n return explode ? `.${parts.join(\".\")}` : `.${parts.join(\",\")}`;\n case \"matrix\":\n return explode\n ? parts.map((part) => `;${encodedName}=${part}`).join(\"\")\n : `;${encodedName}=${parts.join(\",\")}`;\n default:\n return parts.join(\",\");\n }\n }\n\n if (isPlainObject(value)) {\n const entries = Object.entries(value).filter(\n ([, entryValue]) => entryValue !== undefined && entryValue !== null,\n );\n const flat = entries.flatMap(([key, entryValue]) => [\n encodeComponent(key),\n encodeComponent(renderScalar(entryValue)),\n ]);\n const pairs = entries.map(\n ([key, entryValue]) =>\n `${encodeComponent(key)}=${encodeComponent(renderScalar(entryValue))}`,\n );\n\n switch (style) {\n case \"label\":\n return explode ? `.${pairs.join(\".\")}` : `.${flat.join(\",\")}`;\n case \"matrix\":\n // An exploded matrix object drops the parameter name: each property\n // becomes its own matrix segment.\n return explode\n ? `;${pairs.join(\";\")}`\n : `;${encodedName}=${flat.join(\",\")}`;\n default:\n return explode ? pairs.join(\",\") : flat.join(\",\");\n }\n }\n\n const scalar = encodeComponent(renderScalar(value));\n switch (style) {\n case \"label\":\n return `.${scalar}`;\n case \"matrix\":\n return `;${encodedName}=${scalar}`;\n default:\n return scalar;\n }\n}\n\n/**\n * Serializes a query parameter into name/value pairs.\n *\n * Pairs are returned undecoded; `URLSearchParams` performs the single encoding\n * pass. Returning a list rather than a string is what makes the exploded forms\n * expressible at all, since they emit the same key more than once.\n */\nfunction serializeQueryParameter(\n name: string,\n value: unknown,\n style: string,\n explode: boolean,\n): Array<[string, string]> {\n if (Array.isArray(value)) {\n const parts = value\n .filter((entry) => entry !== undefined && entry !== null)\n .map((entry) => renderScalar(entry));\n\n // An empty exploded array has no representation at all; emitting `name=`\n // would assert an empty-string element that the caller never supplied.\n if (parts.length === 0) return explode ? [] : [[name, \"\"]];\n\n if (explode) return parts.map((part) => [name, part]);\n if (style === \"spaceDelimited\") return [[name, parts.join(\" \")]];\n if (style === \"pipeDelimited\") return [[name, parts.join(\"|\")]];\n return [[name, parts.join(\",\")]];\n }\n\n if (isPlainObject(value)) {\n const entries = Object.entries(value).filter(\n ([, entryValue]) => entryValue !== undefined && entryValue !== null,\n );\n\n if (style === \"deepObject\") {\n return entries.map(([key, entryValue]) => {\n // Nested containers have no defined deepObject form. Rendering the\n // scalar keeps the failure visible upstream rather than inventing a\n // bracket syntax no server is required to understand.\n return [`${name}[${key}]`, renderScalar(entryValue)] as [\n string,\n string,\n ];\n });\n }\n\n if (explode) {\n // An exploded form object drops the parameter name entirely.\n return entries.map(\n ([key, entryValue]) =>\n [key, renderScalar(entryValue)] as [string, string],\n );\n }\n\n const flat = entries.flatMap(([key, entryValue]) => [\n key,\n renderScalar(entryValue),\n ]);\n return [[name, flat.join(\",\")]];\n }\n\n return [[name, renderScalar(value)]];\n}\n\n/**\n * Serializes a header parameter, which is always `simple` style.\n *\n * Header values are not percent-encoded — that is a URL concept — so the only\n * transformation applied is the structural one.\n */\nfunction serializeHeaderParameter(value: unknown, explode: boolean): string {\n if (Array.isArray(value)) {\n return value\n .filter((entry) => entry !== undefined && entry !== null)\n .map((entry) => renderScalar(entry))\n .join(\",\");\n }\n if (isPlainObject(value)) {\n const entries = Object.entries(value).filter(\n ([, entryValue]) => entryValue !== undefined && entryValue !== null,\n );\n return explode\n ? entries.map(([key, v]) => `${key}=${renderScalar(v)}`).join(\",\")\n : entries.flatMap(([key, v]) => [key, renderScalar(v)]).join(\",\");\n }\n return renderScalar(value);\n}\n\n/**\n * Rejects a header value that could alter the framing of the request.\n *\n * Values here originate from model-supplied arguments, so a CR or LF would be a\n * textbook header-injection vector: it can append arbitrary headers or an entire\n * second request. Control characters are refused outright rather than stripped,\n * because silently mutating a credential-bearing value is worse than failing.\n */\nfunction assertSafeHeaderValue(name: string, value: string): void {\n if (/[\\r\\n\\u0000]/.test(value)) {\n throw new Error(\n `Header parameter \"${name}\" contains a control character and was rejected.`,\n );\n }\n}\n\nfunction isValidHeaderName(name: string): boolean {\n // RFC 7230 token.\n return /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/.test(name);\n}\n\nexport function buildRequest(\n baseUrl: string,\n templatePath: string,\n pathItem: PathItemObject,\n operation: OperationObject,\n args: Record<string, unknown>,\n binding?: ToolBinding,\n): BuiltRequest {\n let parsedBaseUrl: URL;\n try {\n parsedBaseUrl = new URL(baseUrl);\n } catch {\n throw new Error(`Invalid upstream base URL: \"${baseUrl}\".`);\n }\n\n if (\n parsedBaseUrl.protocol !== \"http:\" &&\n parsedBaseUrl.protocol !== \"https:\"\n ) {\n throw new Error(\n `Unsupported upstream base URL protocol: \"${parsedBaseUrl.protocol}\". Only http and https are allowed.`,\n );\n }\n\n // A server URL that still carries template variables was never resolved\n // against `servers[].variables`; sending it verbatim would request a literal\n // brace-containing host or path.\n if (\n /\\{[^}]+\\}/.test(parsedBaseUrl.pathname) ||\n /\\{/.test(parsedBaseUrl.host)\n ) {\n throw new Error(\n `The upstream base URL \"${baseUrl}\" still contains unresolved server variables.`,\n );\n }\n\n const query = new URLSearchParams();\n // Query parameters written into the server URL are part of the upstream\n // contract, so they are preserved instead of being lost when the path is\n // appended.\n for (const [key, value] of parsedBaseUrl.searchParams.entries()) {\n query.append(key, value);\n }\n\n // Resolving the parameter list is a document-wide walk. When a binding exists\n // it already carries every exposed parameter, so the walk is skipped entirely\n // on the hot path.\n const parameters: NormalizedParameter[] = binding\n ? []\n : collectOperationParameters(pathItem, operation, []);\n\n const bindingMap = new Map<string, ArgumentBinding>(\n binding?.arguments.map((item) => [item.key, item]) ?? [],\n );\n\n let path = templatePath;\n const headers: Record<string, string> = {};\n const cookies: string[] = [];\n const dropped: DroppedArgument[] = [];\n\n const bodyKey = binding ? binding.bodyKey : \"body\" in args ? \"body\" : null;\n\n for (const [key, value] of Object.entries(args)) {\n if (bodyKey !== null && key === bodyKey) continue;\n\n const bound = bindingMap.get(key);\n const parameter =\n bound?.parameter ?? parameters.find((item) => item.name === key);\n\n // With a binding present, anything unrecognised is not part of the declared\n // operation. Falling through to the query string would let a caller inject\n // arbitrary parameters into the upstream request, which matters because\n // degraded tools expose `additionalProperties: true`.\n if (!bound && !parameter) {\n dropped.push({\n key,\n reason: \"Not a declared parameter of this operation.\",\n });\n continue;\n }\n\n const location = bound?.in ?? parameter?.in ?? \"query\";\n const targetName = bound?.name ?? parameter?.name ?? key;\n const style = parameter\n ? effectiveStyle(parameter)\n : location === \"path\" || location === \"header\"\n ? \"simple\"\n : \"form\";\n const explode = parameter ? effectiveExplode(parameter) : style === \"form\";\n\n if (location === \"path\") {\n const placeholder = `{${targetName}}`;\n if (!path.includes(placeholder)) {\n dropped.push({\n key,\n reason: `No \"${placeholder}\" placeholder exists in the path template.`,\n });\n continue;\n }\n // An empty path parameter would silently address a different resource —\n // `/pets/{id}` collapsing to `/pets/` hits the collection endpoint — so it\n // is treated as a missing argument rather than substituted.\n if (isEmptyValue(value) || (Array.isArray(value) && value.length === 0)) {\n throw new Error(\n `Path parameter \"${targetName}\" requires a non-empty value.`,\n );\n }\n path = path\n .split(placeholder)\n .join(serializePathParameter(targetName, value, style, explode));\n continue;\n }\n\n // Beyond the path, an absent value means \"do not send this parameter\".\n // `allowEmptyValue` is the one case where an explicit empty string is\n // meaningful, and it applies to query parameters only.\n if (value === undefined || value === null) continue;\n if (\n value === \"\" &&\n !(location === \"query\" && parameter?.allowEmptyValue === true)\n ) {\n continue;\n }\n\n if (location === \"header\") {\n if (RESERVED_HEADERS.has(targetName.toLowerCase())) {\n dropped.push({\n key,\n reason: `Header \"${targetName}\" is managed by the transport layer.`,\n });\n continue;\n }\n if (!isValidHeaderName(targetName)) {\n dropped.push({\n key,\n reason: `\"${targetName}\" is not a valid header name.`,\n });\n continue;\n }\n const rendered = serializeHeaderParameter(value, explode);\n assertSafeHeaderValue(targetName, rendered);\n headers[targetName] = rendered;\n continue;\n }\n\n if (location === \"cookie\") {\n // Cookie parameters use `form` style; an exploded object becomes one\n // cookie per property.\n if (isPlainObject(value) && explode) {\n for (const [cookieKey, cookieValue] of Object.entries(value)) {\n if (cookieValue === undefined || cookieValue === null) continue;\n cookies.push(\n `${cookieKey}=${encodeComponent(renderScalar(cookieValue))}`,\n );\n }\n continue;\n }\n if (Array.isArray(value) && explode) {\n for (const entry of value) {\n if (entry === undefined || entry === null) continue;\n cookies.push(`${targetName}=${encodeComponent(renderScalar(entry))}`);\n }\n continue;\n }\n for (const [, cookieValue] of serializeQueryParameter(\n targetName,\n value,\n \"form\",\n false,\n )) {\n cookies.push(`${targetName}=${encodeComponent(cookieValue)}`);\n }\n continue;\n }\n\n // deepObject is defined for objects only; anything else has no encoding and\n // must not be guessed at.\n if (style === \"deepObject\" && !isPlainObject(value)) {\n throw new Error(\n `Parameter \"${targetName}\" uses style \"deepObject\", which requires an object value.`,\n );\n }\n\n for (const [pairName, pairValue] of serializeQueryParameter(\n targetName,\n value,\n style,\n explode,\n )) {\n query.append(pairName, pairValue);\n }\n }\n\n const unresolved = path.match(/\\{[^}]+\\}/g);\n if (unresolved?.length) {\n throw new Error(\n `Missing required path parameters: ${unresolved.join(\", \")}.`,\n );\n }\n\n if (cookies.length > 0) {\n const cookieHeader = cookies.join(\"; \");\n assertSafeHeaderValue(\"Cookie\", cookieHeader);\n headers.Cookie = cookieHeader;\n }\n\n const body = bodyKey !== null ? args[bodyKey] : undefined;\n\n // Join on origin plus pathname so a query string or fragment on the server URL\n // cannot end up in the middle of the final path.\n const basePath = parsedBaseUrl.pathname.replace(/\\/+$/, \"\");\n const suffix = path.startsWith(\"/\") ? path : `/${path}`;\n\n return {\n url: `${parsedBaseUrl.origin}${basePath}${suffix}`,\n query,\n headers,\n body,\n dropped,\n };\n}\n","import { randomUUID } from \"node:crypto\";\n\n/**\n * Node throws DOMException on AbortSignal and Error subclasses elsewhere, and\n * axios reports its own CanceledError. Matching on `name` covers all three\n * without importing axios internals.\n */\nexport function isAbortError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const name = (error as { name?: unknown }).name;\n return name === \"AbortError\" || name === \"CanceledError\";\n}\n\n\nexport function newId(): string {\n try {\n return randomUUID();\n } catch {\n return `id_${Date.now()}_${Math.random().toString(16).slice(2)}`;\n }\n}","import axios, { AxiosError, AxiosHeaders } from \"axios\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Document } from \"@scalar/openapi-types/3.2\";\nimport { buildRequest } from \"./request-builder\";\nimport { getBindingIndex } from \"./tool-generator\";\nimport { findOperationById } from \"./spec-utils\";\nimport type { ExecutionContext, LoggedQuery, RequestLogEntry } from \"../types\";\nimport { newId } from \"./global-utils\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MIN_TIMEOUT_MS = 1_000;\nconst MAX_CONTENT_BYTES = 10 * 1024 * 1024;\nconst MAX_RESULT_CHARS = 50_000;\n/** Upper bound on a logged body, independent of what is returned to the model. */\nconst MAX_LOGGED_BODY_CHARS = 8_000;\n\n/**\n * Header names whose values must never reach the log store. The web UI renders\n * logs verbatim, so a leaked credential would be visible in the browser and in\n * any exported log file.\n */\nconst SENSITIVE_HEADERS = new Set([\n \"authorization\",\n \"proxy-authorization\",\n \"cookie\",\n \"set-cookie\",\n \"x-api-key\",\n \"api-key\",\n \"x-auth-token\",\n \"x-access-token\",\n \"x-csrf-token\",\n]);\n\nexport interface ToolCallResult {\n status: number;\n statusText: string;\n headers: Record<string, unknown>;\n data: unknown;\n truncated: boolean;\n url: string;\n method: string;\n durationMs: number;\n /** Ties the request and response log entries together. */\n correlationId: string;\n}\n\n/** Classification of a transport-level failure, used for actionable messages. */\ntype FailureKind =\n | \"timeout\"\n | \"canceled\"\n | \"dns\"\n | \"connection-refused\"\n | \"tls\"\n | \"payload-too-large\"\n | \"unknown\";\n\n/**\n * Collapses a `URLSearchParams` into the logged query shape.\n *\n * Repeated keys are legal in a query string — `?tag=a&tag=b` is exactly what an\n * exploded array parameter produces — so a duplicate must widen its entry into\n * an array instead of overwriting the earlier value. The record form cannot\n * preserve the relative order of different keys; order within a single key is\n * retained, which is the part that carries meaning.\n */\nfunction groupQuery(params: URLSearchParams): LoggedQuery {\n const grouped: LoggedQuery = {};\n for (const [key, value] of params.entries()) {\n const existing = grouped[key];\n if (existing === undefined) {\n grouped[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n grouped[key] = [existing, value];\n }\n }\n return grouped;\n}\n\n/**\n * Maps an axios failure onto an actionable category.\n *\n * `callerAborted` is not optional sugar. When `timeout` and `signal` are both\n * supplied, axios surfaces a timeout as ECONNABORTED and a signal abort as\n * ERR_CANCELED — but older versions and some adapters report a timeout as\n * ERR_CANCELED too. Without consulting the caller's own signal, a genuine\n * upstream timeout gets reported as \"cancelled by the client\", which is the\n * exact false signal that cost us an afternoon.\n */\nexport function classifyFailure(\n error: AxiosError,\n callerAborted = false,\n): FailureKind {\n const code = error.code ?? \"\";\n const name = error.name ?? \"\";\n const message = error.message ?? \"\";\n\n if (code === \"ETIMEDOUT\" || /timeout/i.test(message)) return \"timeout\";\n\n if (\n code === \"ERR_CANCELED\" ||\n code === \"ECONNABORTED\" ||\n name === \"CanceledError\" ||\n name === \"AbortError\"\n ) {\n // Only the caller's signal can distinguish the two here.\n return callerAborted ? \"canceled\" : \"timeout\";\n }\n\n if (code === \"ENOTFOUND\" || code === \"EAI_AGAIN\") return \"dns\";\n if (\n code === \"ECONNREFUSED\" ||\n code === \"ECONNRESET\" ||\n code === \"EHOSTUNREACH\"\n ) {\n return \"connection-refused\";\n }\n if (\n code.startsWith(\"ERR_TLS\") ||\n code === \"CERT_HAS_EXPIRED\" ||\n code === \"DEPTH_ZERO_SELF_SIGNED_CERT\"\n ) {\n return \"tls\";\n }\n if (\n code === \"ERR_FR_MAX_BODY_LENGTH_EXCEEDED\" ||\n (code === \"ERR_BAD_RESPONSE\" && /maxContentLength/i.test(message))\n ) {\n return \"payload-too-large\";\n }\n return \"unknown\";\n}\n\n/** Case-insensitive lookup over a plain header record. */\nfunction findHeader(\n headers: Record<string, string>,\n name: string,\n): string | undefined {\n const target = name.toLowerCase();\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === target) return value;\n }\n return undefined;\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n return findHeader(headers, name) !== undefined;\n}\n\n/** Replaces credential values so a log entry can be shown safely. */\nfunction redactHeaders(\n headers: Record<string, string | undefined>,\n): Record<string, string> {\n const output: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (value === undefined) continue;\n output[key] = SENSITIVE_HEADERS.has(key.toLowerCase())\n ? \"[redacted]\"\n : value;\n }\n return output;\n}\n\nfunction normalizeResponseHeaders(raw: unknown): Record<string, unknown> {\n if (!raw || typeof raw !== \"object\") return {};\n const output: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(raw as Record<string, unknown>)) {\n output[key] = SENSITIVE_HEADERS.has(key.toLowerCase())\n ? \"[redacted]\"\n : value;\n }\n return output;\n}\n\n/**\n * Serializes a value once and truncates it against the two different limits.\n *\n * The model-facing result and the log entry use different budgets, and\n * stringifying a large payload twice is pure waste on a hot path.\n */\nfunction trimAtLimits(\n value: unknown,\n limits: readonly [number, number],\n): Array<{ value: unknown; truncated: boolean }> {\n if (value === undefined || value === null || typeof value === \"number\") {\n return limits.map(() => ({ value, truncated: false }));\n }\n\n let serialized: string | null = null;\n if (typeof value === \"string\") {\n serialized = value;\n } else if (typeof value === \"object\") {\n try {\n serialized = JSON.stringify(value);\n } catch {\n // Circular or otherwise unserializable payloads still need a placeholder\n // rather than propagating a throw out of a logging path.\n return limits.map(() => ({\n value: \"[unserializable value]\",\n truncated: true,\n }));\n }\n }\n\n if (serialized === null) {\n return limits.map(() => ({ value, truncated: false }));\n }\n\n const text = serialized;\n return limits.map((limit) =>\n text.length <= limit\n ? { value, truncated: false }\n : { value: `${text.slice(0, limit)}\\n...[truncated]`, truncated: true },\n );\n}\n\nfunction trimLargeValue(\n value: unknown,\n limit: number,\n): { value: unknown; truncated: boolean } {\n return trimAtLimits(value, [limit, limit])[0] as {\n value: unknown;\n truncated: boolean;\n };\n}\n\nfunction emitLog(\n onLog: ExecutionContext[\"onLog\"],\n entry: RequestLogEntry,\n): void {\n try {\n onLog?.(entry);\n } catch {\n // Logging must never break user traffic.\n }\n}\n\n/**\n * Normalizes whatever the request builder produced into a `URLSearchParams`.\n *\n * Accepting several shapes keeps this executor decoupled from the builder's\n * internal representation, and `URLSearchParams` is the only form that can\n * faithfully carry repeated keys such as `?tag=a&tag=b`.\n */\nfunction toSearchParams(query: unknown): URLSearchParams {\n if (query instanceof URLSearchParams) return query;\n\n const params = new URLSearchParams();\n if (!query || typeof query !== \"object\") return params;\n\n if (Array.isArray(query)) {\n for (const entry of query) {\n if (Array.isArray(entry) && entry.length === 2) {\n params.append(String(entry[0]), String(entry[1] ?? \"\"));\n }\n }\n return params;\n }\n\n for (const [key, value] of Object.entries(query as Record<string, unknown>)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item === undefined || item === null) continue;\n params.append(key, String(item));\n }\n continue;\n }\n params.append(key, String(value));\n }\n return params;\n}\n\n/**\n * Serializes the request body according to the media type selected at\n * generation time.\n *\n * Returning the value axios should send, plus the Content-Type it must be sent\n * with, keeps the two decisions from drifting apart — declaring\n * `multipart/form-data` while sending JSON is a silent way to make every upload\n * fail with a 400 that looks like an upstream bug.\n */\nfunction serializeBody(\n body: unknown,\n encoding: string | null | undefined,\n): { data: unknown; contentType?: string | undefined } {\n if (body === undefined) return { data: undefined };\n\n switch (encoding) {\n case \"form-urlencoded\": {\n const text =\n body && typeof body === \"object\"\n ? toSearchParams(body).toString()\n : String(body);\n return {\n data: text,\n contentType: \"application/x-www-form-urlencoded\",\n };\n }\n\n case \"multipart\": {\n if (!body || typeof body !== \"object\") return { data: body };\n const form = new FormData();\n for (const [key, value] of Object.entries(\n body as Record<string, unknown>,\n )) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item === undefined || item === null) continue;\n form.append(key, String(item));\n }\n continue;\n }\n if (typeof value === \"object\") {\n // Nested objects have no multipart representation of their own; the\n // specification says to encode them as JSON parts.\n form.append(\n key,\n new Blob([JSON.stringify(value)], { type: \"application/json\" }),\n );\n continue;\n }\n form.append(key, String(value));\n }\n // The boundary must be generated by the serializer, so the Content-Type\n // header is deliberately left unset here.\n return { data: form };\n }\n\n case \"binary\": {\n if (typeof body === \"string\") {\n // A base64 argument is the only way a JSON tool call can carry bytes.\n try {\n return {\n data: Buffer.from(body, \"base64\"),\n contentType: \"application/octet-stream\",\n };\n } catch {\n return { data: body, contentType: \"application/octet-stream\" };\n }\n }\n return { data: body, contentType: \"application/octet-stream\" };\n }\n\n case \"text\":\n return {\n data: typeof body === \"string\" ? body : JSON.stringify(body),\n contentType: \"text/plain\",\n };\n\n case \"json\":\n default:\n return { data: body, contentType: \"application/json\" };\n }\n}\n\n/** A loggable stand-in for payloads that are not textual. */\nfunction describeBodyForLog(data: unknown): unknown {\n if (typeof FormData !== \"undefined\" && data instanceof FormData) {\n return \"[multipart form data]\";\n }\n if (Buffer.isBuffer(data)) return `[binary, ${data.byteLength} bytes]`;\n return data;\n}\n\n/**\n * Executes one generated tool against the upstream API.\n *\n * A non-2xx upstream response is returned as data rather than thrown: the model\n * must be able to read the status and body to decide what to do next. Only\n * transport-level failures throw.\n */\nexport async function executeToolCall(\n spec: Document,\n toolName: string,\n args: Record<string, unknown> | undefined,\n context: ExecutionContext = {},\n): Promise<ToolCallResult> {\n const trimmedName = toolName.trim();\n if (!trimmedName) throw new Error(\"A tool name is required.\");\n\n // The binding index is the authoritative map from tool name to operation and\n // carries the argument placement, so it is consulted first. findOperationById\n // remains as a fallback for callers that pass a raw operationId.\n const binding = getBindingIndex(spec).get(trimmedName);\n const resolved = binding\n ? {\n path: binding.path,\n method: binding.method,\n operation: binding.operation,\n pathItem: binding.pathItem,\n }\n : findOperationById(spec, trimmedName);\n\n if (!resolved) {\n throw new Error(\n `Tool \"${trimmedName}\" was not found in the specification.`,\n );\n }\n\n const baseUrl = context.baseUrlOverride ?? spec.servers?.[0]?.url ?? \"\";\n if (!baseUrl) {\n throw new Error(\n \"No upstream base URL is available: the document declares no servers and no override was configured.\",\n );\n }\n\n const protocol = context.protocol;\n const correlationId = newId();\n const methodUpper = resolved.method.toUpperCase();\n const timeoutMs = Math.max(\n MIN_TIMEOUT_MS,\n context.requestTimeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n\n // Fail fast on an already-cancelled call rather than opening a socket.\n //\n // Thrown as an AbortError so callers can branch on `name` instead of matching\n // the message text, which silently breaks the moment the wording changes.\n if (context.signal?.aborted) {\n throw new DOMException(\n \"The tool call was cancelled before it was dispatched.\",\n \"AbortError\",\n );\n }\n\n const built = buildRequest(\n baseUrl,\n resolved.path,\n resolved.pathItem,\n resolved.operation,\n args ?? {},\n binding,\n );\n\n const startedAt = Date.now();\n const searchParams = toSearchParams(built.query);\n\n const mergedHeaders: Record<string, string> = {};\n // Operator-configured headers first, so per-request headers derived from the\n // document always win.\n for (const [key, value] of Object.entries(context.upstreamHeaders ?? {})) {\n if (typeof value === \"string\") mergedHeaders[key] = value;\n }\n for (const [key, value] of Object.entries(built.headers ?? {})) {\n if (typeof value === \"string\") mergedHeaders[key] = value;\n }\n\n // Security material is injected here rather than exposed as tool arguments,\n // so a model can neither read nor override the credentials.\n if (context.security?.bearerToken) {\n mergedHeaders.Authorization = `Bearer ${context.security.bearerToken}`;\n } else if (context.security?.basicAuth) {\n const raw = `${context.security.basicAuth.username}:${context.security.basicAuth.password}`;\n mergedHeaders.Authorization = `Basic ${Buffer.from(raw, \"utf8\").toString(\n \"base64\",\n )}`;\n }\n\n for (const [name, value] of Object.entries(context.security?.apiKeys ?? {})) {\n if (!hasHeader(mergedHeaders, name)) mergedHeaders[name] = value;\n }\n\n const serialized = serializeBody(built.body, binding?.bodyEncoding ?? null);\n\n if (\n serialized.data !== undefined &&\n !hasHeader(mergedHeaders, \"content-type\")\n ) {\n // Prefer the exact media type from the document; fall back to what the\n // serializer chose. Multipart intentionally provides neither, because the\n // boundary parameter must be generated during serialization.\n const chosen =\n binding?.bodyEncoding === \"multipart\"\n ? undefined\n : (binding?.bodyMediaType ?? serialized.contentType);\n if (chosen) mergedHeaders[\"Content-Type\"] = chosen;\n }\n\n if (!hasHeader(mergedHeaders, \"accept\")) {\n mergedHeaders.Accept = \"application/json, text/plain;q=0.9, */*;q=0.8\";\n }\n\n const loggedRequestBody = trimLargeValue(\n describeBodyForLog(serialized.data),\n MAX_LOGGED_BODY_CHARS,\n );\n\n emitLog(context.onLog, {\n id: newId(),\n correlationId,\n at: new Date().toISOString(),\n direction: \"request\",\n protocol,\n toolName: trimmedName,\n operationId: trimmedName,\n method: methodUpper,\n path: resolved.path,\n url: built.url,\n requestHeaders: redactHeaders(mergedHeaders),\n requestQuery: groupQuery(searchParams),\n requestBody: loggedRequestBody.value,\n truncated: loggedRequestBody.truncated,\n meta: { stage: \"before-upstream\" },\n });\n\n try {\n const response = await axios({\n // A lowercase custom method (OpenAPI 3.2 additional operations) is passed\n // through unchanged; axios forwards it to the HTTP layer verbatim.\n method: resolved.method,\n url: built.url,\n params: searchParams,\n // The builder already applied the style and explode rules together with\n // percent-encoding. Re-serializing here would double-encode every value.\n paramsSerializer: {\n serialize: (params) =>\n params instanceof URLSearchParams\n ? params.toString()\n : toSearchParams(params).toString(),\n },\n ...(serialized.data !== undefined ? { data: serialized.data } : {}),\n headers: new AxiosHeaders(mergedHeaders),\n timeout: timeoutMs,\n maxContentLength: MAX_CONTENT_BYTES,\n maxBodyLength: MAX_CONTENT_BYTES,\n maxRedirects: 5,\n decompress: true,\n // Read as text and parse manually: axios's own JSON parsing hides the raw\n // payload, which is exactly what an operator needs when a response is\n // malformed.\n responseType: \"text\",\n transformResponse: [(data: unknown) => data],\n // Any status is a valid answer. Letting axios throw on 4xx would turn an\n // upstream validation error into an opaque transport failure.\n validateStatus: () => true,\n ...(context.signal ? { signal: context.signal } : {}),\n });\n\n const responseHeaders = normalizeResponseHeaders(response.headers);\n const rawHeaders = response.headers as Record<string, unknown> | undefined;\n const contentType = String(rawHeaders?.[\"content-type\"] ?? \"\");\n\n let data: unknown = response.data;\n if (\n typeof data === \"string\" &&\n data.length > 0 &&\n /\\bjson\\b/i.test(contentType)\n ) {\n try {\n data = JSON.parse(data);\n } catch {\n // Keep the raw text: a server that mislabels its Content-Type is a real\n // condition the caller should be able to see.\n }\n }\n\n const [forModel, forLog] = trimAtLimits(data, [\n MAX_RESULT_CHARS,\n MAX_LOGGED_BODY_CHARS,\n ]) as [\n { value: unknown; truncated: boolean },\n { value: unknown; truncated: boolean },\n ];\n const durationMs = Date.now() - startedAt;\n\n emitLog(context.onLog, {\n id: newId(),\n correlationId,\n at: new Date().toISOString(),\n direction: \"response\",\n protocol,\n toolName: trimmedName,\n operationId: trimmedName,\n method: methodUpper,\n path: resolved.path,\n url: built.url,\n status: response.status,\n durationMs,\n success: response.status < 400,\n responseHeaders,\n responseBody: forLog.value,\n truncated: forLog.truncated,\n });\n\n return {\n status: response.status,\n statusText: response.statusText ?? \"\",\n headers: responseHeaders,\n data: forModel.value,\n truncated: forModel.truncated,\n url: built.url,\n method: methodUpper,\n durationMs,\n correlationId,\n };\n } catch (error) {\n const err = error as AxiosError;\n const durationMs = Date.now() - startedAt;\n // The caller's own signal is the only thing that can prove a cancellation\n // was requested; axios reports a timeout with an overlapping code.\n const kind = classifyFailure(err, context.signal?.aborted === true);\n\n // Distinct messages matter: \"failed\" tells the model nothing, while\n // \"timed out\" or \"cancelled\" tells it whether retrying is sensible.\n const message = ((): string => {\n switch (kind) {\n case \"timeout\":\n return `The upstream request timed out after ${timeoutMs}ms.`;\n case \"canceled\":\n return \"The tool call was cancelled by the client.\";\n case \"dns\":\n return `The upstream host could not be resolved: ${err.message}`;\n case \"connection-refused\":\n return `The upstream connection was refused or reset: ${err.message}`;\n case \"tls\":\n return `The upstream TLS handshake failed: ${err.message}`;\n case \"payload-too-large\":\n return `The request or response exceeded the ${MAX_CONTENT_BYTES}-byte limit.`;\n default:\n return `Upstream request failed: ${err.message}`;\n }\n })();\n\n emitLog(context.onLog, {\n id: newId(),\n correlationId,\n at: new Date().toISOString(),\n direction: \"response\",\n protocol,\n toolName: trimmedName,\n operationId: trimmedName,\n method: methodUpper,\n path: resolved.path,\n url: built.url,\n durationMs,\n success: false,\n error: message,\n meta: { failureKind: kind, code: err.code },\n });\n\n // A bare `new Error(message)` erased both the cause and the failure kind,\n // leaving callers to string-match the message to decide between \"the client\n // hung up\" (nothing to report) and \"the upstream timed out\" (a real 504).\n const wrapped = new Error(message, { cause: err });\n if (kind === \"canceled\") wrapped.name = \"AbortError\";\n (wrapped as Error & { failureKind?: FailureKind }).failureKind = kind;\n throw wrapped;\n }\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n CallToolRequestSchema,\n ErrorCode,\n GetPromptRequestSchema,\n ListPromptsRequestSchema,\n ListResourceTemplatesRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n McpError,\n ReadResourceRequestSchema,\n type CallToolResult,\n type GetPromptResult,\n type Prompt,\n type Resource,\n type Tool,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { Document } from \"@scalar/openapi-types/3.2\";\nimport { executeToolCall } from \"../core/http-executor\";\nimport { getGeneratedTools } from \"../core/tool-generator\";\nimport { generatePrompts, resolvePrompt } from \"../registry/prompt-registry\";\nimport { generateResources, readResource } from \"../registry/resource-registry\";\nimport type { ExecutionContext, ProtocolHint } from \"../types\";\n\n/** Returns the active document, or null when no service is running. */\nexport type SpecProvider = () => Document | null;\n/** Returns the upstream execution context for the current call. */\nexport type ContextProvider = () => ExecutionContext;\n\nexport interface BuildMcpServerOptions {\n protocol?: ProtocolHint | undefined;\n /** Advertised server name. Clients may display this to end users. */\n name?: string | undefined;\n /** Advertised server version. */\n version?: string | undefined;\n /**\n * Maximum entries returned by a single list request. Large documents must be\n * paginated, otherwise a single response can exceed what the transport (and\n * some clients) will accept.\n */\n pageSize?: number | undefined;\n /** Human-readable usage hint surfaced through `instructions`. */\n instructions?: string | undefined;\n}\n\nconst DEFAULT_PAGE_SIZE = 100;\nconst MAX_PAGE_SIZE = 500;\n\n/**\n * Message used whenever a request arrives while no service is running. This is\n * a legitimate transient state (the operator stopped the service, or replaced\n * the document) rather than a malformed request, so it is reported as an error\n * the client can retry after re-initializing.\n */\nconst NO_SERVICE_MESSAGE =\n \"No MCP service is currently running: the specification was cleared or the service was stopped.\";\n\nfunction requireSpec(specProvider: SpecProvider): Document {\n const spec = specProvider();\n if (!spec) {\n // InternalError rather than InvalidRequest: the request itself was valid,\n // the server-side precondition disappeared mid-session.\n throw new McpError(ErrorCode.InternalError, NO_SERVICE_MESSAGE);\n }\n return spec;\n}\n\n/**\n * Slices a list according to an opaque cursor.\n *\n * The cursor encodes a numeric offset. It is deliberately opaque to clients, so\n * the encoding can change later without breaking them. An unparseable cursor is\n * rejected instead of being silently treated as offset zero, which would make a\n * client loop over the first page forever.\n */\nfunction paginate<T>(\n items: readonly T[],\n cursor: string | undefined,\n pageSize: number,\n): { page: T[]; nextCursor?: string } {\n let offset = 0;\n\n if (cursor !== undefined) {\n let decoded: string;\n try {\n decoded = Buffer.from(cursor, \"base64url\").toString(\"utf8\");\n } catch {\n throw new McpError(ErrorCode.InvalidParams, \"The cursor is malformed.\");\n }\n const parsed = Number.parseInt(decoded, 10);\n if (!Number.isInteger(parsed) || parsed < 0 || parsed > items.length) {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"The cursor is no longer valid; restart the listing without a cursor.\",\n );\n }\n offset = parsed;\n }\n\n const page = items.slice(offset, offset + pageSize);\n const nextOffset = offset + page.length;\n if (nextOffset < items.length) {\n return {\n page,\n nextCursor: Buffer.from(String(nextOffset), \"utf8\").toString(\"base64url\"),\n };\n }\n return { page };\n}\n\nfunction toolErrorResult(message: string): CallToolResult {\n return {\n isError: true,\n content: [{ type: \"text\", text: message }],\n };\n}\n\n/**\n * Builds one MCP server instance.\n *\n * A fresh instance is created per transport session so that per-session state\n * (client capabilities, negotiated protocol version, in-flight requests) is\n * never shared. The document itself is read through `specProvider` on every\n * request rather than captured, so a session always reflects the currently\n * running service instead of a stale snapshot.\n */\nexport function buildMcpServer(\n specProvider: SpecProvider,\n contextProvider: ContextProvider = () => ({}),\n options: BuildMcpServerOptions = {},\n) {\n const pageSize = Math.min(\n MAX_PAGE_SIZE,\n Math.max(1, options.pageSize ?? DEFAULT_PAGE_SIZE),\n );\n\n const server = new Server(\n {\n name: options.name ?? \"openapi-mcp\",\n version: options.version ?? \"1.1.0\",\n },\n {\n // `listChanged` is intentionally not advertised: replacing the document\n // terminates existing sessions instead of mutating them in place, so this\n // server never emits list-changed notifications. Advertising a capability\n // it does not honour would make well-behaved clients wait for updates\n // that never arrive.\n capabilities: {\n tools: {},\n prompts: {},\n resources: {},\n },\n ...(options.instructions\n ? { instructions: options.instructions }\n : {\n instructions:\n \"Tools are generated from an OpenAPI document. Call tools/list first; \" +\n \"arguments marked with a location note map to path, query, header or \" +\n \"cookie parameters. Tools tagged [PARTIAL SUPPORT] could not be mapped \" +\n \"completely and may require additional free-form arguments.\",\n }),\n },\n );\n\n /* ------------------------------------------------------------------ */\n /* Tools */\n /* ------------------------------------------------------------------ */\n\n server.setRequestHandler(ListToolsRequestSchema, async (request) => {\n const spec = specProvider();\n // An empty list is the correct answer here rather than an error: a client\n // that polls after the service stopped should see zero tools, not a fault.\n const all: Tool[] = spec ? getGeneratedTools(spec).tools : [];\n const { page, nextCursor } = paginate(\n all,\n request.params?.cursor,\n pageSize,\n );\n return { tools: page, ...(nextCursor ? { nextCursor } : {}) };\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n const spec = requireSpec(specProvider);\n const name = request.params.name;\n\n // An unknown tool is a protocol-level mistake, not a failed execution.\n // Reporting it as `isError` content would let the model keep retrying a\n // name that can never resolve.\n const known = getGeneratedTools(spec).bindings.some(\n (binding) => binding.toolName === name,\n );\n if (!known) {\n throw new McpError(ErrorCode.InvalidParams, `Unknown tool \"${name}\".`);\n }\n\n const rawArgs = request.params.arguments;\n if (\n rawArgs !== undefined &&\n (typeof rawArgs !== \"object\" ||\n rawArgs === null ||\n Array.isArray(rawArgs))\n ) {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"Tool arguments must be an object.\",\n );\n }\n\n try {\n const result = await executeToolCall(\n spec,\n name,\n (rawArgs as Record<string, unknown> | undefined) ?? {},\n {\n ...contextProvider(),\n // Propagating the abort signal is what makes client-side\n // cancellation actually release the upstream connection.\n signal: extra.signal,\n },\n );\n\n const payload = {\n status: result.status,\n url: result.url,\n method: result.method,\n durationMs: result.durationMs,\n truncated: result.truncated,\n headers: result.headers,\n data: result.data,\n };\n\n let text: string;\n try {\n text = JSON.stringify(payload, null, 2);\n } catch {\n // Circular or otherwise unserializable upstream payloads must not take\n // down the whole call.\n text = JSON.stringify(\n { ...payload, data: \"[unserializable response body]\" },\n null,\n 2,\n );\n }\n\n return {\n // An upstream 4xx/5xx is a tool execution failure, which MCP models as\n // `isError` on a successful protocol response — the model is expected to\n // read the status and decide what to do.\n isError: result.status >= 400,\n content: [{ type: \"text\", text }],\n } satisfies CallToolResult;\n } catch (error) {\n if (error instanceof McpError) throw error;\n // Transport-level upstream failures (DNS, TLS, timeout, abort) are\n // execution failures the model can reason about, so they stay in-band.\n return toolErrorResult(\n error instanceof Error ? error.message : String(error),\n );\n }\n });\n\n /* ------------------------------------------------------------------ */\n /* Prompts */\n /* ------------------------------------------------------------------ */\n\n server.setRequestHandler(ListPromptsRequestSchema, async (request) => {\n const spec = specProvider();\n const all: Prompt[] = spec ? generatePrompts(spec) : [];\n const { page, nextCursor } = paginate(\n all,\n request.params?.cursor,\n pageSize,\n );\n return { prompts: page, ...(nextCursor ? { nextCursor } : {}) };\n });\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const spec = requireSpec(specProvider);\n const name = request.params.name;\n\n const rawArgs = request.params.arguments;\n const args: Record<string, unknown> =\n rawArgs && typeof rawArgs === \"object\" && !Array.isArray(rawArgs)\n ? (rawArgs as Record<string, unknown>)\n : {};\n\n const result: GetPromptResult | null = resolvePrompt(spec, name, args);\n if (!result) {\n // Must be an error: returning a placeholder message would be fed to the\n // model as if it were the requested prompt.\n throw new McpError(ErrorCode.InvalidParams, `Unknown prompt \"${name}\".`);\n }\n return result;\n });\n\n /* ------------------------------------------------------------------ */\n /* Resources */\n /* ------------------------------------------------------------------ */\n\n server.setRequestHandler(ListResourcesRequestSchema, async (request) => {\n const spec = specProvider();\n const all: Resource[] = spec ? generateResources(spec) : [];\n const { page, nextCursor } = paginate(\n all,\n request.params?.cursor,\n pageSize,\n );\n return { resources: page, ...(nextCursor ? { nextCursor } : {}) };\n });\n\n /**\n * Every resource this server exposes has a concrete URI, so there are no\n * templates. The handler is still registered because a client that sees the\n * `resources` capability is entitled to probe this method, and answering with\n * `MethodNotFound` is treated as fatal by some implementations.\n */\n server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({\n resourceTemplates: [],\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const spec = requireSpec(specProvider);\n const uri = request.params.uri;\n\n const resource = readResource(spec, uri);\n if (!resource) {\n // Same reasoning as prompts: a synthetic \"not found\" body would be\n // indistinguishable from real content once it reaches the model.\n throw new McpError(\n ErrorCode.InvalidParams,\n `Unknown resource URI: ${uri}`,\n );\n }\n\n return { contents: [resource] };\n });\n\n return server;\n}\n","import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { buildMcpServer } from \"./create-server\";\nimport type { Document } from \"@scalar/openapi-types/3.2\";\nimport type { ExecutionContext, RequestLogEntry } from \"../types\";\n\nexport interface StdioServerHandle {\n /** Resolves when the peer closes stdin or {@link close} is called. */\n closed: Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface StartStdioServerOptions {\n /**\n * Install process signal handlers so the transport is shut down cleanly.\n * Defaults to true, which is what a CLI entry point wants; a host embedding\n * this in a larger process should pass false and drive `close()` itself.\n */\n handleSignals?: boolean;\n}\n\n/**\n * Redirects stdout-bound console output to stderr for the lifetime of the\n * process.\n *\n * On stdio, stdout is the JSON-RPC framing channel: a single stray line from any\n * module — a dependency's deprecation notice, a leftover debug print — desynchronizes\n * the stream and the client fails with a parse error that looks like a protocol\n * bug rather than a logging mistake. Enforcing the rule here is the only reliable\n * option, because no amount of convention prevents third-party code from writing\n * to stdout.\n */\nfunction divertConsoleToStderr(): () => void {\n const original = {\n log: console.log,\n info: console.info,\n debug: console.debug,\n dir: console.dir,\n };\n const toStderr = (...args: unknown[]): void => {\n console.error(...args);\n };\n console.log = toStderr;\n console.info = toStderr;\n console.debug = toStderr;\n console.dir = toStderr as typeof console.dir;\n\n return () => {\n console.log = original.log;\n console.info = original.info;\n console.debug = original.debug;\n console.dir = original.dir;\n };\n}\n\n/**\n * Serves a single specification over stdio.\n *\n * The specification is captured once: unlike the HTTP transports there is no\n * admin surface able to swap it, and a stdio client holds exactly one session\n * whose tool list it caches after `initialize`.\n */\nexport async function startStdioServer(\n spec: Document,\n context: ExecutionContext = {},\n options: StartStdioServerOptions = {},\n): Promise<StdioServerHandle> {\n const restoreConsole = divertConsoleToStderr();\n\n // The caller's log sink may well be a console-based one. Wrapping it keeps a\n // logging decision made elsewhere from corrupting the protocol stream, and the\n // wrapper swallows sink errors for the same reason the executor does.\n const upstreamLog = context.onLog;\n const onLog = upstreamLog\n ? (entry: RequestLogEntry): void => {\n try {\n upstreamLog(entry);\n } catch {\n // Logging must never break user traffic.\n }\n }\n : undefined;\n\n const stdioContext: ExecutionContext = {\n ...context,\n protocol: \"stdio\",\n ...(onLog ? { onLog } : {}),\n };\n\n const server = buildMcpServer(\n () => spec,\n () => stdioContext,\n { protocol: \"stdio\" },\n );\n\n const transport = new StdioServerTransport();\n\n let settleClosed: () => void = () => {};\n const closed = new Promise<void>((resolve) => {\n settleClosed = resolve;\n });\n\n let shuttingDown = false;\n const detachSignals: Array<() => void> = [];\n\n const finish = (): void => {\n if (shuttingDown) return;\n shuttingDown = true;\n for (const detach of detachSignals) detach();\n restoreConsole();\n settleClosed();\n };\n\n transport.onerror = (error: Error): void => {\n // Nothing here can be reported to the client — the channel carrying the\n // error is the one that failed — so stderr is the only diagnostic surface.\n console.error(\"[mcp:stdio] transport error:\", error);\n };\n\n transport.onclose = (): void => {\n finish();\n };\n\n await server.connect(transport);\n\n if (options.handleSignals !== false) {\n for (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n const handler = (): void => {\n // Close the transport rather than exiting immediately, so an in-flight\n // response still reaches the client before stdout is torn down.\n void server.close().catch(() => {\n /* already closing */\n });\n };\n process.once(signal, handler);\n detachSignals.push(() => process.removeListener(signal, handler));\n }\n }\n\n return {\n closed,\n close: async (): Promise<void> => {\n try {\n await server.close();\n } finally {\n finish();\n }\n },\n };\n}\n","// src/mcp/transport-http.ts\nimport express from \"express\";\nimport { randomUUID } from \"node:crypto\";\nimport { SSEServerTransport } from \"@modelcontextprotocol/sdk/server/sse.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n buildMcpServer,\n type ContextProvider,\n type SpecProvider,\n} from \"./create-server\";\n\n/** Endpoint paths mounted by {@link attachMcpRoutes}. */\nexport const MCP_ROUTES = {\n /** Streamable HTTP endpoint (POST/GET/DELETE). Preferred by modern clients. */\n streamableHttp: \"/mcp\",\n /** Legacy HTTP+SSE stream endpoint. */\n sse: \"/sse\",\n /** Legacy HTTP+SSE message endpoint. */\n messages: \"/mcp/messages\",\n} as const;\n\n/** Hard cap on concurrent sessions, protecting the process from exhaustion. */\nconst DEFAULT_MAX_SESSIONS = 64;\n/** Idle sessions are reclaimed after this long without traffic. */\nconst DEFAULT_SESSION_IDLE_MS = 10 * 60 * 1000;\n/** Interval between SSE keep-alive comments, to survive proxy idle timeouts. */\nconst KEEPALIVE_INTERVAL_MS = 25 * 1000;\n/** How often expired sessions are swept. */\nconst SWEEP_INTERVAL_MS = 30 * 1000;\n/** Upper bound on how long closeAll waits for in-flight teardowns. */\nconst DRAIN_TIMEOUT_MS = 5 * 1000;\n\nexport type SessionKind = \"streamable-http\" | \"sse\";\n\n/**\n * Why a session was torn down. Left open-ended so internal call sites can\n * record a precise reason without widening a public union every time.\n */\nexport type SessionCloseReason =\n | \"transport-closed\"\n | \"client-terminated\"\n | \"client-closed\"\n | \"stream-error\"\n | \"connect-failed\"\n | \"initialize-failed\"\n | \"keepalive-write-failed\"\n | \"idle-timeout\"\n | \"closed-by-operator\"\n | \"shutdown\"\n | (string & {});\n\n/**\n * Lifecycle notice.\n *\n * Deliberately a flat shape rather than a discriminated union: the consumer in\n * the admin server writes every field into a log record, and a union would force\n * a narrowing branch per event type for no behavioural gain. The optional fields\n * are genuinely absent for some events — `session-rejected` fires before any id\n * exists.\n */\nexport interface McpSessionEvent {\n type:\n | \"session-opened\"\n | \"session-closed\"\n | \"session-rejected\"\n | \"session-error\";\n kind: SessionKind;\n sessionId?: string | undefined;\n reason?: string | undefined;\n}\n\n/** A public, serializable view of one live session. */\nexport interface McpSessionInfo {\n sessionId: string;\n kind: SessionKind;\n createdAt: string;\n lastActivityAt: string;\n remoteAddress?: string | undefined;\n userAgent?: string | undefined;\n}\n\nexport interface AttachMcpRoutesOptions {\n /** Supplies the document backing every new session. */\n specProvider: SpecProvider;\n /** Supplies the per-call upstream execution context. */\n contextProvider: ContextProvider;\n /** Applied to every MCP route when provided. */\n routeGuard?: express.RequestHandler | undefined;\n /** Maximum concurrent sessions. Defaults to 64. */\n maxSessions?: number | undefined;\n /** Idle timeout in milliseconds. Defaults to 10 minutes. Zero disables it. */\n sessionIdleMs?: number | undefined;\n /**\n * Origins permitted to open a session. When non-empty, DNS rebinding\n * protection is enabled, which is strongly recommended for any server\n * reachable from a browser.\n */\n allowedOrigins?: string[] | undefined;\n /** Host header values permitted. Pairs with {@link allowedOrigins}. */\n allowedHosts?: string[] | undefined;\n /** Enables the deprecated HTTP+SSE transport. Defaults to true. */\n enableLegacySse?: boolean | undefined;\n /** Receives lifecycle notices. Must never throw. */\n onEvent?: ((event: McpSessionEvent) => void) | undefined;\n}\n\nexport interface McpRouteHandle {\n activeSessionCount: () => number;\n /** Sessions mid-handshake, i.e. counted against capacity but not yet listed. */\n pendingSessionCount: () => number;\n listSessions: () => McpSessionInfo[];\n /** Resolves true when the session existed and was closed by this call. */\n closeSession: (\n sessionId: string,\n reason?: SessionCloseReason,\n ) => Promise<boolean>;\n closeAll: () => Promise<void>;\n /** Stops the background sweeper and closes every session. */\n dispose: () => Promise<void>;\n}\n\ninterface SessionRecord {\n sessionId: string;\n kind: SessionKind;\n transport: Transport;\n server: ReturnType<typeof buildMcpServer>;\n createdAt: number;\n lastActivityAt: number;\n keepAlive?: NodeJS.Timeout | undefined;\n closing: boolean;\n remoteAddress?: string | undefined;\n userAgent?: string | undefined;\n}\n\n/** JSON-RPC error payload for failures that occur before a session exists. */\nfunction rpcError(code: number, message: string): Record<string, unknown> {\n return { jsonrpc: \"2.0\", id: null, error: { code, message } };\n}\n\nfunction readHeader(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) return value.trim();\n if (Array.isArray(value)) {\n const first = value.find(\n (entry): entry is string =>\n typeof entry === \"string\" && entry.trim() !== \"\",\n );\n return first?.trim();\n }\n return undefined;\n}\n\n/** Express 5 widens query values; collapse to a single usable string. */\nfunction readQueryValue(value: unknown): string {\n if (typeof value === \"string\") return value.trim();\n if (Array.isArray(value)) {\n const first = value.find(\n (entry): entry is string =>\n typeof entry === \"string\" && entry.trim() !== \"\",\n );\n return first?.trim() ?? \"\";\n }\n return \"\";\n}\n\nfunction describe(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * The SDK is not compiled with `exactOptionalPropertyTypes`, so its transport\n * classes are not structurally assignable to the `Transport` interface under\n * that flag. The mismatch is a declaration-level artifact only: every optional\n * member is genuinely optional at runtime. These helpers isolate the unavoidable\n * widening and narrowing instead of scattering casts everywhere.\n */\nfunction asTransport(value: object): Transport {\n return value as unknown as Transport;\n}\n\nfunction asStreamableTransport(\n value: Transport,\n): StreamableHTTPServerTransport {\n return value as unknown as StreamableHTTPServerTransport;\n}\n\nfunction asSseTransport(value: Transport): SSEServerTransport {\n return value as unknown as SSEServerTransport;\n}\n\n/**\n * Installs an additional close handler without discarding the existing one.\n *\n * `Server.connect()` assigns its own `onclose`/`onerror` on the transport, so a\n * handler registered before connect is silently overwritten. Assigning after\n * connect fixes that, but a plain assignment would then destroy the SDK's own\n * cleanup — hence the chaining.\n */\nfunction chainOnClose(\n transport: { onclose?: (() => void) | undefined },\n handler: () => void,\n): void {\n const previous = transport.onclose;\n transport.onclose = (): void => {\n try {\n previous?.();\n } finally {\n handler();\n }\n };\n}\n\nfunction chainOnError(\n transport: { onerror?: ((error: Error) => void) | undefined },\n handler: (error: Error) => void,\n): void {\n const previous = transport.onerror;\n transport.onerror = (error: Error): void => {\n try {\n previous?.(error);\n } finally {\n handler(error);\n }\n };\n}\n\n/**\n * Mounts both MCP HTTP transports on the given app.\n *\n * `/mcp` serves the Streamable HTTP transport, which is what current clients\n * negotiate by default. `/sse` plus `/mcp/messages` keep the deprecated\n * HTTP+SSE transport available for pinned clients.\n *\n * The JSON body parser must already be installed on the app: both transports\n * are handed `request.body` rather than re-reading the stream.\n */\nexport function attachMcpRoutes(\n app: express.Express,\n options: AttachMcpRoutesOptions,\n): McpRouteHandle {\n const { specProvider, contextProvider } = options;\n\n const sessions = new Map<string, SessionRecord>();\n /**\n * Closures in flight, keyed by session id. A session is removed from\n * `sessions` as soon as teardown begins, so without this map `closeAll` could\n * resolve while sockets are still being drained.\n */\n const closures = new Map<string, Promise<void>>();\n\n /**\n * Handshakes that have passed admission but have not yet produced a session\n * id. Without counting these, N concurrent initialize requests all observe\n * `sessions.size === 0` and every one of them is admitted, so the effective\n * ceiling becomes N + maxSessions.\n */\n let pending = 0;\n\n const guard = options.routeGuard ? [options.routeGuard] : [];\n const maxSessions = Math.max(1, options.maxSessions ?? DEFAULT_MAX_SESSIONS);\n const idleMs = Math.max(0, options.sessionIdleMs ?? DEFAULT_SESSION_IDLE_MS);\n const legacyEnabled = options.enableLegacySse !== false;\n\n // A wildcard entry is meaningless for a host/origin allow-list and would make\n // the guard reject everything, so it is filtered out here.\n const allowedOrigins =\n options.allowedOrigins?.filter(\n (entry) => Boolean(entry) && entry !== \"*\",\n ) ?? [];\n const configuredHosts = options.allowedHosts?.filter(Boolean) ?? [];\n\n // Only enable the SDK's host/origin checks when a concrete allow-list exists;\n // enabling them with an empty list would reject every request.\n const dnsProtection = allowedOrigins.length > 0 || configuredHosts.length > 0;\n\n /**\n * Host allow-list actually handed to the transport.\n *\n * The SDK validates Host *and* Origin whenever protection is on. Enabling\n * protection with only origins configured therefore rejects every request,\n * because the empty host list matches nothing. Deriving the hosts from the\n * configured origins keeps the common \"I only listed my web UI origin\" case\n * working.\n */\n const allowedHosts =\n configuredHosts.length > 0\n ? configuredHosts\n : allowedOrigins\n .map((origin) => {\n try {\n return new URL(origin).host;\n } catch {\n return \"\";\n }\n })\n .filter(Boolean);\n\n const emit = (event: McpSessionEvent): void => {\n try {\n options.onEvent?.(event);\n } catch {\n // Observability must never break traffic.\n }\n };\n\n function touch(sessionId: string): void {\n const record = sessions.get(sessionId);\n if (record) record.lastActivityAt = Date.now();\n }\n\n async function destroySession(\n sessionId: string,\n reason: SessionCloseReason,\n ): Promise<boolean> {\n const record = sessions.get(sessionId);\n if (!record || record.closing) return false;\n\n // Mark and unregister before awaiting: `transport.close()` synchronously\n // fires `onclose`, which re-enters this function for the same session.\n record.closing = true;\n sessions.delete(sessionId);\n if (record.keepAlive) clearInterval(record.keepAlive);\n\n const closure = (async () => {\n // Close the transport first so the peer sees a clean shutdown, then the\n // server. Both are best-effort: a half-dead socket must not throw here.\n try {\n await record.transport.close();\n } catch {\n // Ignore: the underlying socket may already be gone.\n }\n try {\n await record.server.close();\n } catch {\n // Ignore: closing an already-closed server is not an error condition.\n }\n })();\n\n closures.set(sessionId, closure);\n try {\n await closure;\n } finally {\n closures.delete(sessionId);\n }\n\n emit({ type: \"session-closed\", kind: record.kind, sessionId, reason });\n return true;\n }\n\n /** Rejects a new session when the spec is unavailable or capacity is reached. */\n function admit(kind: SessionKind, response: express.Response): boolean {\n if (!specProvider()) {\n emit({ type: \"session-rejected\", kind, reason: \"no-active-spec\" });\n response\n .status(503)\n .json(\n rpcError(\n -32000,\n \"No MCP service is currently running. Load a specification and start the service first.\",\n ),\n );\n return false;\n }\n if (sessions.size + pending >= maxSessions) {\n emit({ type: \"session-rejected\", kind, reason: \"capacity\" });\n response\n .status(429)\n .json(\n rpcError(\n -32000,\n `Too many concurrent MCP sessions (limit ${maxSessions}).`,\n ),\n );\n return false;\n }\n return true;\n }\n\n /* ---------------------------------------------------------------------- */\n /* Streamable HTTP transport */\n /* ---------------------------------------------------------------------- */\n\n /**\n * Creates a Streamable HTTP session and hands the current request to it.\n *\n * The session id is minted by the transport while it processes the\n * `initialize` request, which happens inside `handleRequest`, not during\n * `connect`. The registry is therefore populated from the\n * `onsessioninitialized` callback so that no window exists in which a\n * follow-up request could reference an untracked session.\n *\n * Returns true when the handshake completed and the session is registered.\n */\n async function openStreamableSession(\n request: express.Request,\n response: express.Response,\n body: unknown,\n ): Promise<boolean> {\n const server = buildMcpServer(specProvider, contextProvider, {\n protocol: \"streamable-http\",\n });\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n enableDnsRebindingProtection: dnsProtection,\n ...(allowedHosts.length > 0 ? { allowedHosts } : {}),\n ...(allowedOrigins.length > 0 ? { allowedOrigins } : {}),\n onsessioninitialized: (sessionId: string): void => {\n const now = Date.now();\n sessions.set(sessionId, {\n sessionId,\n kind: \"streamable-http\",\n transport: asTransport(transport),\n server,\n createdAt: now,\n lastActivityAt: now,\n closing: false,\n remoteAddress: request.ip,\n userAgent: readHeader(request.headers[\"user-agent\"]),\n });\n emit({ type: \"session-opened\", kind: \"streamable-http\", sessionId });\n },\n onsessionclosed: (sessionId: string): void => {\n void destroySession(sessionId, \"client-terminated\");\n },\n });\n\n const rollback = async (): Promise<void> => {\n // Best effort on both: the session may already be half torn down, and a\n // secondary failure must not mask the original error.\n await transport.close().catch(() => undefined);\n await server.close().catch(() => undefined);\n };\n\n pending += 1;\n try {\n try {\n await server.connect(asTransport(transport));\n } catch (error) {\n await rollback();\n emit({\n type: \"session-error\",\n kind: \"streamable-http\",\n reason: describe(error),\n });\n if (!response.headersSent) {\n response\n .status(500)\n .json(rpcError(-32603, \"Failed to initialize the MCP session.\"));\n }\n return false;\n }\n\n // Registered only after connect, because connect installs the SDK's own\n // onclose/onerror and would otherwise overwrite these handlers, leaving\n // abruptly dropped sessions in the map until the idle sweeper runs.\n chainOnClose(transport, () => {\n const sessionId = transport.sessionId;\n if (sessionId) void destroySession(sessionId, \"transport-closed\");\n });\n\n chainOnError(transport, (error) => {\n emit({\n type: \"session-error\",\n kind: \"streamable-http\",\n sessionId: transport.sessionId,\n reason: error.message,\n });\n });\n\n try {\n // This call performs the initialize handshake and, on success, triggers\n // `onsessioninitialized`, which registers the session.\n await transport.handleRequest(request, response, body);\n } catch (error) {\n const sessionId = transport.sessionId;\n if (sessionId && sessions.has(sessionId)) {\n await destroySession(sessionId, \"initialize-failed\");\n } else {\n await rollback();\n }\n emit({\n type: \"session-error\",\n kind: \"streamable-http\",\n sessionId,\n reason: describe(error),\n });\n if (!response.headersSent) {\n response\n .status(500)\n .json(rpcError(-32603, \"Failed to handle the initialize request.\"));\n }\n return false;\n }\n\n // A transport that finished the request without minting a session id means\n // the payload was rejected at the protocol level; the transport already\n // wrote the response. Release the server rather than leaking it.\n if (!transport.sessionId) {\n await rollback();\n return false;\n }\n\n return true;\n } finally {\n pending -= 1;\n }\n }\n\n const handleStreamable: express.RequestHandler = async (\n request,\n response,\n ) => {\n const sessionId = readHeader(request.headers[\"mcp-session-id\"]);\n\n try {\n if (sessionId) {\n const record = sessions.get(sessionId);\n if (!record || record.kind !== \"streamable-http\" || record.closing) {\n response\n .status(404)\n .json(rpcError(-32001, \"Unknown or expired MCP session.\"));\n return;\n }\n\n // Stamp before and after: a streaming GET can stay open for a long\n // time, and refreshing only on completion would let the idle reaper cut\n // a session that is actively serving a client.\n touch(sessionId);\n await asStreamableTransport(record.transport).handleRequest(\n request,\n response,\n request.body,\n );\n touch(sessionId);\n return;\n }\n\n // Without a session header, only a well-formed initialize POST may open one.\n if (request.method !== \"POST\") {\n response\n .status(400)\n .json(\n rpcError(\n -32000,\n \"Missing mcp-session-id header. Send an initialize request over POST first, or use the legacy /sse endpoint.\",\n ),\n );\n return;\n }\n\n if (!isInitializeRequest(request.body)) {\n response\n .status(400)\n .json(\n rpcError(\n -32000,\n \"Missing mcp-session-id header and the payload is not an initialize request. The session may have expired; re-initialize before retrying.\",\n ),\n );\n return;\n }\n\n if (!admit(\"streamable-http\", response)) return;\n\n // `openStreamableSession` answers this very request as part of the\n // handshake, so nothing further may touch the response here.\n await openStreamableSession(request, response, request.body);\n } catch (error) {\n emit({\n type: \"session-error\",\n kind: \"streamable-http\",\n sessionId,\n reason: describe(error),\n });\n if (!response.headersSent) {\n response\n .status(500)\n .json(\n rpcError(-32603, \"Internal error while handling the MCP request.\"),\n );\n } else {\n // Headers are already out; the only correct action is to stop the stream.\n response.end();\n }\n }\n };\n\n app.post(MCP_ROUTES.streamableHttp, ...guard, handleStreamable);\n app.get(MCP_ROUTES.streamableHttp, ...guard, handleStreamable);\n // DELETE is how a client explicitly terminates its session; omitting it would\n // leave sessions to expire on the idle timeout instead.\n app.delete(MCP_ROUTES.streamableHttp, ...guard, handleStreamable);\n\n /* ---------------------------------------------------------------------- */\n /* Legacy HTTP+SSE transport */\n /* ---------------------------------------------------------------------- */\n\n if (legacyEnabled) {\n app.get(MCP_ROUTES.sse, ...guard, async (request, response) => {\n // Origin is validated manually here: the legacy transport has no built-in\n // DNS rebinding protection. A missing Origin header is allowed through\n // because non-browser clients never send one.\n if (allowedOrigins.length > 0) {\n const origin = readHeader(request.headers.origin);\n if (origin && !allowedOrigins.includes(origin)) {\n emit({ type: \"session-rejected\", kind: \"sse\", reason: \"origin\" });\n response.status(403).json(rpcError(-32000, \"Origin is not allowed.\"));\n return;\n }\n }\n\n if (!admit(\"sse\", response)) return;\n\n const server = buildMcpServer(specProvider, contextProvider, {\n protocol: \"sse\",\n });\n const transport = new SSEServerTransport(MCP_ROUTES.messages, response);\n const sessionId = transport.sessionId;\n const now = Date.now();\n\n const record: SessionRecord = {\n sessionId,\n kind: \"sse\",\n transport: asTransport(transport),\n server,\n createdAt: now,\n lastActivityAt: now,\n closing: false,\n remoteAddress: request.ip,\n userAgent: readHeader(request.headers[\"user-agent\"]),\n };\n sessions.set(sessionId, record);\n\n // Registered immediately: unlike the streamable transport, the SSE stream\n // is the only signal that the peer went away, and the response can be\n // destroyed before connect() resolves.\n response.on(\n \"close\",\n () => void destroySession(sessionId, \"client-closed\"),\n );\n response.on(\n \"error\",\n () => void destroySession(sessionId, \"stream-error\"),\n );\n\n try {\n await server.connect(asTransport(transport));\n } catch (error) {\n emit({\n type: \"session-error\",\n kind: \"sse\",\n sessionId,\n reason: describe(error),\n });\n await destroySession(sessionId, \"connect-failed\");\n if (!response.headersSent) {\n response\n .status(500)\n .json(rpcError(-32603, \"Failed to initialize the MCP session.\"));\n }\n return;\n }\n\n chainOnClose(transport, () => {\n void destroySession(sessionId, \"transport-closed\");\n });\n\n chainOnError(transport, (error) => {\n emit({\n type: \"session-error\",\n kind: \"sse\",\n sessionId,\n reason: error.message,\n });\n });\n\n // Started only after connect: the transport writes the SSE preamble during\n // connect, and a keep-alive comment emitted before that would land ahead\n // of the response headers.\n //\n // write() reports back-pressure failures through its callback rather than\n // by throwing, so the callback — not a try/catch — is what detects a dead\n // socket here.\n record.keepAlive = setInterval(() => {\n if (response.writableEnded || response.destroyed) return;\n response.write(\": keepalive\\n\\n\", (error) => {\n if (error) void destroySession(sessionId, \"keepalive-write-failed\");\n });\n }, KEEPALIVE_INTERVAL_MS);\n record.keepAlive.unref?.();\n\n emit({ type: \"session-opened\", kind: \"sse\", sessionId });\n });\n\n app.post(MCP_ROUTES.messages, ...guard, async (request, response) => {\n const sessionId =\n readQueryValue(request.query.sessionId) ||\n readHeader(request.headers[\"mcp-session-id\"]) ||\n \"\";\n\n if (!sessionId) {\n response\n .status(400)\n .json(rpcError(-32000, \"A sessionId query parameter is required.\"));\n return;\n }\n\n const record = sessions.get(sessionId);\n if (!record || record.kind !== \"sse\" || record.closing) {\n response\n .status(404)\n .json(rpcError(-32001, \"Unknown or expired sessionId.\"));\n return;\n }\n\n touch(sessionId);\n try {\n await asSseTransport(record.transport).handlePostMessage(\n request,\n response,\n request.body,\n );\n } catch (error) {\n emit({\n type: \"session-error\",\n kind: \"sse\",\n sessionId,\n reason: describe(error),\n });\n if (!response.headersSent) {\n response\n .status(500)\n .json(rpcError(-32603, \"Failed to dispatch the MCP message.\"));\n } else {\n response.end();\n }\n }\n });\n }\n\n /* ---------------------------------------------------------------------- */\n /* Idle session reaper */\n /* ---------------------------------------------------------------------- */\n\n let sweeper: NodeJS.Timeout | undefined;\n if (idleMs > 0) {\n sweeper = setInterval(() => {\n const cutoff = Date.now() - idleMs;\n // Snapshot first: destroySession mutates the map while iterating.\n for (const record of [...sessions.values()]) {\n if (record.lastActivityAt < cutoff) {\n void destroySession(record.sessionId, \"idle-timeout\");\n }\n }\n }, SWEEP_INTERVAL_MS);\n // Never hold the event loop open on account of the sweeper.\n sweeper.unref?.();\n }\n\n async function closeAll(): Promise<void> {\n await Promise.all(\n [...sessions.keys()].map((sessionId) =>\n destroySession(sessionId, \"shutdown\"),\n ),\n );\n\n // Await teardowns that were already in flight, otherwise the caller can\n // proceed to close the HTTP listener while sockets are still draining.\n //\n // Bounded by a deadline rather than looping until empty: a transport whose\n // close() never settles (a socket stuck in a half-open state does this)\n // would otherwise hang process shutdown forever.\n const deadline = Date.now() + DRAIN_TIMEOUT_MS;\n while (closures.size > 0 && Date.now() < deadline) {\n await Promise.race([\n Promise.all([...closures.values()]),\n new Promise((resolve) => setTimeout(resolve, 100).unref?.()),\n ]);\n }\n }\n\n return {\n activeSessionCount: () => sessions.size,\n pendingSessionCount: () => pending,\n listSessions: () =>\n [...sessions.values()].map((record) => ({\n sessionId: record.sessionId,\n kind: record.kind,\n createdAt: new Date(record.createdAt).toISOString(),\n lastActivityAt: new Date(record.lastActivityAt).toISOString(),\n remoteAddress: record.remoteAddress,\n userAgent: record.userAgent,\n })),\n closeSession: (\n sessionId: string,\n reason: SessionCloseReason = \"closed-by-operator\",\n ) => destroySession(sessionId, reason),\n closeAll,\n dispose: async () => {\n if (sweeper) clearInterval(sweeper);\n sweeper = undefined;\n await closeAll();\n },\n };\n}\n\n/**\n * Backwards-compatible alias for the previous export name.\n *\n * @deprecated Use {@link attachMcpRoutes}. This wrapper keeps the old\n * positional signature working but no longer serves the legacy SSE stream at\n * `GET /mcp`, because that path now belongs to the Streamable HTTP transport.\n * It also drops the sweeper handle, so callers cannot fully shut down; migrate.\n */\nexport function attachSseRoutes(\n app: express.Express,\n specProvider: SpecProvider,\n contextProvider: ContextProvider,\n routeGuard?: express.RequestHandler,\n): { activeSessionCount: () => number; closeAll: () => Promise<void> } {\n const handle = attachMcpRoutes(app, {\n specProvider,\n contextProvider,\n ...(routeGuard ? { routeGuard } : {}),\n });\n return {\n activeSessionCount: handle.activeSessionCount,\n closeAll: handle.closeAll,\n };\n}\n","import type { Request, Response, NextFunction, RequestHandler } from \"express\";\nimport { createHash, timingSafeEqual } from \"node:crypto\";\n\n/**\n * Compares two secrets without leaking either their content or their length.\n *\n * `timingSafeEqual` requires equal-length buffers, and guarding that with an\n * early length check would itself expose the key length through response timing.\n * Hashing both sides to a fixed 32 bytes first removes the length signal\n * entirely and keeps every comparison on the same constant-time path.\n */\nfunction safeCompare(left: string, right: string): boolean {\n const digest = (value: string): Buffer =>\n createHash(\"sha256\").update(value, \"utf8\").digest();\n return timingSafeEqual(digest(left), digest(right));\n}\n\n/** Extracts a bearer token, tolerating the case variations seen in the wild. */\nfunction readBearerToken(header: string | undefined): string | undefined {\n if (!header) return undefined;\n const match = /^bearer\\s+(.+)$/i.exec(header.trim());\n return match?.[1]?.trim() || undefined;\n}\n\nfunction firstHeaderValue(\n value: string | string[] | undefined,\n): string | undefined {\n if (Array.isArray(value)) return value[0];\n return value;\n}\n\n/**\n * Guards the admin API with a shared secret.\n *\n * Passing `undefined` disables the guard, which is the documented default for\n * loopback-only use. An empty or whitespace-only string is rejected instead of\n * being treated as \"disabled\": that case almost always means an environment\n * variable was set but never populated, and silently serving an unprotected\n * admin API to an operator who believes it is locked down is the worst possible\n * outcome.\n */\nexport function createAuthMiddleware(apiKey?: string): RequestHandler {\n if (apiKey !== undefined && apiKey.trim().length === 0) {\n throw new Error(\n \"The configured API key is empty. Omit it entirely to run without authentication, or supply a non-empty value.\",\n );\n }\n\n const expected = apiKey;\n\n return (request: Request, response: Response, next: NextFunction): void => {\n if (!expected) return next();\n\n // A CORS preflight carries no custom headers by design, so requiring the key\n // here would fail the preflight and surface in the browser as an opaque CORS\n // error rather than as an authentication problem. The preflight itself\n // reveals nothing, and the actual request that follows is still checked.\n if (request.method === \"OPTIONS\") return next();\n\n // Both header forms are accepted because MCP clients typically only expose a\n // field for `Authorization`, while the bundled web console uses `x-api-key`.\n const presented =\n firstHeaderValue(request.headers[\"x-api-key\"]) ??\n readBearerToken(firstHeaderValue(request.headers.authorization));\n\n if (!presented || !safeCompare(presented, expected)) {\n response\n .status(401)\n .set(\"WWW-Authenticate\", 'Bearer realm=\"openapi-mcp\"')\n // `no-store` keeps an intermediary from caching the rejection and\n // serving it back once a correct key is supplied.\n .set(\"Cache-Control\", \"no-store\")\n .json({ error: \"Unauthorized\" });\n return;\n }\n\n next();\n };\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\n/**\n * Restrictive mode for the state file.\n *\n * The persisted state carries the admin API key and upstream base URL, i.e.\n * credentials. The default 0o666 & ~umask usually lands on 0o644, which makes\n * them readable by every local account.\n */\nconst STATE_FILE_MODE = 0o600;\nconst STATE_DIR_MODE = 0o700;\n\nconst STATE_FILE_NAME = \"state.json\";\nconst APP_DIR_NAME = \"openapi-mcp\";\n\nexport interface SaveResult {\n ok: boolean;\n path: string;\n error?: Error;\n}\n\n/**\n * Resolves the state file location.\n *\n * Deliberately a function rather than a module-level constant: the previous\n * cwd-relative constant was captured at import time, and when an MCP client\n * spawns this binary over stdio the cwd is the client's own directory (often\n * \"/\" or a read-only bundle path). That produced a file nobody could find and\n * a config that silently reset on every launch.\n */\nexport function resolveStateFilePath(): string {\n const explicit = process.env.OPENAPI_MCP_STATE_FILE?.trim();\n if (explicit) return path.resolve(explicit);\n\n const xdg = process.env.XDG_CONFIG_HOME?.trim();\n const base = xdg\n ? path.resolve(xdg)\n : process.platform === \"win32\"\n ? path.join(process.env.APPDATA ?? os.homedir(), \"\")\n : path.join(os.homedir(), \".config\");\n\n return path.join(base, APP_DIR_NAME, STATE_FILE_NAME);\n}\n\nfunction describe(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\n/**\n * Drops keys that would poison a prototype once the caller merges the result.\n *\n * JSON.parse itself is safe (it creates a plain own property), but callers\n * routinely do Object.assign(defaults, loadState()), and that assignment does\n * hit the __proto__ setter.\n */\nfunction safeReviver(key: string, value: unknown): unknown {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n return undefined;\n }\n return value;\n}\n\n/**\n * Atomically persists state.\n *\n * Write order is write -> fsync -> close -> rename. Skipping the fsync still\n * gives an atomic *visibility* switch, but on an unclean shutdown the rename\n * metadata can reach disk while the contents are still in page cache, leaving\n * a valid path pointing at a zero-length file — a config that silently wiped\n * itself.\n */\nexport function saveState(\n obj: Record<string, unknown>,\n stateFilePath: string = resolveStateFilePath(),\n): SaveResult {\n const dir = path.dirname(stateFilePath);\n let tempFile: string | undefined;\n\n try {\n fs.mkdirSync(dir, { recursive: true, mode: STATE_DIR_MODE });\n\n // Serialise before creating the temp file so a circular or BigInt value\n // throws without leaving anything behind.\n const payload = JSON.stringify(obj, null, 2);\n\n tempFile = path.join(\n dir,\n `.${path.basename(stateFilePath)}.${process.pid}.${Date.now()}.tmp`,\n );\n\n const handle = fs.openSync(tempFile, \"wx\", STATE_FILE_MODE);\n try {\n fs.writeFileSync(handle, payload, \"utf8\");\n fs.fsyncSync(handle);\n } finally {\n fs.closeSync(handle);\n }\n\n fs.renameSync(tempFile, stateFilePath);\n tempFile = undefined;\n\n // rename does not touch the permissions of a pre-existing target, so a\n // file created by an older build keeps its loose mode forever unless it is\n // explicitly tightened here.\n try {\n fs.chmodSync(stateFilePath, STATE_FILE_MODE);\n } catch {\n // Best effort: some filesystems (FAT, certain network mounts) reject\n // chmod outright, and that must not fail an otherwise good write.\n }\n\n return { ok: true, path: stateFilePath };\n } catch (error) {\n console.warn(\n `[config-store] Failed to persist state to ${stateFilePath}: ${describe(error)}`,\n );\n return { ok: false, path: stateFilePath, error: toError(error) };\n } finally {\n // Without this, every failed rename leaves another orphaned .tmp behind.\n if (tempFile) {\n try {\n fs.unlinkSync(tempFile);\n } catch {\n // Nothing further to do; the warning above already reported the cause.\n }\n }\n }\n}\n\n/**\n * Moves an unparseable state file aside instead of letting it be overwritten.\n *\n * The old behaviour returned {} on a parse error, and the next saveState then\n * clobbered the damaged file — destroying the only copy of whatever the user\n * had configured before anyone could inspect it.\n */\nfunction quarantine(stateFilePath: string): void {\n const backup = `${stateFilePath}.corrupt-${Date.now()}`;\n try {\n fs.renameSync(stateFilePath, backup);\n console.warn(`[config-store] Moved unreadable state file to ${backup}`);\n } catch (error) {\n console.warn(\n `[config-store] Could not quarantine ${stateFilePath}: ${describe(error)}`,\n );\n }\n}\n\nexport function loadState(\n stateFilePath: string = resolveStateFilePath(),\n): Record<string, unknown> {\n let raw: string;\n try {\n // Read directly rather than existsSync-then-read: the extra stat is both a\n // TOCTOU window and a syscall that ENOENT already reports for free.\n raw = fs.readFileSync(stateFilePath, \"utf8\");\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") {\n console.warn(\n `[config-store] Failed to read state from ${stateFilePath}: ${describe(error)}`,\n );\n }\n return {};\n }\n\n // An empty file is the normal result of an interrupted legacy write, not\n // corruption worth quarantining.\n if (raw.trim() === \"\") return {};\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw, safeReviver);\n } catch (error) {\n console.warn(\n `[config-store] State file is not valid JSON: ${describe(error)}`,\n );\n quarantine(stateFilePath);\n return {};\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n console.warn(\"[config-store] State file does not contain a JSON object.\");\n quarantine(stateFilePath);\n return {};\n }\n\n return parsed as Record<string, unknown>;\n}\n\n/** Removes the persisted state; used by the \"clear spec\" admin action. */\nexport function clearState(\n stateFilePath: string = resolveStateFilePath(),\n): SaveResult {\n try {\n fs.rmSync(stateFilePath, { force: true });\n return { ok: true, path: stateFilePath };\n } catch (error) {\n console.warn(\n `[config-store] Failed to clear state at ${stateFilePath}: ${describe(error)}`,\n );\n return { ok: false, path: stateFilePath, error: toError(error) };\n }\n}\n","import type { ManagedServiceRecord } from \"../types\";\n\nexport class ServiceRegistry {\n private readonly records = new Map<string, ManagedServiceRecord>();\n\n upsert(record: ManagedServiceRecord): void {\n this.records.set(record.id, record);\n }\n\n list(): ManagedServiceRecord[] {\n return Array.from(this.records.values()).sort((left, right) =>\n left.createdAt.localeCompare(right.createdAt),\n );\n }\n\n get(id: string): ManagedServiceRecord | undefined {\n return this.records.get(id);\n }\n\n remove(id: string): boolean {\n return this.records.delete(id);\n }\n\n clear(): void {\n this.records.clear();\n }\n\n start(id: string): ManagedServiceRecord | undefined {\n const current = this.records.get(id);\n if (!current) return undefined;\n const next: ManagedServiceRecord = {\n ...current,\n status: \"running\",\n updatedAt: new Date().toISOString(),\n lastError: undefined,\n };\n this.records.set(id, next);\n return next;\n }\n\n stop(id: string): ManagedServiceRecord | undefined {\n const current = this.records.get(id);\n if (!current) return undefined;\n const next: ManagedServiceRecord = {\n ...current,\n status: \"stopped\",\n updatedAt: new Date().toISOString(),\n };\n this.records.set(id, next);\n return next;\n }\n\n fail(id: string, message: string): ManagedServiceRecord | undefined {\n const current = this.records.get(id);\n if (!current) return undefined;\n const next: ManagedServiceRecord = {\n ...current,\n status: \"error\",\n updatedAt: new Date().toISOString(),\n lastError: {\n message,\n at: new Date().toISOString(),\n },\n };\n this.records.set(id, next);\n return next;\n }\n}\n","// src/server/admin-server.ts\nimport express, { type Express, type RequestHandler } from \"express\";\nimport cors, { type CorsOptions } from \"cors\";\nimport multer from \"multer\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createServer, type Server } from \"node:http\";\nimport { fileURLToPath } from \"node:url\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { parseSpecContent } from \"../core/openapi-loader\";\nimport { executeToolCall } from \"../core/http-executor\";\nimport { getGeneratedTools } from \"../core/tool-generator\";\nimport { generatePrompts } from \"../registry/prompt-registry\";\nimport { generateResources } from \"../registry/resource-registry\";\nimport { createAuthMiddleware } from \"./auth\";\nimport {\n clearState,\n loadState,\n saveState,\n type SaveResult,\n} from \"../config/config-store\";\nimport {\n attachMcpRoutes,\n MCP_ROUTES,\n type McpRouteHandle,\n} from \"../mcp/transport-http\";\nimport { ServiceRegistry } from \"../runtime/service-registry\";\nimport type {\n AdminStatus,\n AppState,\n ExecutionContext,\n RequestLogEntry,\n ServerConfig,\n SpecSource,\n} from \"../types\";\nimport { isAbortError, newId } from \"@/core/global-utils\";\n\nconst MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * The web UI ships next to the compiled output, but the exact depth differs\n * between a bundled build, a plain `tsc` build and a source-run via tsx. Probe\n * the known layouts once at module load instead of guessing at request time.\n */\nconst STATIC_DIR =\n [\n path.resolve(MODULE_DIR, \"webui\"),\n path.resolve(MODULE_DIR, \"../webui\"),\n path.resolve(MODULE_DIR, \"../../webui\"),\n ].find((candidate) => fs.existsSync(path.join(candidate, \"index.html\"))) ??\n path.resolve(MODULE_DIR, \"webui\");\n\nconst INDEX_HTML = path.join(STATIC_DIR, \"index.html\");\n\nconst MAX_UPLOAD_BYTES = 20 * 1024 * 1024;\nconst JSON_BODY_LIMIT = \"20mb\";\nconst DEFAULT_MAX_LOG_ENTRIES = 200;\n/** Coalescing window for state writes, since each one re-serialises the spec. */\nconst PERSIST_DEBOUNCE_MS = 250;\n/**\n * Bounded receive window. Zero would disable it entirely, which only helps a\n * slowloris: requestTimeout limits how long a client may take to *send* a\n * request and has nothing to do with how long a streaming response may live.\n */\nconst REQUEST_TIMEOUT_MS = 300_000;\n\n/** Endpoint layout advertised to clients and rendered by the web UI. */\nconst ENDPOINTS = {\n streamableHttp: MCP_ROUTES.streamableHttp,\n sse: MCP_ROUTES.sse,\n messages: MCP_ROUTES.messages,\n stdioSupported: true,\n} as const;\n\ninterface ApplyResult {\n serviceId: string;\n toolCount: number;\n promptCount: number;\n resourceCount: number;\n degradedTools: string[];\n issues: string[];\n}\n\n/** Handle returned to the embedding process so it can shut everything down. */\nexport interface AdminServerHandle {\n app: Express;\n server: Server;\n /** Actual bound port, which differs from the request when port 0 is used. */\n port: number;\n /** Closes MCP sessions and the HTTP listener. Safe to call more than once. */\n close: () => Promise<void>;\n}\n\n/**\n * Express 5 widens route parameter values to `string | string[] | undefined`\n * because path-to-regexp v8 can emit repeated segments, and a RegExp route\n * anywhere in the app relaxes the inferred parameter map for the whole router.\n * Every parameter read must therefore be normalized rather than cast.\n */\nfunction readParam(value: unknown): string | null {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n if (Array.isArray(value)) {\n for (const candidate of value) {\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n return candidate.trim();\n }\n }\n }\n return null;\n}\n\nfunction newLogId(): string {\n try {\n return randomUUID();\n } catch {\n return `log_${Date.now()}_${Math.random().toString(16).slice(2)}`;\n }\n}\n\n/**\n * Removes a UTF-8 byte order mark.\n *\n * Editors on Windows routinely emit one. JSON.parse rejects it outright, and\n * because trimStart() does not treat it as whitespace the format sniffer below\n * would also misread the document as YAML — producing a syntax error that says\n * nothing about the real cause.\n */\nfunction stripBom(text: string): string {\n return text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;\n}\n\n/**\n * Decides which parser to try first.\n *\n * A leading brace or bracket is a reliable JSON signal. Everything else,\n * including a `.yaml` filename, is tried as YAML first — and since YAML is a\n * superset of JSON in practice, guessing wrong is recoverable via the fallback.\n */\nfunction shouldParseAsYaml(raw: string): boolean {\n const trimmed = stripBom(raw).trimStart();\n return !(trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\"));\n}\n\ntype ParsedSpec = Awaited<ReturnType<typeof parseSpecContent>>;\n\nasync function parseWithFallback(\n raw: string,\n preferYaml: boolean,\n): Promise<{ spec: ParsedSpec; isYaml: boolean }> {\n try {\n return {\n spec: await parseSpecContent(raw, preferYaml),\n isYaml: preferYaml,\n };\n } catch (firstError) {\n try {\n return {\n spec: await parseSpecContent(raw, !preferYaml),\n isYaml: !preferYaml,\n };\n } catch {\n // Report the failure of the more likely format; the fallback error is\n // almost always a misleading syntax complaint about the wrong language.\n throw firstError;\n }\n }\n}\n\n/**\n * Derives the service id from the document *contents*, not just its identity.\n *\n * Hashing title+version alone looked attractive for keeping ids stable across\n * reloads, but developers iterate on a specification without ever bumping\n * info.version. That made a materially different document report the same id,\n * which in turn skipped the session invalidation below — leaving connected\n * clients calling tools that no longer exist. Two unrelated documents both\n * titled \"API 1.0.0\" collided for the same reason.\n */\nfunction computeServiceId(\n title: string,\n version: string,\n rawText: string,\n): string {\n const digest = createHash(\"sha256\")\n .update(`${title}\\u0000${version}\\u0000${rawText}`)\n .digest(\"hex\")\n .slice(0, 12);\n return `svc_${digest}`;\n}\n\nfunction buildCorsOptions(config: ServerConfig): CorsOptions {\n const allowed = config.allowedOrigins;\n // Default deny: the admin API can load specifications and issue upstream\n // calls, so it must never be reachable from an arbitrary origin by default.\n if (!allowed || allowed.length === 0) return { origin: false };\n if (allowed.includes(\"*\")) return { origin: true, credentials: false };\n\n const allowSet = new Set(allowed);\n return {\n origin(origin, callback) {\n // A missing Origin header means a same-origin or non-browser client.\n if (!origin || allowSet.has(origin)) {\n callback(null, true);\n return;\n }\n callback(null, false);\n },\n credentials: true,\n };\n}\n\nfunction toMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction formatIssue(issue: {\n method?: string | undefined;\n path: string;\n message: string;\n}): string {\n const method = issue.method ? `${issue.method.toUpperCase()} ` : \"\";\n return `${method}${issue.path}: ${issue.message}`;\n}\n\n/**\n * Memoises prompt and resource generation per document.\n *\n * Unlike getGeneratedTools these registries have no cache of their own, and\n * buildStatus runs on every mutating endpoint plus a three-second poll from the\n * web UI. Regenerating them each time burns CPU on the single event-loop thread\n * for a result that cannot change while the document is identical.\n */\nconst promptCache = new WeakMap<object, ReturnType<typeof generatePrompts>>();\nconst resourceCache = new WeakMap<\n object,\n ReturnType<typeof generateResources>\n>();\n\nfunction cachedPrompts(spec: ParsedSpec): ReturnType<typeof generatePrompts> {\n const key = spec as unknown as object;\n const hit = promptCache.get(key);\n if (hit) return hit;\n const value = generatePrompts(spec);\n promptCache.set(key, value);\n return value;\n}\n\nfunction cachedResources(\n spec: ParsedSpec,\n): ReturnType<typeof generateResources> {\n const key = spec as unknown as object;\n const hit = resourceCache.get(key);\n if (hit) return hit;\n const value = generateResources(spec);\n resourceCache.set(key, value);\n return value;\n}\n\nexport async function startAdminServer(\n config: ServerConfig,\n): Promise<AdminServerHandle> {\n const app = express();\n const auth: RequestHandler = createAuthMiddleware(config.apiKey);\n const registry = new ServiceRegistry();\n const persistEnabled = config.persistState !== false;\n const maxLogEntries = Math.max(\n 20,\n config.maxLogEntries ?? DEFAULT_MAX_LOG_ENTRIES,\n );\n\n const state: AppState = {\n spec: null,\n baseUrlOverride: config.baseUrlOverride,\n specSource: config.specPath ? \"startup-file\" : \"runtime\",\n };\n\n const logEntries: RequestLogEntry[] = [];\n let activeServiceId: string | null = null;\n let activeSpecRawText = \"\";\n let activeSpecIsYaml = false;\n let closed = false;\n\n app.disable(\"x-powered-by\");\n app.use(cors(buildCorsOptions(config)));\n\n // The Streamable HTTP transport consumes an already-parsed body, so the JSON\n // parser must run before the MCP routes are attached.\n app.use(express.json({ limit: JSON_BODY_LIMIT }));\n\n /* ---------------------------------------------------------------------- */\n /* Logging */\n /* ---------------------------------------------------------------------- */\n\n function addLog(entry: RequestLogEntry): void {\n logEntries.unshift({\n ...entry,\n serviceId: entry.serviceId ?? activeServiceId ?? undefined,\n });\n if (logEntries.length > maxLogEntries) {\n logEntries.length = maxLogEntries;\n }\n }\n\n function addInternalLog(\n event: string,\n success: boolean,\n serviceId?: string,\n extra?: Record<string, unknown>,\n error?: string,\n ): void {\n addLog({\n id: newLogId(),\n at: new Date().toISOString(),\n direction: \"internal\",\n protocol: undefined,\n success,\n serviceId,\n error,\n meta: { event, ...extra },\n });\n }\n\n function isActive(): boolean {\n if (!state.spec || !activeServiceId) return false;\n return registry.get(activeServiceId)?.status === \"running\";\n }\n\n /* ---------------------------------------------------------------------- */\n /* MCP transports */\n /* ---------------------------------------------------------------------- */\n\n const contextProvider = (): ExecutionContext => ({\n baseUrlOverride: state.baseUrlOverride,\n upstreamHeaders: config.upstreamHeaders,\n requestTimeoutMs: config.requestTimeoutMs,\n onLog: addLog,\n });\n\n /**\n * Attached before applySpec/clearSpec are ever invoked.\n *\n * Those helpers are hoisted function declarations that close over `mcp`, so\n * calling one before this line would throw a TDZ ReferenceError far from its\n * actual cause. Keeping the binding above every call site removes the hazard\n * instead of relying on statement order further down.\n */\n const mcp: McpRouteHandle = attachMcpRoutes(app, {\n specProvider: () => (isActive() ? state.spec : null),\n contextProvider,\n ...(config.apiKey ? { routeGuard: auth } : {}),\n ...(config.allowedOrigins?.length\n ? { allowedOrigins: config.allowedOrigins }\n : {}),\n ...(config.allowedHosts?.length\n ? { allowedHosts: config.allowedHosts }\n : {}),\n onEvent(event) {\n addInternalLog(\n event.type,\n event.type !== \"session-error\",\n undefined,\n // Spread conditionally: several event types genuinely carry no session\n // id or reason, and writing explicit undefined into the log record made\n // the viewer render empty fields for every rejection.\n {\n transport: event.kind,\n ...(event.sessionId ? { sessionId: event.sessionId } : {}),\n ...(event.reason ? { reason: event.reason } : {}),\n },\n );\n },\n });\n\n async function closeSessions(reason: string): Promise<void> {\n const before = mcp.activeSessionCount();\n if (before === 0) return;\n await mcp.closeAll();\n addInternalLog(\"sessions-closed\", true, undefined, {\n reason,\n closed: before,\n });\n }\n\n /* ---------------------------------------------------------------------- */\n /* Persistence */\n /* ---------------------------------------------------------------------- */\n\n let persistTimer: NodeJS.Timeout | undefined;\n let persistPending: { specRaw: string | null; specIsYaml: boolean } | null =\n null;\n\n function flushState(): void {\n if (persistTimer) {\n clearTimeout(persistTimer);\n persistTimer = undefined;\n }\n const payload = persistPending;\n persistPending = null;\n if (!payload) return;\n\n let result: SaveResult;\n try {\n result = saveState(\n {\n // Explicit null rather than undefined: JSON.stringify drops undefined\n // keys, making \"no specification\" indistinguishable from a truncated\n // state file on the next read.\n specRaw: payload.specRaw,\n specIsYaml: payload.specIsYaml,\n baseUrlOverride: state.baseUrlOverride ?? null,\n },\n config.stateFilePath,\n );\n } catch (error) {\n // saveState reports its own I/O failures through the return value, so\n // reaching here means the payload itself could not be serialised.\n addInternalLog(\n \"state-persist-failed\",\n false,\n undefined,\n undefined,\n toMessage(error),\n );\n return;\n }\n\n // saveState swallows I/O errors by design. Without inspecting `ok` a\n // read-only disk produced a silent no-op while the web UI still reported a\n // successful save, and the operator only found out after a restart.\n if (!result.ok) {\n addInternalLog(\n \"state-persist-failed\",\n false,\n undefined,\n undefined,\n `${result.path}: ${result.error?.message ?? \"unknown error\"}`,\n );\n return;\n }\n\n addInternalLog(\"state-persisted\", true, undefined, { path: result.path });\n }\n\n /**\n * Queues a state write.\n *\n * Coalesced because every write re-serialises the whole specification and\n * fsyncs it. A multi-megabyte document made each base-URL edit a synchronous,\n * event-loop-blocking flush of data that had not changed.\n */\n function queueState(specRaw: string | null, specIsYaml: boolean): void {\n if (!persistEnabled) return;\n persistPending = { specRaw, specIsYaml };\n if (persistTimer) return;\n persistTimer = setTimeout(() => {\n persistTimer = undefined;\n flushState();\n }, PERSIST_DEBOUNCE_MS);\n persistTimer.unref?.();\n }\n\n /** Persists a newly applied document. */\n function persistSpec(rawText: string, isYaml: boolean): void {\n queueState(rawText, isYaml);\n }\n\n /** Persists configuration changes without disturbing the stored document. */\n function persistConfig(): void {\n queueState(activeSpecRawText || null, activeSpecIsYaml);\n }\n\n /* ---------------------------------------------------------------------- */\n /* Specification lifecycle */\n /* ---------------------------------------------------------------------- */\n\n function applySpec(\n spec: ParsedSpec,\n rawText: string,\n isYaml: boolean,\n source: SpecSource,\n writeThrough = true,\n ): ApplyResult {\n // Generate before mutating state so a malformed document cannot leave the\n // server half-configured.\n const generated = getGeneratedTools(spec);\n const prompts = cachedPrompts(spec);\n const resources = cachedResources(spec);\n\n const previousServiceId = activeServiceId;\n\n state.spec = spec;\n state.specSource = source;\n activeSpecRawText = rawText;\n activeSpecIsYaml = isYaml;\n\n const title = spec.info?.title ?? \"Untitled API\";\n const version = spec.info?.version ?? \"0.0.0\";\n const serviceId = computeServiceId(title, version, rawText);\n const now = new Date().toISOString();\n const existing = registry.get(serviceId);\n\n registry.upsert({\n id: serviceId,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n // Reloading an identical document must not silently resurrect a service\n // the operator deliberately stopped.\n status: existing?.status ?? \"running\",\n title,\n version,\n source,\n toolCount: generated.tools.length,\n promptCount: prompts.length,\n resourceCount: resources.length,\n endpoint: { ...ENDPOINTS },\n });\n\n // Collect ids first: removing entries while iterating the registry's own\n // list skips elements whenever list() hands back the backing array.\n for (const id of registry.list().map((service) => service.id)) {\n if (id !== serviceId) registry.remove(id);\n }\n\n activeServiceId = serviceId;\n if (writeThrough) persistSpec(rawText, isYaml);\n\n // Existing sessions hold a server whose tool list came from the previous\n // document. MCP cannot retroactively rewrite a peer's tool cache mid-session,\n // so replacing the specification must drop them. The rejection is caught\n // here because an unhandled one terminates the process on Node 18.\n if (previousServiceId && previousServiceId !== serviceId) {\n void closeSessions(\"specification-replaced\").catch((error) => {\n addInternalLog(\n \"sessions-close-failed\",\n false,\n serviceId,\n undefined,\n toMessage(error),\n );\n });\n }\n\n addInternalLog(\"spec-applied\", true, serviceId, {\n source,\n toolCount: generated.tools.length,\n promptCount: prompts.length,\n resourceCount: resources.length,\n degradedToolCount: generated.bindings.filter((b) => !b.fullySupported)\n .length,\n });\n\n return {\n serviceId,\n toolCount: generated.tools.length,\n promptCount: prompts.length,\n resourceCount: resources.length,\n degradedTools: generated.bindings\n .filter((binding) => !binding.fullySupported)\n .map((binding) => binding.toolName),\n issues: generated.issues.map(formatIssue),\n };\n }\n\n /**\n * Drops the loaded document.\n *\n * Async so the caller can await session teardown: responding 200 while\n * sessions are still live leaves a window in which a connected client can\n * keep invoking tools against a service the operator believes is gone.\n */\n async function clearSpec(): Promise<void> {\n state.spec = null;\n state.specSource = \"runtime\";\n activeSpecRawText = \"\";\n activeSpecIsYaml = false;\n activeServiceId = null;\n registry.clear();\n\n if (persistEnabled) {\n // Remove the file outright rather than storing an empty specRaw, which\n // left a state file full of meaningless keys behind.\n persistPending = null;\n if (persistTimer) {\n clearTimeout(persistTimer);\n persistTimer = undefined;\n }\n const result = clearState(config.stateFilePath);\n if (!result.ok) {\n addInternalLog(\n \"state-clear-failed\",\n false,\n undefined,\n undefined,\n `${result.path}: ${result.error?.message ?? \"unknown error\"}`,\n );\n }\n }\n\n await closeSessions(\"specification-cleared\");\n addInternalLog(\"spec-cleared\", true);\n }\n\n async function bootstrap(): Promise<void> {\n if (config.specPath) {\n // A startup file is an operator-supplied invariant: failing loudly here is\n // correct, because silently starting with no tools looks like a bug.\n const raw = stripBom(await fs.promises.readFile(config.specPath, \"utf8\"));\n const parsed = await parseWithFallback(raw, shouldParseAsYaml(raw));\n applySpec(parsed.spec, raw, parsed.isYaml, \"startup-file\", false);\n return;\n }\n\n if (!persistEnabled) return;\n\n // loadState is synchronous and reports its own failures, so no try/catch or\n // Awaited<> gymnastics are needed around it.\n const saved: Record<string, unknown> = loadState(config.stateFilePath);\n\n if (typeof saved.baseUrlOverride === \"string\" && !state.baseUrlOverride) {\n state.baseUrlOverride = saved.baseUrlOverride;\n }\n\n if (typeof saved.specRaw === \"string\" && saved.specRaw.trim()) {\n const raw = stripBom(saved.specRaw);\n try {\n const parsed = await parseWithFallback(\n raw,\n typeof saved.specIsYaml === \"boolean\"\n ? saved.specIsYaml\n : shouldParseAsYaml(raw),\n );\n applySpec(parsed.spec, raw, parsed.isYaml, \"runtime\", false);\n } catch (error) {\n // A corrupt cache must never prevent the admin UI from starting, since\n // the UI is the only way for the operator to fix it.\n addInternalLog(\n \"spec-restore-failed\",\n false,\n undefined,\n undefined,\n `Persisted specification could not be restored: ${toMessage(error)}`,\n );\n }\n }\n }\n\n await bootstrap();\n\n /* ---------------------------------------------------------------------- */\n /* Status projection */\n /* ---------------------------------------------------------------------- */\n\n function buildStatus(): AdminStatus {\n const generated = state.spec\n ? getGeneratedTools(state.spec)\n : { tools: [], bindings: [], issues: [] };\n const prompts = state.spec ? cachedPrompts(state.spec) : [];\n const resources = state.spec ? cachedResources(state.spec) : [];\n\n return {\n specLoaded: Boolean(state.spec),\n specSource: state.specSource ?? null,\n serviceId: activeServiceId,\n active: isActive(),\n title: state.spec?.info?.title ?? null,\n version: state.spec?.info?.version ?? null,\n baseUrl: state.baseUrlOverride ?? state.spec?.servers?.[0]?.url ?? null,\n toolCount: generated.tools.length,\n degradedToolCount: generated.bindings.filter(\n (binding) => !binding.fullySupported,\n ).length,\n promptCount: prompts.length,\n resourceCount: resources.length,\n activeSessions: mcp.activeSessionCount(),\n pendingSessions: mcp.pendingSessionCount(), //Object literal may only specify known properties, and 'pendingSessions' does not exist in type 'AdminStatus'.ts(2353)\n // Surfaced so the web UI can warn that changes will not survive a\n // restart; previously this was silently invisible to the operator.\n persistEnabled,\n authRequired: Boolean(config.apiKey),\n services: registry.list(),\n issues: generated.issues.map(formatIssue),\n lastUpdatedAt: new Date().toISOString(),\n };\n }\n\n /* ---------------------------------------------------------------------- */\n /* Specification endpoints */\n /* ---------------------------------------------------------------------- */\n\n const upload = multer({\n storage: multer.memoryStorage(),\n limits: { fileSize: MAX_UPLOAD_BYTES, files: 1 },\n });\n\n app.post(\n \"/api/spec/upload\",\n auth,\n upload.single(\"file\"),\n async (request, response) => {\n try {\n if (!request.file) {\n response.status(400).json({ error: \"No file was uploaded.\" });\n return;\n }\n const rawText = stripBom(request.file.buffer.toString(\"utf8\"));\n if (!rawText.trim()) {\n response.status(400).json({ error: \"The uploaded file is empty.\" });\n return;\n }\n const parsed = await parseWithFallback(\n rawText,\n shouldParseAsYaml(rawText),\n );\n const result = applySpec(parsed.spec, rawText, parsed.isYaml, \"upload\");\n response.json({ ok: true, result, ...buildStatus() });\n } catch (error) {\n response.status(400).json({ error: toMessage(error) });\n }\n },\n );\n\n app.post(\"/api/spec/paste\", auth, async (request, response) => {\n try {\n const content = (request.body as { content?: unknown } | undefined)\n ?.content;\n if (typeof content !== \"string\" || !content.trim()) {\n response\n .status(400)\n .json({ error: \"content must be a non-empty string.\" });\n return;\n }\n\n const raw = stripBom(content);\n const isYamlHint = (request.body as { isYaml?: unknown }).isYaml;\n // An explicit hint wins outright. The sniffer used to veto it, which made\n // the \"Force YAML\" checkbox a no-op on brace-leading input; the fallback\n // parse already covers a wrong guess, so there is nothing to protect.\n const preferYaml =\n typeof isYamlHint === \"boolean\" ? isYamlHint : shouldParseAsYaml(raw);\n\n const parsed = await parseWithFallback(raw, preferYaml);\n const result = applySpec(parsed.spec, raw, parsed.isYaml, \"paste\");\n response.json({ ok: true, result, ...buildStatus() });\n } catch (error) {\n response.status(400).json({ error: toMessage(error) });\n }\n });\n\n app.post(\"/api/spec/clear\", auth, async (_request, response) => {\n await clearSpec();\n response.json({ ok: true, ...buildStatus() });\n });\n\n /** Returns the raw document so the web UI can show and re-edit it. */\n app.get(\"/api/spec/raw\", auth, (_request, response) => {\n response.json({\n content: activeSpecRawText,\n isYaml: activeSpecIsYaml,\n source: state.specSource ?? null,\n });\n });\n\n /* ---------------------------------------------------------------------- */\n /* Configuration endpoints */\n /* ---------------------------------------------------------------------- */\n\n app.post(\"/api/config/base-url\", auth, (request, response) => {\n const value = (request.body as { baseUrl?: unknown } | undefined)?.baseUrl;\n\n if (value === null || value === undefined || value === \"\") {\n state.baseUrlOverride = undefined;\n persistConfig();\n addInternalLog(\"base-url-cleared\", true);\n response.json({ ok: true, ...buildStatus() });\n return;\n }\n\n if (typeof value !== \"string\") {\n response.status(400).json({ error: \"baseUrl must be a string or null.\" });\n return;\n }\n\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(value);\n } catch {\n response.status(400).json({ error: \"baseUrl is not a valid URL.\" });\n return;\n }\n\n if (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\") {\n response\n .status(400)\n .json({ error: \"baseUrl must use the http or https scheme.\" });\n return;\n }\n\n state.baseUrlOverride = value;\n persistConfig();\n addInternalLog(\"base-url-updated\", true, undefined, { baseUrl: value });\n response.json({ ok: true, ...buildStatus() });\n });\n\n /* ---------------------------------------------------------------------- */\n /* Inspection endpoints */\n /* ---------------------------------------------------------------------- */\n\n app.get(\"/api/status\", auth, (_request, response) => {\n response.json(buildStatus());\n });\n\n app.get(\"/api/tools\", auth, (_request, response) => {\n if (!state.spec) {\n response.json({ tools: [], bindings: [], issues: [] });\n return;\n }\n // The generated result is cached and shared, and its bindings hold\n // references back into the parsed document. Only derived, acyclic copies may\n // be serialised — res.json() on a raw binding throws on the circular $ref\n // graph.\n const generated = getGeneratedTools(state.spec);\n response.json({\n tools: generated.tools,\n bindings: generated.bindings.map((binding) => ({\n toolName: binding.toolName,\n method: binding.method,\n isStandardMethod: binding.isStandardMethod,\n path: binding.path,\n bodyKey: binding.bodyKey,\n bodyMediaType: binding.bodyMediaType,\n bodyRequired: binding.bodyRequired,\n fullySupported: binding.fullySupported,\n degradationReasons: binding.degradationReasons,\n omittedParameters: binding.omittedParameters,\n // Projected because the web UI renders it; omitting it silently blanked\n // the multipart and serialisation notes.\n usageNotes: binding.usageNotes,\n arguments: binding.arguments.map((argument) => ({\n key: argument.key,\n name: argument.name,\n in: argument.in,\n required: argument.parameter.required === true,\n })),\n })),\n issues: generated.issues.map(formatIssue),\n });\n });\n\n app.get(\"/api/prompts\", auth, (_request, response) => {\n response.json({ prompts: state.spec ? cachedPrompts(state.spec) : [] });\n });\n\n app.get(\"/api/resources\", auth, (_request, response) => {\n response.json({\n resources: state.spec ? cachedResources(state.spec) : [],\n });\n });\n\n app.get(\"/api/servers\", auth, (_request, response) => {\n response.json({\n services: registry.list(),\n active: isActive(),\n endpoints: { ...ENDPOINTS },\n });\n });\n\n /* ---------------------------------------------------------------------- */\n /* Session endpoints */\n /* ---------------------------------------------------------------------- */\n\n app.get(\"/api/sessions\", auth, (_request, response) => {\n response.json({\n sessions: mcp.listSessions(),\n total: mcp.activeSessionCount(),\n pending: mcp.pendingSessionCount(),\n });\n });\n\n app.delete(\"/api/sessions/:id\", auth, async (request, response) => {\n const id = readParam(request.params.id);\n if (!id) {\n response.status(400).json({ error: \"A session id is required.\" });\n return;\n }\n const removed = await mcp.closeSession(id, \"closed-by-operator\");\n if (!removed) {\n response.status(404).json({ error: \"Session not found.\" });\n return;\n }\n response.json({ ok: true, sessions: mcp.listSessions() });\n });\n\n app.post(\"/api/servers/:id/start\", auth, (request, response) => {\n const id = readParam(request.params.id);\n if (!id) {\n response.status(400).json({ error: \"A service id is required.\" });\n return;\n }\n if (!registry.get(id)) {\n response.status(404).json({ error: \"Service not found.\" });\n return;\n }\n if (!state.spec) {\n response\n .status(409)\n .json({ error: \"No specification is loaded; nothing to start.\" });\n return;\n }\n\n registry.start(id);\n activeServiceId = id;\n addInternalLog(\"service-started\", true, id);\n response.json({ ok: true, ...buildStatus() });\n });\n\n app.post(\"/api/servers/:id/stop\", auth, async (request, response) => {\n const id = readParam(request.params.id);\n if (!id) {\n response.status(400).json({ error: \"A service id is required.\" });\n return;\n }\n if (!registry.get(id)) {\n response.status(404).json({ error: \"Service not found.\" });\n return;\n }\n\n registry.stop(id);\n // Stopping must terminate live sessions, otherwise a connected client keeps\n // issuing tool calls against a service the operator believes is down.\n await closeSessions(\"service-stopped\");\n addInternalLog(\"service-stopped\", true, id);\n response.json({ ok: true, ...buildStatus() });\n });\n\n /* ---------------------------------------------------------------------- */\n /* Logs */\n /* ---------------------------------------------------------------------- */\n\n app.get(\"/api/logs\", auth, (request, response) => {\n const rawLimit = Number(request.query.limit);\n const limit = Number.isFinite(rawLimit)\n ? Math.min(Math.max(Math.trunc(rawLimit), 1), maxLogEntries)\n : maxLogEntries;\n\n const direction = readParam(request.query.direction);\n const filtered = direction\n ? logEntries.filter((entry) => entry.direction === direction)\n : logEntries;\n\n response.json({\n logs: filtered.slice(0, limit),\n total: filtered.length,\n capacity: maxLogEntries,\n });\n });\n\n app.post(\"/api/logs/clear\", auth, (_request, response) => {\n logEntries.length = 0;\n response.json({ ok: true, logs: [] });\n });\n\n /* ---------------------------------------------------------------------- */\n /* Debugger */\n /* ---------------------------------------------------------------------- */\n\n app.post(\"/api/debug/call-tool\", auth, async (request, response) => {\n // The only genuine precondition: the binding index and the upstream base URL\n // both come from the document.\n //\n // Deliberately NOT gated on isActive(): this endpoint bypasses every MCP\n // transport and calls the executor directly, so a stopped service is\n // irrelevant here. Gating on it made the debugger unusable in exactly the\n // situation an operator needs it most — verifying upstream reachability while\n // the service refuses to come up.\n if (!state.spec) {\n response.status(409).json({ error: \"No specification is loaded.\" });\n return;\n }\n\n const body = (request.body ?? {}) as {\n toolName?: unknown;\n arguments?: unknown;\n };\n const toolName = body.toolName;\n const args = body.arguments;\n\n if (typeof toolName !== \"string\" || !toolName.trim()) {\n response\n .status(400)\n .json({ error: \"toolName must be a non-empty string.\" });\n return;\n }\n if (\n args !== undefined &&\n (typeof args !== \"object\" || args === null || Array.isArray(args))\n ) {\n response\n .status(400)\n .json({ error: \"arguments must be an object when provided.\" });\n return;\n }\n\n // ---------------------------------------------------------------------\n // Cancellation wiring.\n //\n // This MUST bind to the response, not the request. IncomingMessage is a\n // readable stream, so its \"close\" event fires as soon as the body has been\n // fully consumed — which for any POST is one tick after the JSON body parser\n // runs. Binding there aborted every single call a tick after axios dispatched\n // it, producing a phantom 499 and \"The tool call was cancelled by the client\"\n // for calls nobody had cancelled. The pre-flight `signal.aborted` guard inside\n // the executor did not catch it because the abort landed one tick later.\n //\n // ServerResponse \"close\" fires both on socket loss and on normal completion,\n // so writableEnded is what distinguishes a real disconnect from success.\n // ---------------------------------------------------------------------\n const controller = new AbortController();\n const raw = response as unknown as {\n writableEnded: boolean;\n destroyed: boolean;\n on(event: string, listener: () => void): void;\n off(event: string, listener: () => void): void;\n };\n\n const onClientGone = (): void => {\n if (!raw.writableEnded) {\n controller.abort(\n new DOMException(\"Client disconnected.\", \"AbortError\"),\n );\n }\n };\n raw.on(\"close\", onClientGone);\n\n try {\n const result = await executeToolCall(\n state.spec,\n toolName.trim(),\n (args as Record<string, unknown> | undefined) ?? {},\n {\n ...contextProvider(),\n signal: controller.signal,\n onLog(entry) {\n // Merge rather than replace the executor's meta: it carries the built\n // query string, retry count and serialisation decisions, which is\n // precisely what a debug call needs to show. A debug call travels over\n // no MCP transport, so the protocol hint is cleared to avoid\n // misattributing it in the log viewer.\n addLog({\n ...entry,\n protocol: undefined,\n meta: { ...entry.meta, debug: true },\n });\n },\n },\n );\n\n response.json({\n ok: true,\n // Surfaced as data rather than enforced as a gate, so the operator knows\n // the result came from a direct upstream call while the service was down.\n serviceRunning: isActive(),\n result,\n });\n } catch (error) {\n const aborted = isAbortError(error);\n\n // A genuinely departed client: there is no socket left to answer on, and a\n // status code only serves a listener that is still there. Log and let the\n // request die. No 499 — that nginx-private code was being emitted for\n // non-cancellations and sent us hunting for a phantom.\n if (aborted && raw.destroyed) {\n addLog({\n id: newId(),\n at: new Date().toISOString(),\n direction: \"response\",\n toolName: toolName.trim(),\n success: false,\n error: \"The client disconnected before the upstream call completed.\",\n meta: { debug: true, cancelled: true },\n });\n return;\n }\n\n // An AbortError while the socket is still alive came from somewhere else —\n // an internal timeout, or a signal merged in by the executor. Reporting that\n // as a cancellation would be a lie.\n if (aborted) {\n if (!response.headersSent) {\n response.status(504).json({\n error: \"The upstream call was aborted before it completed.\",\n });\n }\n return;\n }\n\n if (!response.headersSent) {\n response.status(400).json({ error: toMessage(error) });\n }\n } finally {\n // Without this every request leaves a closure attached to the response, and\n // Node starts emitting MaxListenersExceededWarning at eleven.\n raw.off(\"close\", onClientGone);\n }\n });\n\n /* ---------------------------------------------------------------------- */\n /* Static assets and fallbacks */\n /* ---------------------------------------------------------------------- */\n\n // Mounted after the API so that a file accidentally placed in the web UI\n // directory can never shadow an endpoint.\n app.use(\n express.static(STATIC_DIR, {\n index: false,\n dotfiles: \"ignore\",\n fallthrough: true,\n }),\n );\n\n // Single-page-app fallback. The negative lookahead must exclude every backend\n // prefix, including the legacy SSE endpoint, or those routes would receive\n // index.html instead of reaching their handlers.\n app.get(/^\\/(?!api\\/|mcp|sse).*/, (_request, response, next) => {\n response.sendFile(INDEX_HTML, (error) => {\n if (error) next(error);\n });\n });\n\n app.use((_request, response) => {\n response.status(404).json({ error: \"Not found.\" });\n });\n\n app.use(\n (\n error: unknown,\n _request: express.Request,\n response: express.Response,\n _next: express.NextFunction,\n ) => {\n const code = (error as { code?: string } | null)?.code;\n if (code === \"LIMIT_FILE_SIZE\") {\n response\n .status(413)\n .json({ error: \"The uploaded file exceeds the size limit.\" });\n return;\n }\n if (code === \"LIMIT_FILE_COUNT\" || code === \"LIMIT_UNEXPECTED_FILE\") {\n response\n .status(400)\n .json({ error: 'Exactly one file field named \"file\" is expected.' });\n return;\n }\n console.error(\"[admin] Unhandled error:\", error);\n if (response.headersSent) {\n response.end();\n return;\n }\n response.status(500).json({ error: \"Internal server error.\" });\n },\n );\n\n /* ---------------------------------------------------------------------- */\n /* Listener */\n /* ---------------------------------------------------------------------- */\n\n const server = createServer(app);\n\n // Long-lived SSE and streaming responses must not be cut by the default\n // header/keep-alive timeouts. headersTimeout must exceed keepAliveTimeout,\n // otherwise a reused connection can be killed mid-handshake.\n server.keepAliveTimeout = 76_000;\n server.headersTimeout = 80_000;\n server.requestTimeout = REQUEST_TIMEOUT_MS;\n\n await new Promise<void>((resolve, reject) => {\n const onError = (error: Error): void => {\n server.off(\"listening\", onListening);\n reject(error);\n };\n const onListening = (): void => {\n server.off(\"error\", onError);\n resolve();\n };\n server.once(\"listening\", onListening);\n server.once(\"error\", onError);\n server.listen(config.port, config.host ?? \"127.0.0.1\");\n });\n\n const address = server.address();\n const boundPort =\n address && typeof address === \"object\" ? address.port : config.port;\n\n const close = async (): Promise<void> => {\n if (closed) return;\n closed = true;\n\n // Flush before tearing anything down: a debounced write still sitting in the\n // timer would otherwise be lost on shutdown, which is exactly when the most\n // recent configuration change tends to be queued.\n flushState();\n\n // Dispose first: it stops the sweeper, clears keep-alive timers and ends\n // open streams, which is what allows the HTTP server to finish closing.\n await mcp.dispose();\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n server.closeIdleConnections?.();\n });\n };\n\n return { app, server, port: boundPort, close };\n}\n"]}