dynamic-openapi-mcp 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts","../src/utils/fetch.ts","../src/auth/strategies.ts","../src/auth/resolver.ts","../src/parser/loader.ts","../src/parser/resolver.ts","../src/http/response-handler.ts","../src/http/client.ts","../src/mapper/tools.ts","../src/mapper/schema-converter.ts","../src/utils/naming.ts","../src/mapper/resources.ts","../src/mapper/prompts.ts","../src/cli.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport type { OpenAPIV3 } from 'openapi-types'\nimport type { AuthConfig } from './auth/types.js'\nimport { resolveAuth } from './auth/resolver.js'\nimport { loadSpec } from './parser/loader.js'\nimport { resolveSpec } from './parser/resolver.js'\nimport type { ParsedSpec } from './parser/types.js'\nimport { resolveBaseUrl, type HttpClientConfig } from './http/client.js'\nimport type { FetchWithRetryOptions } from './utils/fetch.js'\nimport { registerTools } from './mapper/tools.js'\nimport { registerResources } from './mapper/resources.js'\nimport { registerPrompts } from './mapper/prompts.js'\n\nexport interface OpenApiMcpOptions {\n source: string | OpenAPIV3.Document\n name?: string\n version?: string\n baseUrl?: string\n serverIndex?: number\n auth?: AuthConfig\n headers?: Record<string, string>\n fetchOptions?: FetchWithRetryOptions\n}\n\nexport interface OpenApiMcp {\n server: McpServer\n spec: ParsedSpec\n serve(): Promise<void>\n}\n\nexport async function createOpenApiMcp(options: OpenApiMcpOptions): Promise<OpenApiMcp> {\n const doc = await loadSpec(options.source)\n const spec = await resolveSpec(doc)\n\n const serverName = options.name ?? spec.title ?? 'dynamic-openapi-mcp'\n const serverVersion = options.version ?? spec.version ?? '1.0.0'\n\n const server = new McpServer({\n name: serverName,\n version: serverVersion,\n })\n\n const auth = resolveAuth(options.auth, spec.securitySchemes)\n const baseUrl = resolveBaseUrl(spec, options.baseUrl, options.serverIndex)\n\n const httpConfig: HttpClientConfig = {\n baseUrl,\n auth,\n defaultHeaders: options.headers,\n fetchOptions: options.fetchOptions,\n }\n\n registerTools(server, spec, httpConfig)\n registerResources(server, spec)\n registerPrompts(server, spec, httpConfig)\n\n return {\n server,\n spec,\n async serve() {\n const transport = new StdioServerTransport()\n await server.connect(transport)\n },\n }\n}\n","export interface FetchWithRetryOptions {\n timeout?: number\n retries?: number\n retryDelay?: number\n retryOn?: number[]\n}\n\nconst DEFAULT_OPTIONS: Required<FetchWithRetryOptions> = {\n timeout: 30_000,\n retries: 3,\n retryDelay: 1_000,\n retryOn: [429, 500, 502, 503, 504],\n}\n\nexport async function fetchWithRetry(\n url: string,\n init?: RequestInit,\n opts?: FetchWithRetryOptions\n): Promise<Response> {\n const { timeout, retries, retryDelay, retryOn } = { ...DEFAULT_OPTIONS, ...opts }\n\n let lastError: Error | undefined\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeout)\n\n const response = await fetch(url, {\n ...init,\n signal: controller.signal,\n })\n\n clearTimeout(timer)\n\n if (retryOn.includes(response.status) && attempt < retries) {\n const retryAfter = response.headers.get('Retry-After')\n const delay = retryAfter\n ? parseRetryAfter(retryAfter)\n : retryDelay * Math.pow(2, attempt)\n\n await sleep(delay)\n continue\n }\n\n return response\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error))\n\n if (lastError.name === 'AbortError') {\n lastError = new Error(`Request timed out after ${timeout}ms: ${url}`)\n }\n\n if (attempt < retries) {\n await sleep(retryDelay * Math.pow(2, attempt))\n continue\n }\n }\n }\n\n throw lastError ?? new Error(`Request failed after ${retries + 1} attempts: ${url}`)\n}\n\nfunction parseRetryAfter(value: string): number {\n const seconds = Number(value)\n if (!Number.isNaN(seconds)) {\n return Math.min(seconds * 1000, 60_000)\n }\n\n const date = Date.parse(value)\n if (!Number.isNaN(date)) {\n return Math.min(Math.max(date - Date.now(), 0), 60_000)\n }\n\n return 1_000\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import type { OpenAPIV3 } from 'openapi-types'\nimport type { ResolvedAuth } from './types.js'\nimport { fetchWithRetry } from '../utils/fetch.js'\n\nexport class BearerAuth implements ResolvedAuth {\n constructor(private token: string) {}\n\n async apply(_url: URL, init: RequestInit): Promise<RequestInit> {\n const headers = new Headers(init.headers)\n headers.set('Authorization', `Bearer ${this.token}`)\n return { ...init, headers }\n }\n}\n\nexport class ApiKeyAuth implements ResolvedAuth {\n constructor(\n private key: string,\n private paramName: string,\n private location: 'header' | 'query' | 'cookie'\n ) {}\n\n async apply(url: URL, init: RequestInit): Promise<RequestInit> {\n switch (this.location) {\n case 'header': {\n const headers = new Headers(init.headers)\n headers.set(this.paramName, this.key)\n return { ...init, headers }\n }\n case 'query': {\n url.searchParams.set(this.paramName, this.key)\n return init\n }\n case 'cookie': {\n const headers = new Headers(init.headers)\n const existing = headers.get('Cookie') ?? ''\n const encodedKey = encodeURIComponent(this.paramName)\n const encodedValue = encodeURIComponent(this.key)\n const cookie = existing\n ? `${existing}; ${encodedKey}=${encodedValue}`\n : `${encodedKey}=${encodedValue}`\n headers.set('Cookie', cookie)\n return { ...init, headers }\n }\n }\n }\n}\n\nexport class BasicAuth implements ResolvedAuth {\n constructor(\n private username: string,\n private password: string\n ) {}\n\n async apply(_url: URL, init: RequestInit): Promise<RequestInit> {\n const credentials = `${this.username}:${this.password}`\n const encoded = Buffer.from(credentials, 'utf-8').toString('base64')\n const headers = new Headers(init.headers)\n headers.set('Authorization', `Basic ${encoded}`)\n return { ...init, headers }\n }\n}\n\nexport class OAuth2ClientCredentials implements ResolvedAuth {\n private tokenCache: { token: string; expiresAt: number } | null = null\n private pendingRefresh: Promise<string> | null = null\n\n constructor(\n private clientId: string,\n private clientSecret: string,\n private tokenUrl: string,\n private scopes: string[] = []\n ) {}\n\n async apply(_url: URL, init: RequestInit): Promise<RequestInit> {\n const token = await this.getToken()\n const headers = new Headers(init.headers)\n headers.set('Authorization', `Bearer ${token}`)\n return { ...init, headers }\n }\n\n private async getToken(): Promise<string> {\n if (this.tokenCache && Date.now() < this.tokenCache.expiresAt) {\n return this.tokenCache.token\n }\n\n if (this.pendingRefresh) {\n return this.pendingRefresh\n }\n\n this.pendingRefresh = this.fetchToken()\n\n try {\n return await this.pendingRefresh\n } finally {\n this.pendingRefresh = null\n }\n }\n\n private async fetchToken(): Promise<string> {\n const body = new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: this.clientId,\n client_secret: this.clientSecret,\n })\n\n if (this.scopes.length > 0) {\n body.set('scope', this.scopes.join(' '))\n }\n\n const res = await fetchWithRetry(this.tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body,\n }, { retries: 2, timeout: 15_000 })\n\n if (!res.ok) {\n const errorBody = await res.text().catch(() => '')\n throw new Error(\n `OAuth2 token request failed: ${res.status} ${res.statusText}${errorBody ? ` - ${errorBody}` : ''}`\n )\n }\n\n let data: Record<string, unknown>\n try {\n data = await res.json() as Record<string, unknown>\n } catch {\n throw new Error('OAuth2 token response is not valid JSON')\n }\n\n if (typeof data.access_token !== 'string' || !data.access_token) {\n throw new Error('OAuth2 token response missing \"access_token\" field')\n }\n\n const expiresIn = typeof data.expires_in === 'number' ? data.expires_in : 3600\n const bufferSeconds = Math.min(60, expiresIn * 0.1)\n\n this.tokenCache = {\n token: data.access_token,\n expiresAt: Date.now() + (expiresIn - bufferSeconds) * 1000,\n }\n\n return data.access_token\n }\n}\n\nexport class CustomAuth implements ResolvedAuth {\n constructor(private handler: (url: string, init: RequestInit) => RequestInit | Promise<RequestInit>) {}\n\n async apply(url: URL, init: RequestInit): Promise<RequestInit> {\n return this.handler(url.toString(), init)\n }\n}\n\nexport class CompositeAuth implements ResolvedAuth {\n constructor(private strategies: ResolvedAuth[]) {}\n\n async apply(url: URL, init: RequestInit): Promise<RequestInit> {\n let result = init\n for (const strategy of this.strategies) {\n result = await strategy.apply(url, result)\n }\n return result\n }\n}\n\nexport function createAuthFromScheme(\n scheme: OpenAPIV3.SecuritySchemeObject,\n credential: string\n): ResolvedAuth | null {\n switch (scheme.type) {\n case 'http': {\n if (scheme.scheme === 'bearer') {\n return new BearerAuth(credential)\n }\n if (scheme.scheme === 'basic') {\n const colonIndex = credential.indexOf(':')\n if (colonIndex === -1) {\n return new BasicAuth(credential, '')\n }\n return new BasicAuth(credential.slice(0, colonIndex), credential.slice(colonIndex + 1))\n }\n return null\n }\n case 'apiKey': {\n const location = scheme.in as 'header' | 'query' | 'cookie'\n if (!['header', 'query', 'cookie'].includes(location)) {\n return new ApiKeyAuth(credential, scheme.name, 'header')\n }\n return new ApiKeyAuth(credential, scheme.name, location)\n }\n default:\n return null\n }\n}\n","import type { OpenAPIV3 } from 'openapi-types'\nimport type { AuthConfig, ResolvedAuth } from './types.js'\nimport {\n BearerAuth,\n ApiKeyAuth,\n BasicAuth,\n OAuth2ClientCredentials,\n CustomAuth,\n CompositeAuth,\n createAuthFromScheme,\n} from './strategies.js'\n\nexport function resolveAuth(\n config: AuthConfig | undefined,\n securitySchemes: Record<string, OpenAPIV3.SecuritySchemeObject>\n): ResolvedAuth | null {\n const strategies: ResolvedAuth[] = []\n\n if (config?.custom) {\n return new CustomAuth(config.custom)\n }\n\n if (config?.bearerToken) {\n strategies.push(new BearerAuth(config.bearerToken))\n }\n\n if (config?.apiKey) {\n const apiKeyScheme = Object.values(securitySchemes).find(\n (s) => s.type === 'apiKey'\n ) as OpenAPIV3.ApiKeySecurityScheme | undefined\n\n if (apiKeyScheme) {\n strategies.push(new ApiKeyAuth(config.apiKey, apiKeyScheme.name, apiKeyScheme.in as 'header' | 'query' | 'cookie'))\n } else {\n strategies.push(new ApiKeyAuth(config.apiKey, 'X-API-Key', 'header'))\n }\n }\n\n if (config?.basicAuth) {\n strategies.push(new BasicAuth(config.basicAuth.username, config.basicAuth.password))\n }\n\n if (config?.oauth2) {\n strategies.push(\n new OAuth2ClientCredentials(\n config.oauth2.clientId,\n config.oauth2.clientSecret,\n config.oauth2.tokenUrl,\n config.oauth2.scopes\n )\n )\n }\n\n if (strategies.length > 0) {\n return strategies.length === 1 ? strategies[0] : new CompositeAuth(strategies)\n }\n\n return resolveAuthFromEnv(securitySchemes)\n}\n\nfunction resolveAuthFromEnv(\n securitySchemes: Record<string, OpenAPIV3.SecuritySchemeObject>\n): ResolvedAuth | null {\n for (const [name, scheme] of Object.entries(securitySchemes)) {\n const envName = name.toUpperCase().replace(/[^A-Z0-9]/g, '_')\n const envToken = process.env[`OPENAPI_AUTH_${envName}_TOKEN`]\n ?? process.env[`OPENAPI_AUTH_${envName}_KEY`]\n\n if (envToken) {\n const auth = createAuthFromScheme(scheme, envToken)\n if (auth) return auth\n }\n }\n\n const globalToken = process.env['OPENAPI_AUTH_TOKEN']\n if (globalToken) {\n return new BearerAuth(globalToken)\n }\n\n const globalApiKey = process.env['OPENAPI_API_KEY']\n if (globalApiKey) {\n const apiKeyScheme = Object.values(securitySchemes).find(\n (s) => s.type === 'apiKey'\n ) as OpenAPIV3.ApiKeySecurityScheme | undefined\n\n if (apiKeyScheme) {\n return new ApiKeyAuth(globalApiKey, apiKeyScheme.name, apiKeyScheme.in as 'header' | 'query' | 'cookie')\n }\n return new ApiKeyAuth(globalApiKey, 'X-API-Key', 'header')\n }\n\n return null\n}\n","import { readFile } from 'node:fs/promises'\nimport { parse as parseYaml } from 'yaml'\nimport type { OpenAPIV3 } from 'openapi-types'\nimport { fetchWithRetry } from '../utils/fetch.js'\n\nexport function resolveSource(source: string | OpenAPIV3.Document) {\n if (typeof source !== 'string') {\n return { type: 'inline' as const, value: source }\n }\n\n if (source.startsWith('http://') || source.startsWith('https://')) {\n return { type: 'url' as const, value: source }\n }\n\n if (source.trim().startsWith('{') || source.trim().startsWith('openapi')) {\n return { type: 'inline' as const, value: source }\n }\n\n return { type: 'file' as const, value: source }\n}\n\nexport async function loadSpec(source: string | OpenAPIV3.Document): Promise<OpenAPIV3.Document> {\n const resolved = resolveSource(source)\n\n switch (resolved.type) {\n case 'url': {\n const res = await fetchWithRetry(resolved.value)\n if (!res.ok) {\n throw new Error(`Failed to fetch spec from ${resolved.value}: ${res.status} ${res.statusText}`)\n }\n const text = await res.text()\n return parseSpecText(text, resolved.value)\n }\n\n case 'file': {\n let text: string\n try {\n text = await readFile(resolved.value, 'utf-8')\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n throw new Error(`Failed to read spec file \"${resolved.value}\": ${msg}`)\n }\n return parseSpecText(text, resolved.value)\n }\n\n case 'inline': {\n if (typeof resolved.value === 'string') {\n return parseSpecText(resolved.value, '(inline)')\n }\n return resolved.value\n }\n }\n}\n\nfunction parseSpecText(text: string, source: string): OpenAPIV3.Document {\n const trimmed = text.trim()\n\n if (trimmed.startsWith('{')) {\n try {\n return JSON.parse(trimmed)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n throw new Error(`Failed to parse JSON spec from ${source}: ${msg}`)\n }\n }\n\n try {\n return parseYaml(trimmed) as OpenAPIV3.Document\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n throw new Error(`Failed to parse YAML spec from ${source}: ${msg}`)\n }\n}\n","import { validate, dereference } from '@readme/openapi-parser'\nimport type { OpenAPIV3 } from 'openapi-types'\nimport type { ExternalDocs, ParsedExample, ParsedLink, ParsedOperation, ParsedParameter, ParsedRequestBody, ParsedResponse, ParsedServer, ParsedSpec, ParsedTag } from './types.js'\n\nexport async function resolveSpec(doc: OpenAPIV3.Document): Promise<ParsedSpec> {\n const validation = await validate(structuredClone(doc))\n if (!validation.valid) {\n const validationResult = validation as { valid: false; errors?: unknown[]; warnings?: unknown[] }\n const errors = validationResult.errors ?? []\n throw new Error(`Invalid OpenAPI spec: ${JSON.stringify(errors)}`)\n }\n const dereferenced = (await dereference(structuredClone(doc))) as OpenAPIV3.Document\n\n const operations = extractOperations(dereferenced)\n const schemas = extractSchemas(dereferenced)\n const securitySchemes = extractSecuritySchemes(dereferenced)\n const servers = extractServers(dereferenced)\n const tags = extractTags(dereferenced)\n const externalDocs = extractExternalDocs(dereferenced.externalDocs as OpenAPIV3.ExternalDocumentationObject | undefined)\n\n return {\n title: dereferenced.info.title,\n version: dereferenced.info.version,\n description: dereferenced.info.description,\n servers,\n operations,\n schemas,\n securitySchemes,\n tags,\n externalDocs,\n raw: dereferenced,\n }\n}\n\nconst HTTP_METHODS = ['get', 'post', 'put', 'delete', 'patch', 'head', 'options', 'trace'] as const\n\nfunction extractOperations(doc: OpenAPIV3.Document): ParsedOperation[] {\n const operations: ParsedOperation[] = []\n const paths = doc.paths ?? {}\n\n for (const [path, pathItem] of Object.entries(paths)) {\n if (!pathItem) continue\n\n const pathParams = (pathItem.parameters ?? []) as OpenAPIV3.ParameterObject[]\n\n for (const method of HTTP_METHODS) {\n const operation = pathItem[method]\n if (!operation) continue\n\n const operationParams = (operation.parameters ?? []) as OpenAPIV3.ParameterObject[]\n const allParams = mergeParameters(pathParams, operationParams)\n\n const operationId =\n operation.operationId ?? generateOperationId(method, path)\n\n const parameters: ParsedParameter[] = allParams.map((p) => ({\n name: p.name,\n in: p.in as ParsedParameter['in'],\n required: p.required ?? p.in === 'path',\n description: p.description,\n schema: (p.schema as OpenAPIV3.SchemaObject) ?? { type: 'string' },\n example: p.example,\n examples: p.examples ? extractExamples(p.examples as Record<string, OpenAPIV3.ExampleObject>) : undefined,\n deprecated: p.deprecated,\n }))\n\n let requestBody: ParsedRequestBody | undefined\n if (operation.requestBody) {\n const rb = operation.requestBody as OpenAPIV3.RequestBodyObject\n const content: ParsedRequestBody['content'] = {}\n for (const [mediaType, mediaObj] of Object.entries(rb.content ?? {})) {\n if (mediaObj.schema) {\n content[mediaType] = {\n schema: mediaObj.schema as OpenAPIV3.SchemaObject,\n example: mediaObj.example,\n examples: mediaObj.examples ? extractExamples(mediaObj.examples as Record<string, OpenAPIV3.ExampleObject>) : undefined,\n }\n }\n }\n requestBody = {\n required: rb.required ?? false,\n description: rb.description,\n content,\n }\n }\n\n const responses: Record<string, ParsedResponse> = {}\n for (const [code, resp] of Object.entries(operation.responses ?? {})) {\n responses[code] = extractResponse(resp as OpenAPIV3.ResponseObject)\n }\n\n operations.push({\n operationId,\n method: method.toUpperCase(),\n path,\n summary: operation.summary,\n description: operation.description,\n deprecated: operation.deprecated,\n parameters,\n requestBody,\n responses,\n security: operation.security ?? doc.security ?? [],\n tags: operation.tags ?? [],\n externalDocs: extractExternalDocs(operation.externalDocs),\n })\n }\n }\n\n return operations\n}\n\nfunction extractResponse(resp: OpenAPIV3.ResponseObject): ParsedResponse {\n const parsed: ParsedResponse = {\n description: resp.description ?? '',\n content: {},\n }\n\n if (resp.content) {\n for (const [mediaType, mediaObj] of Object.entries(resp.content)) {\n parsed.content![mediaType] = {\n schema: mediaObj.schema as OpenAPIV3.SchemaObject | undefined,\n }\n\n // Pick the primary schema (prefer JSON)\n if (!parsed.schema && mediaObj.schema) {\n parsed.schema = mediaObj.schema as OpenAPIV3.SchemaObject\n parsed.mediaType = mediaType\n }\n\n // Pick example from first media type that has one\n if (parsed.example === undefined && mediaObj.example !== undefined) {\n parsed.example = mediaObj.example\n }\n if (!parsed.examples && mediaObj.examples) {\n parsed.examples = extractExamples(mediaObj.examples as Record<string, OpenAPIV3.ExampleObject>)\n }\n }\n }\n\n if (resp.links) {\n parsed.links = extractLinks(resp.links as Record<string, OpenAPIV3.LinkObject>)\n }\n\n return parsed\n}\n\nfunction extractExamples(examples: Record<string, OpenAPIV3.ExampleObject>): Record<string, ParsedExample> {\n const result: Record<string, ParsedExample> = {}\n for (const [name, ex] of Object.entries(examples)) {\n result[name] = {\n summary: ex.summary,\n description: ex.description,\n value: ex.value,\n }\n }\n return result\n}\n\nfunction extractLinks(links: Record<string, OpenAPIV3.LinkObject>): Record<string, ParsedLink> {\n const result: Record<string, ParsedLink> = {}\n for (const [name, link] of Object.entries(links)) {\n result[name] = {\n operationId: link.operationId,\n operationRef: link.operationRef,\n parameters: link.parameters as Record<string, string> | undefined,\n description: link.description,\n }\n }\n return result\n}\n\nfunction generateOperationId(method: string, path: string): string {\n const cleaned = path\n .replace(/\\{([^}]+)\\}/g, 'by_$1')\n .replace(/[^a-zA-Z0-9]/g, '_')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '')\n\n return `${method}_${cleaned}`.toLowerCase()\n}\n\nfunction mergeParameters(\n pathParams: OpenAPIV3.ParameterObject[],\n operationParams: OpenAPIV3.ParameterObject[]\n): OpenAPIV3.ParameterObject[] {\n const merged = new Map<string, OpenAPIV3.ParameterObject>()\n\n for (const p of pathParams) {\n merged.set(`${p.in}:${p.name}`, p)\n }\n\n for (const p of operationParams) {\n merged.set(`${p.in}:${p.name}`, p)\n }\n\n return Array.from(merged.values())\n}\n\nfunction extractSchemas(doc: OpenAPIV3.Document): Record<string, OpenAPIV3.SchemaObject> {\n const schemas: Record<string, OpenAPIV3.SchemaObject> = {}\n const components = doc.components?.schemas ?? {}\n\n for (const [name, schema] of Object.entries(components)) {\n schemas[name] = schema as OpenAPIV3.SchemaObject\n }\n\n return schemas\n}\n\nfunction extractSecuritySchemes(doc: OpenAPIV3.Document): Record<string, OpenAPIV3.SecuritySchemeObject> {\n const schemes: Record<string, OpenAPIV3.SecuritySchemeObject> = {}\n const components = doc.components?.securitySchemes ?? {}\n\n for (const [name, scheme] of Object.entries(components)) {\n schemes[name] = scheme as OpenAPIV3.SecuritySchemeObject\n }\n\n return schemes\n}\n\nfunction extractServers(doc: OpenAPIV3.Document): ParsedServer[] {\n return (doc.servers ?? []).map((s) => {\n const server: ParsedServer = { url: s.url }\n if (s.description) server.description = s.description\n if (s.variables) {\n server.variables = {}\n for (const [name, v] of Object.entries(s.variables)) {\n server.variables[name] = {\n default: v.default,\n enum: v.enum,\n description: v.description,\n }\n }\n }\n return server\n })\n}\n\nfunction extractTags(doc: OpenAPIV3.Document): ParsedTag[] {\n return (doc.tags ?? []).map((t) => {\n const tag: ParsedTag = { name: t.name }\n if (t.description) tag.description = t.description\n if (t.externalDocs) {\n tag.externalDocs = {\n url: t.externalDocs.url,\n description: t.externalDocs.description,\n }\n }\n return tag\n })\n}\n\nfunction extractExternalDocs(docs: OpenAPIV3.ExternalDocumentationObject | undefined): ExternalDocs | undefined {\n if (!docs) return undefined\n return {\n url: docs.url,\n description: docs.description,\n }\n}\n","type TextContent = { type: 'text'; text: string }\ntype ImageContent = { type: 'image'; data: string; mimeType: string }\ntype ContentBlock = TextContent | ImageContent\n\nexport async function handleResponse(response: Response): Promise<ContentBlock[]> {\n const contentType = response.headers.get('content-type') ?? ''\n const status = response.status\n\n if (status === 204) {\n return [{ type: 'text', text: 'No Content (204)' }]\n }\n\n if (contentType.includes('image/')) {\n const buffer = await response.arrayBuffer()\n const base64 = Buffer.from(buffer).toString('base64')\n return [\n {\n type: 'image',\n data: base64,\n mimeType: contentType.split(';')[0].trim(),\n },\n ]\n }\n\n const text = await response.text()\n\n if (contentType.includes('json')) {\n try {\n const parsed = JSON.parse(text)\n return [{ type: 'text', text: JSON.stringify(parsed, null, 2) }]\n } catch {\n // fallthrough to raw text\n }\n }\n\n return [{ type: 'text', text: text || `(empty response, status ${status})` }]\n}\n","import type { ResolvedAuth } from '../auth/types.js'\nimport type { ParsedOperation, ParsedServer, ParsedSpec } from '../parser/types.js'\nimport { fetchWithRetry, type FetchWithRetryOptions } from '../utils/fetch.js'\nimport { handleResponse } from './response-handler.js'\n\ntype TextContent = { type: 'text'; text: string }\ntype ImageContent = { type: 'image'; data: string; mimeType: string }\ntype ContentBlock = TextContent | ImageContent\n\nexport interface HttpClientConfig {\n baseUrl: string\n auth: ResolvedAuth | null\n defaultHeaders?: Record<string, string>\n fetchOptions?: FetchWithRetryOptions\n}\n\nexport function resolveServerUrl(server: ParsedServer, variableOverrides?: Record<string, string>): string {\n let url = server.url\n\n if (server.variables) {\n for (const [name, variable] of Object.entries(server.variables)) {\n const value = variableOverrides?.[name] ?? variable.default\n if (variable.enum && !variable.enum.includes(value)) {\n throw new Error(`Invalid value \"${value}\" for server variable \"${name}\". Allowed: ${variable.enum.join(', ')}`)\n }\n url = url.replaceAll(`{${name}}`, value)\n }\n }\n\n return normalizeUrl(url)\n}\n\nfunction normalizeUrl(url: string): string {\n if (!url.startsWith('http://') && !url.startsWith('https://')) {\n url = `https://${url}`\n }\n return url.replace(/\\/$/, '')\n}\n\nexport function resolveBaseUrl(spec: ParsedSpec, overrideBaseUrl?: string, serverIndex?: number): string {\n if (overrideBaseUrl) return overrideBaseUrl.replace(/\\/$/, '')\n\n const index = serverIndex ?? 0\n const server = spec.servers[index]\n if (server) {\n return resolveServerUrl(server)\n }\n\n throw new Error('No server URL found in spec and no baseUrl provided')\n}\n\nexport async function executeOperation(\n operation: ParsedOperation,\n args: Record<string, unknown>,\n config: HttpClientConfig\n): Promise<ContentBlock[]> {\n const validationErrors = validateRequiredParams(operation, args)\n if (validationErrors.length > 0) {\n return [{ type: 'text' as const, text: `Validation errors:\\n${validationErrors.join('\\n')}` }]\n }\n\n let path = operation.path\n\n for (const param of operation.parameters) {\n if (param.in === 'path' && args[param.name] !== undefined) {\n const value = encodeURIComponent(String(args[param.name]))\n path = path.replaceAll(`{${param.name}}`, value)\n }\n }\n\n const url = new URL(`${config.baseUrl}${path}`)\n\n for (const param of operation.parameters) {\n if (param.in === 'query' && args[param.name] !== undefined) {\n const val = args[param.name]\n if (Array.isArray(val)) {\n for (const item of val) {\n url.searchParams.append(param.name, String(item))\n }\n } else {\n url.searchParams.set(param.name, String(val))\n }\n }\n }\n\n const headers = new Headers(config.defaultHeaders)\n\n const produces = getResponseMediaTypes(operation)\n headers.set('Accept', produces.length > 0 ? produces.join(', ') : 'application/json')\n\n for (const param of operation.parameters) {\n if (param.in === 'header' && args[param.name] !== undefined) {\n headers.set(param.name, String(args[param.name]))\n }\n }\n\n let body: string | undefined\n if (args['body'] !== undefined && operation.requestBody) {\n const contentType = getRequestContentType(operation)\n headers.set('Content-Type', contentType)\n\n try {\n body = JSON.stringify(args['body'])\n } catch {\n return [{ type: 'text' as const, text: 'Error: request body could not be serialized to JSON' }]\n }\n }\n\n let init: RequestInit = {\n method: operation.method,\n headers,\n body,\n }\n\n if (config.auth) {\n try {\n init = await config.auth.apply(url, init)\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error)\n return [{ type: 'text' as const, text: `Authentication failed: ${msg}` }]\n }\n }\n\n try {\n const response = await fetchWithRetry(url.toString(), init, config.fetchOptions)\n const statusPrefix = `HTTP ${response.status} ${response.statusText}\\n\\n`\n const content = await handleResponse(response)\n\n if (content.length > 0 && content[0].type === 'text') {\n content[0] = { type: 'text', text: statusPrefix + content[0].text }\n }\n\n return content\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error)\n return [{ type: 'text' as const, text: `Request failed: ${msg}` }]\n }\n}\n\nfunction validateRequiredParams(\n operation: ParsedOperation,\n args: Record<string, unknown>\n): string[] {\n const errors: string[] = []\n\n for (const param of operation.parameters) {\n if (param.required && args[param.name] === undefined) {\n errors.push(`- Missing required ${param.in} parameter: \"${param.name}\"`)\n }\n }\n\n if (operation.requestBody?.required && args['body'] === undefined) {\n errors.push('- Missing required request body')\n }\n\n return errors\n}\n\nfunction getResponseMediaTypes(operation: ParsedOperation): string[] {\n const types = new Set<string>()\n\n for (const resp of Object.values(operation.responses)) {\n if (resp.content) {\n for (const mediaType of Object.keys(resp.content)) {\n types.add(mediaType)\n }\n }\n }\n\n return Array.from(types)\n}\n\nfunction getRequestContentType(operation: ParsedOperation): string {\n if (!operation.requestBody?.content) return 'application/json'\n\n const mediaTypes = Object.keys(operation.requestBody.content)\n if (mediaTypes.includes('application/json')) return 'application/json'\n\n return mediaTypes[0] ?? 'application/json'\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { z } from 'zod'\nimport type { ParsedSpec } from '../parser/types.js'\nimport type { HttpClientConfig } from '../http/client.js'\nimport { executeOperation, resolveServerUrl } from '../http/client.js'\nimport { buildToolInputSchema } from './schema-converter.js'\nimport { sanitizeToolName, truncateDescription } from '../utils/naming.js'\n\nexport function registerTools(server: McpServer, spec: ParsedSpec, httpConfig: HttpClientConfig): void {\n for (const operation of spec.operations) {\n const toolName = sanitizeToolName(operation.operationId)\n const rawDescription = (operation.summary ?? operation.description ?? '').trim().replace(/\\s+/g, ' ')\n const prefix = operation.deprecated ? '[DEPRECATED] ' : ''\n const description = truncateDescription(`${prefix}${rawDescription}`) || `${operation.method} ${operation.path}`\n const shape = buildToolInputSchema(operation)\n\n server.tool(\n toolName,\n description,\n shape,\n async (args: Record<string, unknown>) => {\n const content = await executeOperation(operation, args, httpConfig)\n return { content }\n }\n )\n }\n\n if (spec.servers.length > 0) {\n registerSetEnvironmentTool(server, spec, httpConfig)\n }\n}\n\nfunction registerSetEnvironmentTool(server: McpServer, spec: ParsedSpec, httpConfig: HttpClientConfig): void {\n const shape = {\n server_index: z.number().int().min(0).optional().describe('Index of the server to use (0-based)'),\n server_url: z.string().optional().describe('Direct URL override (takes precedence over server_index)'),\n variables: z.record(z.string()).optional().describe('Server variable overrides (e.g. {\"environment\": \"staging\"})'),\n }\n\n server.tool(\n 'set_environment',\n 'Switch the active API server/environment. Lists available servers when called without arguments.',\n shape,\n async (args: { server_index?: number; server_url?: string; variables?: Record<string, string> }) => {\n const lines: string[] = []\n\n if (args.server_url) {\n httpConfig.baseUrl = args.server_url.replace(/\\/$/, '')\n lines.push(`Active server set to: ${httpConfig.baseUrl}`)\n } else if (args.server_index !== undefined) {\n const server = spec.servers[args.server_index]\n if (!server) {\n return {\n content: [{ type: 'text' as const, text: `Invalid server_index ${args.server_index}. Available: 0-${spec.servers.length - 1}` }],\n }\n }\n httpConfig.baseUrl = resolveServerUrl(server, args.variables)\n lines.push(`Active server set to: ${httpConfig.baseUrl}`)\n if (server.description) lines.push(` (${server.description})`)\n } else if (args.variables) {\n // Find current active server to re-resolve with new variables\n const current = spec.servers.find((s) => {\n try { return resolveServerUrl(s) === httpConfig.baseUrl } catch { return false }\n })\n if (current) {\n httpConfig.baseUrl = resolveServerUrl(current, args.variables)\n lines.push(`Active server re-resolved to: ${httpConfig.baseUrl}`)\n } else {\n return {\n content: [{ type: 'text' as const, text: 'Cannot apply variables: current baseUrl does not match any known server. Use server_index or server_url instead.' }],\n }\n }\n } else {\n lines.push(`Current active server: ${httpConfig.baseUrl}`)\n }\n\n lines.push('', 'Available servers:')\n for (let i = 0; i < spec.servers.length; i++) {\n const s = spec.servers[i]\n const resolved = tryResolveUrl(s)\n const active = resolved === httpConfig.baseUrl ? ' [active]' : ''\n const desc = s.description ? ` — ${s.description}` : ''\n lines.push(` [${i}] ${s.url}${desc}${active}`)\n\n if (s.variables) {\n for (const [name, v] of Object.entries(s.variables)) {\n const enumStr = v.enum ? ` enum=[${v.enum.join(',')}]` : ''\n lines.push(` {${name}}: default=\"${v.default}\"${enumStr}${v.description ? ` — ${v.description}` : ''}`)\n }\n }\n }\n\n return {\n content: [{ type: 'text' as const, text: lines.join('\\n') }],\n }\n }\n )\n}\n\nfunction tryResolveUrl(server: import('../parser/types.js').ParsedServer): string | null {\n try {\n return resolveServerUrl(server)\n } catch {\n return null\n }\n}\n","import { z } from 'zod'\nimport type { OpenAPIV3 } from 'openapi-types'\nimport type { ParsedOperation, ParsedParameter } from '../parser/types.js'\n\nexport function buildToolInputSchema(operation: ParsedOperation): Record<string, z.ZodTypeAny> {\n const shape: Record<string, z.ZodTypeAny> = {}\n\n for (const param of operation.parameters) {\n let zodSchema = convertToZod(param.schema)\n zodSchema = zodSchema.describe(buildParamDescription(param))\n // Don't wrap in .optional() if schema has a default — ZodDefault already handles missing values\n if (!param.required && !hasDefault(zodSchema)) {\n zodSchema = zodSchema.optional()\n }\n shape[param.name] = zodSchema\n }\n\n if (operation.requestBody) {\n const jsonContent =\n operation.requestBody.content['application/json'] ??\n operation.requestBody.content[Object.keys(operation.requestBody.content)[0]]\n\n if (jsonContent?.schema) {\n let bodySchema = convertToZod(jsonContent.schema)\n const bodyParts: string[] = []\n if (operation.requestBody.description) bodyParts.push(operation.requestBody.description)\n if (jsonContent.example !== undefined) {\n bodyParts.push(`Example: ${truncateExample(jsonContent.example)}`)\n }\n if (bodyParts.length > 0) {\n bodySchema = bodySchema.describe(bodyParts.join(' | '))\n }\n if (!operation.requestBody.required) {\n bodySchema = bodySchema.optional()\n }\n shape['body'] = bodySchema\n }\n }\n\n return shape\n}\n\nfunction buildParamDescription(param: ParsedParameter): string {\n const parts: string[] = []\n if (param.description) parts.push(param.description)\n if (param.deprecated) parts.push('[DEPRECATED]')\n if (param.schema.format) parts.push(`format: ${param.schema.format}`)\n if (param.schema.pattern) parts.push(`pattern: ${param.schema.pattern}`)\n if (param.example !== undefined) parts.push(`Example: ${truncateExample(param.example)}`)\n return parts.join(' | ') || param.schema.type || 'any'\n}\n\nfunction truncateExample(value: unknown, maxLen = 100): string {\n const str = typeof value === 'string' ? value : JSON.stringify(value)\n if (str.length <= maxLen) return str\n return str.slice(0, maxLen - 3) + '...'\n}\n\nfunction convertToZod(schema: OpenAPIV3.SchemaObject): z.ZodTypeAny {\n // Handle const (OpenAPI 3.1)\n if ('const' in schema && schema.const !== undefined) {\n return z.literal(schema.const as string | number | boolean)\n }\n\n if (schema.enum) {\n return applyDefault(convertEnum(schema.enum), schema)\n }\n\n if (schema.type === 'array') {\n const items = schema.items\n ? convertToZod(schema.items as OpenAPIV3.SchemaObject)\n : z.unknown()\n let arr = z.array(items)\n if (schema.minItems !== undefined) arr = arr.min(schema.minItems)\n if (schema.maxItems !== undefined) arr = arr.max(schema.maxItems)\n return applyDefault(arr, schema)\n }\n\n if (schema.type === 'object' || schema.properties) {\n const objShape: Record<string, z.ZodTypeAny> = {}\n\n if (schema.properties) {\n const requiredSet = new Set(schema.required ?? [])\n\n for (const [key, value] of Object.entries(schema.properties)) {\n const propSchema = value as OpenAPIV3.SchemaObject\n let zodProp = convertToZod(propSchema)\n if (propSchema.description) {\n zodProp = zodProp.describe(propSchema.description)\n }\n if (!requiredSet.has(key) && !hasDefault(zodProp)) {\n zodProp = zodProp.optional()\n }\n objShape[key] = zodProp\n }\n }\n\n if (schema.additionalProperties === true || (schema.additionalProperties && typeof schema.additionalProperties !== 'boolean')) {\n return applyDefault(z.object(objShape).passthrough(), schema)\n }\n\n return applyDefault(z.object(objShape), schema)\n }\n\n if (schema.allOf) {\n const schemas = (schema.allOf as OpenAPIV3.SchemaObject[]).map(convertToZod)\n if (schemas.length === 1) return schemas[0]\n let result = schemas[0]\n for (let i = 1; i < schemas.length; i++) {\n result = z.intersection(result, schemas[i])\n }\n return result\n }\n\n if (schema.oneOf) {\n const schemas = (schema.oneOf as OpenAPIV3.SchemaObject[]).map(convertToZod)\n if (schemas.length === 1) return schemas[0]\n const [a, b, ...rest] = schemas\n return z.union([a, b, ...rest])\n }\n\n if (schema.anyOf) {\n const schemas = (schema.anyOf as OpenAPIV3.SchemaObject[]).map(convertToZod)\n if (schemas.length === 1) return schemas[0]\n const [a, b, ...rest] = schemas\n return z.union([a, b, ...rest])\n }\n\n const base = convertBaseType(schema)\n return applyDefault(base, schema)\n}\n\nfunction convertBaseType(schema: OpenAPIV3.SchemaObject): z.ZodTypeAny {\n switch (schema.type) {\n case 'string':\n return applyStringConstraints(z.string(), schema)\n case 'number':\n case 'integer':\n return applyNumberConstraints(z.number(), schema)\n case 'boolean':\n return z.boolean()\n default:\n return z.unknown()\n }\n}\n\nconst NATIVE_STRING_FORMATS: Record<string, (s: z.ZodString) => z.ZodString> = {\n email: (s) => s.email(),\n url: (s) => s.url(),\n uuid: (s) => s.uuid(),\n datetime: (s) => s.datetime(),\n 'date-time': (s) => s.datetime(),\n date: (s) => s.date(),\n}\n\nfunction applyStringConstraints(zStr: z.ZodString, schema: OpenAPIV3.SchemaObject): z.ZodTypeAny {\n if (schema.minLength !== undefined) zStr = zStr.min(schema.minLength)\n if (schema.maxLength !== undefined) zStr = zStr.max(schema.maxLength)\n\n if (schema.pattern) {\n try {\n const re = new RegExp(schema.pattern)\n zStr = zStr.regex(re)\n } catch {\n // Invalid regex — skip validation, metadata surfaced via buildParamDescription\n }\n }\n\n if (schema.format) {\n const nativeFn = NATIVE_STRING_FORMATS[schema.format]\n if (nativeFn) {\n zStr = nativeFn(zStr)\n }\n // Non-native formats surfaced via buildParamDescription (format: X)\n }\n\n return zStr\n}\n\nfunction applyNumberConstraints(zNum: z.ZodNumber, schema: OpenAPIV3.SchemaObject): z.ZodTypeAny {\n if (schema.type === 'integer') zNum = zNum.int()\n\n if (schema.minimum !== undefined) {\n // In OpenAPI 3.0, exclusiveMinimum is a boolean; in 3.1 it's a number\n if (typeof schema.exclusiveMinimum === 'boolean' && schema.exclusiveMinimum) {\n zNum = zNum.gt(schema.minimum)\n } else {\n zNum = zNum.min(schema.minimum)\n }\n }\n\n if (schema.maximum !== undefined) {\n if (typeof schema.exclusiveMaximum === 'boolean' && schema.exclusiveMaximum) {\n zNum = zNum.lt(schema.maximum)\n } else {\n zNum = zNum.max(schema.maximum)\n }\n }\n\n // OpenAPI 3.1: exclusiveMinimum/Maximum as numbers\n if (typeof schema.exclusiveMinimum === 'number') {\n zNum = zNum.gt(schema.exclusiveMinimum)\n }\n if (typeof schema.exclusiveMaximum === 'number') {\n zNum = zNum.lt(schema.exclusiveMaximum)\n }\n\n return zNum\n}\n\nfunction applyDefault(zSchema: z.ZodTypeAny, schema: OpenAPIV3.SchemaObject): z.ZodTypeAny {\n if (schema.default !== undefined) {\n return zSchema.default(schema.default)\n }\n return zSchema\n}\n\nfunction hasDefault(schema: z.ZodTypeAny): boolean {\n return schema instanceof z.ZodDefault\n}\n\nfunction convertEnum(values: unknown[]): z.ZodTypeAny {\n const allStrings = values.every((v) => typeof v === 'string')\n\n if (allStrings && values.length >= 2) {\n const [first, second, ...rest] = values as string[]\n return z.enum([first, second, ...rest])\n }\n\n if (allStrings && values.length === 1) {\n return z.literal(values[0] as string)\n }\n\n if (values.length === 1) {\n return z.literal(values[0] as string | number | boolean)\n }\n\n const schemas = values.map((v) => z.literal(v as string | number | boolean))\n if (schemas.length >= 2) {\n const [a, b, ...rest] = schemas\n return z.union([a, b, ...rest])\n }\n\n return z.unknown()\n}\n","export function sanitizeToolName(name: string): string {\n return name\n .replace(/[^a-zA-Z0-9_-]/g, '_')\n .replace(/_+/g, '_')\n .replace(/^_|_$/g, '')\n .slice(0, 64)\n}\n\nexport function truncateDescription(text: string | undefined, maxLength = 200): string {\n if (!text) return ''\n if (text.length <= maxLength) return text\n return text.slice(0, maxLength - 3) + '...'\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { ParsedSpec } from '../parser/types.js'\n\nexport function registerResources(server: McpServer, spec: ParsedSpec): void {\n server.resource(\n 'openapi-spec',\n 'openapi://spec',\n {\n description: `Full OpenAPI spec for ${spec.title} v${spec.version}`,\n mimeType: 'application/json',\n },\n async () => ({\n contents: [\n {\n uri: 'openapi://spec',\n mimeType: 'application/json',\n text: JSON.stringify(spec.raw, null, 2),\n },\n ],\n })\n )\n\n for (const [name, schema] of Object.entries(spec.schemas)) {\n const safeName = encodeURIComponent(name)\n const uri = `openapi://schemas/${safeName}`\n\n server.resource(\n `schema-${safeName}`,\n uri,\n {\n description: (schema.description ?? `Schema: ${name}`).slice(0, 200),\n mimeType: 'application/json',\n },\n async () => ({\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(schema, null, 2),\n },\n ],\n })\n )\n }\n\n if (spec.servers.length > 0) {\n server.resource(\n 'openapi-servers',\n 'openapi://servers',\n {\n description: `Available API servers/environments for ${spec.title}`,\n mimeType: 'application/json',\n },\n async () => ({\n contents: [\n {\n uri: 'openapi://servers',\n mimeType: 'application/json',\n text: JSON.stringify(spec.servers, null, 2),\n },\n ],\n })\n )\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { z } from 'zod'\nimport type { ParsedSpec, ParsedOperation, ParsedResponse, ParsedTag } from '../parser/types.js'\nimport type { HttpClientConfig } from '../http/client.js'\nimport { resolveServerUrl } from '../http/client.js'\n\nexport function registerPrompts(server: McpServer, spec: ParsedSpec, httpConfig: HttpClientConfig): void {\n server.prompt(\n 'describe-api',\n 'Get an overview of this API including endpoints, authentication, and capabilities',\n {},\n async () => {\n const endpoints = spec.operations.map((op) => {\n const prefix = op.deprecated ? '[DEPRECATED] ' : ''\n return ` ${prefix}${op.method.padEnd(7)} ${op.path} - ${op.summary ?? op.operationId}`\n })\n\n const authSchemes = Object.entries(spec.securitySchemes)\n .map(([name, scheme]) => ` ${name}: ${scheme.type}${('scheme' in scheme) ? ` (${scheme.scheme})` : ''}`)\n\n const text = [\n `# ${spec.title} v${spec.version}`,\n '',\n spec.description ?? '',\n '',\n formatServersSection(spec, httpConfig),\n '',\n formatExternalDocsSection(spec),\n '',\n `## Endpoints (${spec.operations.length})`,\n ...endpoints,\n '',\n `## Authentication`,\n authSchemes.length > 0 ? authSchemes.join('\\n') : ' None required',\n '',\n `## Schemas`,\n Object.keys(spec.schemas).map((name) => ` - ${name}`).join('\\n') || ' None defined',\n '',\n formatTagsSection(spec),\n ]\n .filter((line) => line !== undefined && line !== '')\n .join('\\n')\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: { type: 'text' as const, text },\n },\n ],\n }\n }\n )\n\n server.prompt(\n 'explore-endpoint',\n 'Get detailed information about a specific API endpoint',\n { operationId: z.string().describe('The operationId of the endpoint to explore') },\n async ({ operationId }) => {\n const operation = spec.operations.find((op) => op.operationId === operationId)\n\n if (!operation) {\n const available = spec.operations.map((op) => op.operationId).join(', ')\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Operation \"${operationId}\" not found. Available operations: ${available}`,\n },\n },\n ],\n }\n }\n\n const text = buildEndpointPrompt(operation, spec.tags)\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: { type: 'text' as const, text },\n },\n ],\n }\n }\n )\n}\n\nfunction formatServersSection(spec: ParsedSpec, httpConfig: HttpClientConfig): string {\n if (spec.servers.length === 0) return '## Servers\\n (not specified)'\n\n const lines = ['## Servers']\n for (let i = 0; i < spec.servers.length; i++) {\n const s = spec.servers[i]\n let resolved: string | null = null\n try { resolved = resolveServerUrl(s) } catch { /* skip */ }\n const active = resolved === httpConfig.baseUrl ? ' [active]' : ''\n const desc = s.description ? ` — ${s.description}` : ''\n lines.push(` [${i}]${active} ${s.url}${desc}`)\n\n if (s.variables) {\n for (const [name, v] of Object.entries(s.variables)) {\n const enumStr = v.enum ? `=[${v.enum.join(',')}]` : ''\n lines.push(` {${name}}: default=\"${v.default}\"${enumStr}${v.description ? ` — ${v.description}` : ''}`)\n }\n }\n }\n\n if (spec.servers.length > 1) {\n lines.push('', ' Use the `set_environment` tool to switch servers.')\n }\n\n return lines.join('\\n')\n}\n\nfunction formatTagsSection(spec: ParsedSpec): string {\n if (spec.tags.length === 0) return ''\n\n const lines = ['## Tags']\n for (const tag of spec.tags) {\n let line = ` - **${tag.name}**`\n if (tag.description) line += `: ${tag.description}`\n if (tag.externalDocs) line += ` (docs: ${tag.externalDocs.url})`\n lines.push(line)\n }\n return lines.join('\\n')\n}\n\nfunction formatExternalDocsSection(spec: ParsedSpec): string {\n if (!spec.externalDocs) return ''\n const desc = spec.externalDocs.description ? `${spec.externalDocs.description}: ` : ''\n return `## External Documentation\\n ${desc}${spec.externalDocs.url}`\n}\n\nfunction buildEndpointPrompt(operation: ParsedOperation, globalTags: ParsedTag[]): string {\n const deprecatedTag = operation.deprecated ? ' [DEPRECATED]' : ''\n\n const params = operation.parameters.map((p) => {\n const parts = [\n ` - ${p.name} (${p.in}, ${p.required ? 'required' : 'optional'})`,\n ]\n if (p.deprecated) parts[0] += ' [DEPRECATED]'\n parts[0] += `: ${p.description ?? p.schema.type ?? 'any'}`\n if (p.schema.format) parts[0] += ` (format: ${p.schema.format})`\n if (p.example !== undefined) parts[0] += ` — example: ${formatExample(p.example)}`\n return parts[0]\n })\n\n const responses = formatResponses(operation.responses)\n const links = formatLinks(operation.responses)\n\n const sections = [\n `# ${operation.method} ${operation.path}${deprecatedTag}`,\n `operationId: ${operation.operationId}`,\n '',\n operation.summary ? `**Summary**: ${operation.summary}` : '',\n operation.description ? `**Description**: ${operation.description}` : '',\n '',\n `## Parameters`,\n params.length > 0 ? params.join('\\n') : ' None',\n '',\n formatRequestBody(operation),\n '',\n `## Responses`,\n ...responses,\n '',\n ]\n\n if (links.length > 0) {\n sections.push(`## Links`, ...links, '')\n }\n\n sections.push(\n `## Security`,\n operation.security.length > 0\n ? operation.security.map((s) => ` ${Object.keys(s).join(', ')}`).join('\\n')\n : ' None',\n '',\n )\n\n if (operation.tags.length > 0) {\n const tagLines = ['## Tags']\n for (const tagName of operation.tags) {\n const globalTag = globalTags.find((t) => t.name === tagName)\n let line = ` - **${tagName}**`\n if (globalTag?.description) line += `: ${globalTag.description}`\n if (globalTag?.externalDocs) line += ` (docs: ${globalTag.externalDocs.url})`\n tagLines.push(line)\n }\n sections.push(tagLines.join('\\n'))\n }\n\n if (operation.externalDocs) {\n const desc = operation.externalDocs.description ? `${operation.externalDocs.description}: ` : ''\n sections.push('', `## External Documentation`, ` ${desc}${operation.externalDocs.url}`)\n }\n\n return sections\n .filter((line) => line !== undefined)\n .join('\\n')\n}\n\nfunction formatRequestBody(operation: ParsedOperation): string {\n if (!operation.requestBody) return ''\n\n const lines = [\n `## Request Body ${operation.requestBody.required ? '(required)' : '(optional)'}`,\n operation.requestBody.description ?? '',\n '```json',\n safeStringify(\n Object.values(operation.requestBody.content)[0]?.schema ?? {},\n null,\n 2\n ),\n '```',\n ]\n\n const jsonContent = operation.requestBody.content['application/json'] ??\n Object.values(operation.requestBody.content)[0]\n\n if (jsonContent?.example !== undefined) {\n lines.push('', '**Example:**', '```json', safeStringify(jsonContent.example, null, 2), '```')\n }\n\n return lines.join('\\n')\n}\n\nfunction formatResponses(responses: Record<string, ParsedResponse>): string[] {\n const lines: string[] = []\n\n for (const [code, resp] of Object.entries(responses)) {\n lines.push(` ${code}: ${resp.description || '(no description)'}`)\n\n if (resp.schema) {\n lines.push(' ```json', ` ${safeStringify(resp.schema, null, 2).split('\\n').join('\\n ')}`, ' ```')\n }\n\n if (resp.example !== undefined) {\n lines.push(` Example:`)\n lines.push(' ```json', ` ${safeStringify(resp.example, null, 2).split('\\n').join('\\n ')}`, ' ```')\n }\n }\n\n return lines\n}\n\nfunction formatLinks(responses: Record<string, ParsedResponse>): string[] {\n const lines: string[] = []\n\n for (const [code, resp] of Object.entries(responses)) {\n if (!resp.links) continue\n for (const [, link] of Object.entries(resp.links)) {\n const target = link.operationId ?? link.operationRef ?? '(unknown)'\n const params = link.parameters\n ? Object.entries(link.parameters).map(([k, v]) => `${k}=${v}`).join(', ')\n : ''\n const desc = link.description ? ` — ${link.description}` : ''\n lines.push(` After ${code} response, call \\`${target}\\`${params ? ` with {${params}}` : ''}${desc}`)\n }\n }\n\n return lines\n}\n\nfunction formatExample(value: unknown): string {\n if (typeof value === 'string') return value\n return safeStringify(value)\n}\n\nfunction safeStringify(value: unknown, _replacer?: unknown, indent?: number): string {\n try {\n return JSON.stringify(value, null, indent)\n } catch {\n return '(circular or non-serializable)'\n }\n}\n","import { createOpenApiMcp } from './server.js'\n\ninterface CliArgs {\n source?: string\n baseUrl?: string\n serverIndex?: number\n}\n\nfunction parseArgs(argv: string[]): CliArgs {\n const args: CliArgs = {}\n\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i]\n const next = argv[i + 1]\n\n if ((arg === '-s' || arg === '--source') && next) {\n args.source = next\n i++\n } else if ((arg === '-b' || arg === '--base-url') && next) {\n args.baseUrl = next\n i++\n } else if ((arg === '--server-index') && next) {\n const parsed = parseInt(next, 10)\n if (isNaN(parsed) || parsed < 0) {\n console.error(`Error: --server-index must be a non-negative integer, got \"${next}\"`)\n process.exit(1)\n }\n args.serverIndex = parsed\n i++\n } else if (arg === '-h' || arg === '--help') {\n printHelp()\n process.exit(0)\n } else if (!arg.startsWith('-') && !args.source) {\n args.source = arg\n }\n }\n\n return args\n}\n\nfunction printHelp(): void {\n console.log(`\ndynamic-openapi-mcp - Transform OpenAPI specs into MCP servers\n\nUsage:\n dynamic-openapi-mcp [options] [source]\n\nOptions:\n -s, --source <url|file> OpenAPI spec URL or file path\n -b, --base-url <url> Override the base URL from the spec\n --server-index <n> Use the Nth server from the spec (0-based, default: 0)\n -h, --help Show this help message\n\nEnvironment Variables:\n OPENAPI_SOURCE OpenAPI spec URL or file path\n OPENAPI_BASE_URL Override base URL\n OPENAPI_SERVER_INDEX Server index (0-based)\n OPENAPI_AUTH_TOKEN Bearer token for API authentication\n OPENAPI_API_KEY API key for authentication\n\nExamples:\n dynamic-openapi-mcp -s https://petstore3.swagger.io/api/v3/openapi.json\n dynamic-openapi-mcp ./spec.yaml\n dynamic-openapi-mcp --server-index 1 ./spec.yaml\n OPENAPI_SOURCE=./spec.yaml OPENAPI_AUTH_TOKEN=sk-123 dynamic-openapi-mcp\n`)\n}\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv)\n\n const source = args.source ?? process.env['OPENAPI_SOURCE'] ?? process.env['OPENAPI_SOURCE_FILE']\n\n if (!source) {\n console.error('Error: No OpenAPI source specified.')\n console.error('Use -s <url|file> or set OPENAPI_SOURCE environment variable.')\n console.error('Run dynamic-openapi-mcp --help for usage information.')\n process.exit(1)\n }\n\n const baseUrl = args.baseUrl ?? process.env['OPENAPI_BASE_URL']\n\n let serverIndex = args.serverIndex\n if (serverIndex === undefined && process.env['OPENAPI_SERVER_INDEX']) {\n const parsed = parseInt(process.env['OPENAPI_SERVER_INDEX'], 10)\n if (!isNaN(parsed) && parsed >= 0) {\n serverIndex = parsed\n }\n }\n\n try {\n const mcp = await createOpenApiMcp({\n source,\n baseUrl,\n serverIndex,\n })\n\n const opCount = mcp.spec.operations.length\n const schemaCount = Object.keys(mcp.spec.schemas).length\n process.stderr.write(\n `dynamic-openapi-mcp: loaded \"${mcp.spec.title}\" v${mcp.spec.version} — ${opCount} tools, ${schemaCount} schemas\\n`\n )\n\n await mcp.serve()\n } catch (error) {\n if (error instanceof Error) {\n process.stderr.write(`dynamic-openapi-mcp: ${error.message}\\n`)\n if (error.stack) {\n process.stderr.write(`${error.stack}\\n`)\n }\n } else {\n process.stderr.write(`dynamic-openapi-mcp: ${String(error)}\\n`)\n }\n process.exit(1)\n }\n}\n\nmain()\n"],"mappings":";;;AAAA,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;;;ACMrC,IAAM,kBAAmD;AAAA,EACvD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SAAS,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG;AACnC;AAEA,eAAsB,eACpB,KACA,MACA,MACmB;AACnB,QAAM,EAAE,SAAS,SAAS,YAAY,QAAQ,IAAI,EAAE,GAAG,iBAAiB,GAAG,KAAK;AAEhF,MAAI;AAEJ,WAAS,UAAU,GAAG,WAAW,SAAS,WAAW;AACnD,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,OAAO;AAE1D,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,GAAG;AAAA,QACH,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,mBAAa,KAAK;AAElB,UAAI,QAAQ,SAAS,SAAS,MAAM,KAAK,UAAU,SAAS;AAC1D,cAAM,aAAa,SAAS,QAAQ,IAAI,aAAa;AACrD,cAAM,QAAQ,aACV,gBAAgB,UAAU,IAC1B,aAAa,KAAK,IAAI,GAAG,OAAO;AAEpC,cAAM,MAAM,KAAK;AACjB;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,kBAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAEpE,UAAI,UAAU,SAAS,cAAc;AACnC,oBAAY,IAAI,MAAM,2BAA2B,OAAO,OAAO,GAAG,EAAE;AAAA,MACtE;AAEA,UAAI,UAAU,SAAS;AACrB,cAAM,MAAM,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC;AAC7C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,IAAI,MAAM,wBAAwB,UAAU,CAAC,cAAc,GAAG,EAAE;AACrF;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,OAAO,MAAM,OAAO,GAAG;AAC1B,WAAO,KAAK,IAAI,UAAU,KAAM,GAAM;AAAA,EACxC;AAEA,QAAM,OAAO,KAAK,MAAM,KAAK;AAC7B,MAAI,CAAC,OAAO,MAAM,IAAI,GAAG;AACvB,WAAO,KAAK,IAAI,KAAK,IAAI,OAAO,KAAK,IAAI,GAAG,CAAC,GAAG,GAAM;AAAA,EACxD;AAEA,SAAO;AACT;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;;;AC3EO,IAAM,aAAN,MAAyC;AAAA,EAC9C,YAAoB,OAAe;AAAf;AAAA,EAAgB;AAAA,EAEpC,MAAM,MAAM,MAAW,MAAyC;AAC9D,UAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,YAAQ,IAAI,iBAAiB,UAAU,KAAK,KAAK,EAAE;AACnD,WAAO,EAAE,GAAG,MAAM,QAAQ;AAAA,EAC5B;AACF;AAEO,IAAM,aAAN,MAAyC;AAAA,EAC9C,YACU,KACA,WACA,UACR;AAHQ;AACA;AACA;AAAA,EACP;AAAA,EAEH,MAAM,MAAM,KAAU,MAAyC;AAC7D,YAAQ,KAAK,UAAU;AAAA,MACrB,KAAK,UAAU;AACb,cAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,gBAAQ,IAAI,KAAK,WAAW,KAAK,GAAG;AACpC,eAAO,EAAE,GAAG,MAAM,QAAQ;AAAA,MAC5B;AAAA,MACA,KAAK,SAAS;AACZ,YAAI,aAAa,IAAI,KAAK,WAAW,KAAK,GAAG;AAC7C,eAAO;AAAA,MACT;AAAA,MACA,KAAK,UAAU;AACb,cAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,cAAM,WAAW,QAAQ,IAAI,QAAQ,KAAK;AAC1C,cAAM,aAAa,mBAAmB,KAAK,SAAS;AACpD,cAAM,eAAe,mBAAmB,KAAK,GAAG;AAChD,cAAM,SAAS,WACX,GAAG,QAAQ,KAAK,UAAU,IAAI,YAAY,KAC1C,GAAG,UAAU,IAAI,YAAY;AACjC,gBAAQ,IAAI,UAAU,MAAM;AAC5B,eAAO,EAAE,GAAG,MAAM,QAAQ;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,YAAN,MAAwC;AAAA,EAC7C,YACU,UACA,UACR;AAFQ;AACA;AAAA,EACP;AAAA,EAEH,MAAM,MAAM,MAAW,MAAyC;AAC9D,UAAM,cAAc,GAAG,KAAK,QAAQ,IAAI,KAAK,QAAQ;AACrD,UAAM,UAAU,OAAO,KAAK,aAAa,OAAO,EAAE,SAAS,QAAQ;AACnE,UAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,YAAQ,IAAI,iBAAiB,SAAS,OAAO,EAAE;AAC/C,WAAO,EAAE,GAAG,MAAM,QAAQ;AAAA,EAC5B;AACF;AAEO,IAAM,0BAAN,MAAsD;AAAA,EAI3D,YACU,UACA,cACA,UACA,SAAmB,CAAC,GAC5B;AAJQ;AACA;AACA;AACA;AAAA,EACP;AAAA,EARK,aAA0D;AAAA,EAC1D,iBAAyC;AAAA,EASjD,MAAM,MAAM,MAAW,MAAyC;AAC9D,UAAM,QAAQ,MAAM,KAAK,SAAS;AAClC,UAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,YAAQ,IAAI,iBAAiB,UAAU,KAAK,EAAE;AAC9C,WAAO,EAAE,GAAG,MAAM,QAAQ;AAAA,EAC5B;AAAA,EAEA,MAAc,WAA4B;AACxC,QAAI,KAAK,cAAc,KAAK,IAAI,IAAI,KAAK,WAAW,WAAW;AAC7D,aAAO,KAAK,WAAW;AAAA,IACzB;AAEA,QAAI,KAAK,gBAAgB;AACvB,aAAO,KAAK;AAAA,IACd;AAEA,SAAK,iBAAiB,KAAK,WAAW;AAEtC,QAAI;AACF,aAAO,MAAM,KAAK;AAAA,IACpB,UAAE;AACA,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAc,aAA8B;AAC1C,UAAM,OAAO,IAAI,gBAAgB;AAAA,MAC/B,YAAY;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,eAAe,KAAK;AAAA,IACtB,CAAC;AAED,QAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,WAAK,IAAI,SAAS,KAAK,OAAO,KAAK,GAAG,CAAC;AAAA,IACzC;AAEA,UAAM,MAAM,MAAM,eAAe,KAAK,UAAU;AAAA,MAC9C,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,MAC/D;AAAA,IACF,GAAG,EAAE,SAAS,GAAG,SAAS,KAAO,CAAC;AAElC,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,YAAY,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,YAAM,IAAI;AAAA,QACR,gCAAgC,IAAI,MAAM,IAAI,IAAI,UAAU,GAAG,YAAY,MAAM,SAAS,KAAK,EAAE;AAAA,MACnG;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,IAAI,KAAK;AAAA,IACxB,QAAQ;AACN,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AAEA,QAAI,OAAO,KAAK,iBAAiB,YAAY,CAAC,KAAK,cAAc;AAC/D,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAEA,UAAM,YAAY,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAC1E,UAAM,gBAAgB,KAAK,IAAI,IAAI,YAAY,GAAG;AAElD,SAAK,aAAa;AAAA,MAChB,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK,IAAI,KAAK,YAAY,iBAAiB;AAAA,IACxD;AAEA,WAAO,KAAK;AAAA,EACd;AACF;AAEO,IAAM,aAAN,MAAyC;AAAA,EAC9C,YAAoB,SAAiF;AAAjF;AAAA,EAAkF;AAAA,EAEtG,MAAM,MAAM,KAAU,MAAyC;AAC7D,WAAO,KAAK,QAAQ,IAAI,SAAS,GAAG,IAAI;AAAA,EAC1C;AACF;AAEO,IAAM,gBAAN,MAA4C;AAAA,EACjD,YAAoB,YAA4B;AAA5B;AAAA,EAA6B;AAAA,EAEjD,MAAM,MAAM,KAAU,MAAyC;AAC7D,QAAI,SAAS;AACb,eAAW,YAAY,KAAK,YAAY;AACtC,eAAS,MAAM,SAAS,MAAM,KAAK,MAAM;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,qBACd,QACA,YACqB;AACrB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,QAAQ;AACX,UAAI,OAAO,WAAW,UAAU;AAC9B,eAAO,IAAI,WAAW,UAAU;AAAA,MAClC;AACA,UAAI,OAAO,WAAW,SAAS;AAC7B,cAAM,aAAa,WAAW,QAAQ,GAAG;AACzC,YAAI,eAAe,IAAI;AACrB,iBAAO,IAAI,UAAU,YAAY,EAAE;AAAA,QACrC;AACA,eAAO,IAAI,UAAU,WAAW,MAAM,GAAG,UAAU,GAAG,WAAW,MAAM,aAAa,CAAC,CAAC;AAAA,MACxF;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,UAAU;AACb,YAAM,WAAW,OAAO;AACxB,UAAI,CAAC,CAAC,UAAU,SAAS,QAAQ,EAAE,SAAS,QAAQ,GAAG;AACrD,eAAO,IAAI,WAAW,YAAY,OAAO,MAAM,QAAQ;AAAA,MACzD;AACA,aAAO,IAAI,WAAW,YAAY,OAAO,MAAM,QAAQ;AAAA,IACzD;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;;;ACrLO,SAAS,YACd,QACA,iBACqB;AACrB,QAAM,aAA6B,CAAC;AAEpC,MAAI,QAAQ,QAAQ;AAClB,WAAO,IAAI,WAAW,OAAO,MAAM;AAAA,EACrC;AAEA,MAAI,QAAQ,aAAa;AACvB,eAAW,KAAK,IAAI,WAAW,OAAO,WAAW,CAAC;AAAA,EACpD;AAEA,MAAI,QAAQ,QAAQ;AAClB,UAAM,eAAe,OAAO,OAAO,eAAe,EAAE;AAAA,MAClD,CAAC,MAAM,EAAE,SAAS;AAAA,IACpB;AAEA,QAAI,cAAc;AAChB,iBAAW,KAAK,IAAI,WAAW,OAAO,QAAQ,aAAa,MAAM,aAAa,EAAmC,CAAC;AAAA,IACpH,OAAO;AACL,iBAAW,KAAK,IAAI,WAAW,OAAO,QAAQ,aAAa,QAAQ,CAAC;AAAA,IACtE;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW;AACrB,eAAW,KAAK,IAAI,UAAU,OAAO,UAAU,UAAU,OAAO,UAAU,QAAQ,CAAC;AAAA,EACrF;AAEA,MAAI,QAAQ,QAAQ;AAClB,eAAW;AAAA,MACT,IAAI;AAAA,QACF,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,SAAS,GAAG;AACzB,WAAO,WAAW,WAAW,IAAI,WAAW,CAAC,IAAI,IAAI,cAAc,UAAU;AAAA,EAC/E;AAEA,SAAO,mBAAmB,eAAe;AAC3C;AAEA,SAAS,mBACP,iBACqB;AACrB,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,eAAe,GAAG;AAC5D,UAAM,UAAU,KAAK,YAAY,EAAE,QAAQ,cAAc,GAAG;AAC5D,UAAM,WAAW,QAAQ,IAAI,gBAAgB,OAAO,QAAQ,KACvD,QAAQ,IAAI,gBAAgB,OAAO,MAAM;AAE9C,QAAI,UAAU;AACZ,YAAM,OAAO,qBAAqB,QAAQ,QAAQ;AAClD,UAAI,KAAM,QAAO;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,cAAc,QAAQ,IAAI,oBAAoB;AACpD,MAAI,aAAa;AACf,WAAO,IAAI,WAAW,WAAW;AAAA,EACnC;AAEA,QAAM,eAAe,QAAQ,IAAI,iBAAiB;AAClD,MAAI,cAAc;AAChB,UAAM,eAAe,OAAO,OAAO,eAAe,EAAE;AAAA,MAClD,CAAC,MAAM,EAAE,SAAS;AAAA,IACpB;AAEA,QAAI,cAAc;AAChB,aAAO,IAAI,WAAW,cAAc,aAAa,MAAM,aAAa,EAAmC;AAAA,IACzG;AACA,WAAO,IAAI,WAAW,cAAc,aAAa,QAAQ;AAAA,EAC3D;AAEA,SAAO;AACT;;;AC5FA,SAAS,gBAAgB;AACzB,SAAS,SAAS,iBAAiB;AAI5B,SAAS,cAAc,QAAqC;AACjE,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,EAAE,MAAM,UAAmB,OAAO,OAAO;AAAA,EAClD;AAEA,MAAI,OAAO,WAAW,SAAS,KAAK,OAAO,WAAW,UAAU,GAAG;AACjE,WAAO,EAAE,MAAM,OAAgB,OAAO,OAAO;AAAA,EAC/C;AAEA,MAAI,OAAO,KAAK,EAAE,WAAW,GAAG,KAAK,OAAO,KAAK,EAAE,WAAW,SAAS,GAAG;AACxE,WAAO,EAAE,MAAM,UAAmB,OAAO,OAAO;AAAA,EAClD;AAEA,SAAO,EAAE,MAAM,QAAiB,OAAO,OAAO;AAChD;AAEA,eAAsB,SAAS,QAAkE;AAC/F,QAAM,WAAW,cAAc,MAAM;AAErC,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK,OAAO;AACV,YAAM,MAAM,MAAM,eAAe,SAAS,KAAK;AAC/C,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,6BAA6B,SAAS,KAAK,KAAK,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,MAChG;AACA,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,aAAO,cAAc,MAAM,SAAS,KAAK;AAAA,IAC3C;AAAA,IAEA,KAAK,QAAQ;AACX,UAAI;AACJ,UAAI;AACF,eAAO,MAAM,SAAS,SAAS,OAAO,OAAO;AAAA,MAC/C,SAAS,KAAK;AACZ,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,cAAM,IAAI,MAAM,6BAA6B,SAAS,KAAK,MAAM,GAAG,EAAE;AAAA,MACxE;AACA,aAAO,cAAc,MAAM,SAAS,KAAK;AAAA,IAC3C;AAAA,IAEA,KAAK,UAAU;AACb,UAAI,OAAO,SAAS,UAAU,UAAU;AACtC,eAAO,cAAc,SAAS,OAAO,UAAU;AAAA,MACjD;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAAc,QAAoC;AACvE,QAAM,UAAU,KAAK,KAAK;AAE1B,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,QAAI;AACF,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,YAAM,IAAI,MAAM,kCAAkC,MAAM,KAAK,GAAG,EAAE;AAAA,IACpE;AAAA,EACF;AAEA,MAAI;AACF,WAAO,UAAU,OAAO;AAAA,EAC1B,SAAS,KAAK;AACZ,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,UAAM,IAAI,MAAM,kCAAkC,MAAM,KAAK,GAAG,EAAE;AAAA,EACpE;AACF;;;ACxEA,SAAS,UAAU,mBAAmB;AAItC,eAAsB,YAAY,KAA8C;AAC9E,QAAM,aAAa,MAAM,SAAS,gBAAgB,GAAG,CAAC;AACtD,MAAI,CAAC,WAAW,OAAO;AACrB,UAAM,mBAAmB;AACzB,UAAM,SAAS,iBAAiB,UAAU,CAAC;AAC3C,UAAM,IAAI,MAAM,yBAAyB,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,EACnE;AACA,QAAM,eAAgB,MAAM,YAAY,gBAAgB,GAAG,CAAC;AAE5D,QAAM,aAAa,kBAAkB,YAAY;AACjD,QAAM,UAAU,eAAe,YAAY;AAC3C,QAAM,kBAAkB,uBAAuB,YAAY;AAC3D,QAAM,UAAU,eAAe,YAAY;AAC3C,QAAM,OAAO,YAAY,YAAY;AACrC,QAAM,eAAe,oBAAoB,aAAa,YAAiE;AAEvH,SAAO;AAAA,IACL,OAAO,aAAa,KAAK;AAAA,IACzB,SAAS,aAAa,KAAK;AAAA,IAC3B,aAAa,aAAa,KAAK;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EACP;AACF;AAEA,IAAM,eAAe,CAAC,OAAO,QAAQ,OAAO,UAAU,SAAS,QAAQ,WAAW,OAAO;AAEzF,SAAS,kBAAkB,KAA4C;AACrE,QAAM,aAAgC,CAAC;AACvC,QAAM,QAAQ,IAAI,SAAS,CAAC;AAE5B,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,KAAK,GAAG;AACpD,QAAI,CAAC,SAAU;AAEf,UAAM,aAAc,SAAS,cAAc,CAAC;AAE5C,eAAW,UAAU,cAAc;AACjC,YAAM,YAAY,SAAS,MAAM;AACjC,UAAI,CAAC,UAAW;AAEhB,YAAM,kBAAmB,UAAU,cAAc,CAAC;AAClD,YAAM,YAAY,gBAAgB,YAAY,eAAe;AAE7D,YAAM,cACJ,UAAU,eAAe,oBAAoB,QAAQ,IAAI;AAE3D,YAAM,aAAgC,UAAU,IAAI,CAAC,OAAO;AAAA,QAC1D,MAAM,EAAE;AAAA,QACR,IAAI,EAAE;AAAA,QACN,UAAU,EAAE,YAAY,EAAE,OAAO;AAAA,QACjC,aAAa,EAAE;AAAA,QACf,QAAS,EAAE,UAAqC,EAAE,MAAM,SAAS;AAAA,QACjE,SAAS,EAAE;AAAA,QACX,UAAU,EAAE,WAAW,gBAAgB,EAAE,QAAmD,IAAI;AAAA,QAChG,YAAY,EAAE;AAAA,MAChB,EAAE;AAEF,UAAI;AACJ,UAAI,UAAU,aAAa;AACzB,cAAM,KAAK,UAAU;AACrB,cAAM,UAAwC,CAAC;AAC/C,mBAAW,CAAC,WAAW,QAAQ,KAAK,OAAO,QAAQ,GAAG,WAAW,CAAC,CAAC,GAAG;AACpE,cAAI,SAAS,QAAQ;AACnB,oBAAQ,SAAS,IAAI;AAAA,cACnB,QAAQ,SAAS;AAAA,cACjB,SAAS,SAAS;AAAA,cAClB,UAAU,SAAS,WAAW,gBAAgB,SAAS,QAAmD,IAAI;AAAA,YAChH;AAAA,UACF;AAAA,QACF;AACA,sBAAc;AAAA,UACZ,UAAU,GAAG,YAAY;AAAA,UACzB,aAAa,GAAG;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAA4C,CAAC;AACnD,iBAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,UAAU,aAAa,CAAC,CAAC,GAAG;AACpE,kBAAU,IAAI,IAAI,gBAAgB,IAAgC;AAAA,MACpE;AAEA,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,QAAQ,OAAO,YAAY;AAAA,QAC3B;AAAA,QACA,SAAS,UAAU;AAAA,QACnB,aAAa,UAAU;AAAA,QACvB,YAAY,UAAU;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,UAAU,YAAY,IAAI,YAAY,CAAC;AAAA,QACjD,MAAM,UAAU,QAAQ,CAAC;AAAA,QACzB,cAAc,oBAAoB,UAAU,YAAY;AAAA,MAC1D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAgD;AACvE,QAAM,SAAyB;AAAA,IAC7B,aAAa,KAAK,eAAe;AAAA,IACjC,SAAS,CAAC;AAAA,EACZ;AAEA,MAAI,KAAK,SAAS;AAChB,eAAW,CAAC,WAAW,QAAQ,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AAChE,aAAO,QAAS,SAAS,IAAI;AAAA,QAC3B,QAAQ,SAAS;AAAA,MACnB;AAGA,UAAI,CAAC,OAAO,UAAU,SAAS,QAAQ;AACrC,eAAO,SAAS,SAAS;AACzB,eAAO,YAAY;AAAA,MACrB;AAGA,UAAI,OAAO,YAAY,UAAa,SAAS,YAAY,QAAW;AAClE,eAAO,UAAU,SAAS;AAAA,MAC5B;AACA,UAAI,CAAC,OAAO,YAAY,SAAS,UAAU;AACzC,eAAO,WAAW,gBAAgB,SAAS,QAAmD;AAAA,MAChG;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,OAAO;AACd,WAAO,QAAQ,aAAa,KAAK,KAA6C;AAAA,EAChF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,UAAkF;AACzG,QAAM,SAAwC,CAAC;AAC/C,aAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACjD,WAAO,IAAI,IAAI;AAAA,MACb,SAAS,GAAG;AAAA,MACZ,aAAa,GAAG;AAAA,MAChB,OAAO,GAAG;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAyE;AAC7F,QAAM,SAAqC,CAAC;AAC5C,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,WAAO,IAAI,IAAI;AAAA,MACb,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,QAAgB,MAAsB;AACjE,QAAM,UAAU,KACb,QAAQ,gBAAgB,OAAO,EAC/B,QAAQ,iBAAiB,GAAG,EAC5B,QAAQ,OAAO,GAAG,EAClB,QAAQ,UAAU,EAAE;AAEvB,SAAO,GAAG,MAAM,IAAI,OAAO,GAAG,YAAY;AAC5C;AAEA,SAAS,gBACP,YACA,iBAC6B;AAC7B,QAAM,SAAS,oBAAI,IAAuC;AAE1D,aAAW,KAAK,YAAY;AAC1B,WAAO,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;AAAA,EACnC;AAEA,aAAW,KAAK,iBAAiB;AAC/B,WAAO,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;AAAA,EACnC;AAEA,SAAO,MAAM,KAAK,OAAO,OAAO,CAAC;AACnC;AAEA,SAAS,eAAe,KAAiE;AACvF,QAAM,UAAkD,CAAC;AACzD,QAAM,aAAa,IAAI,YAAY,WAAW,CAAC;AAE/C,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,UAAU,GAAG;AACvD,YAAQ,IAAI,IAAI;AAAA,EAClB;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,KAAyE;AACvG,QAAM,UAA0D,CAAC;AACjE,QAAM,aAAa,IAAI,YAAY,mBAAmB,CAAC;AAEvD,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,UAAU,GAAG;AACvD,YAAQ,IAAI,IAAI;AAAA,EAClB;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,KAAyC;AAC/D,UAAQ,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM;AACpC,UAAM,SAAuB,EAAE,KAAK,EAAE,IAAI;AAC1C,QAAI,EAAE,YAAa,QAAO,cAAc,EAAE;AAC1C,QAAI,EAAE,WAAW;AACf,aAAO,YAAY,CAAC;AACpB,iBAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,EAAE,SAAS,GAAG;AACnD,eAAO,UAAU,IAAI,IAAI;AAAA,UACvB,SAAS,EAAE;AAAA,UACX,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,YAAY,KAAsC;AACzD,UAAQ,IAAI,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM;AACjC,UAAM,MAAiB,EAAE,MAAM,EAAE,KAAK;AACtC,QAAI,EAAE,YAAa,KAAI,cAAc,EAAE;AACvC,QAAI,EAAE,cAAc;AAClB,UAAI,eAAe;AAAA,QACjB,KAAK,EAAE,aAAa;AAAA,QACpB,aAAa,EAAE,aAAa;AAAA,MAC9B;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,oBAAoB,MAAmF;AAC9G,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO;AAAA,IACL,KAAK,KAAK;AAAA,IACV,aAAa,KAAK;AAAA,EACpB;AACF;;;AC9PA,eAAsB,eAAe,UAA6C;AAChF,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,QAAM,SAAS,SAAS;AAExB,MAAI,WAAW,KAAK;AAClB,WAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,mBAAmB,CAAC;AAAA,EACpD;AAEA,MAAI,YAAY,SAAS,QAAQ,GAAG;AAClC,UAAM,SAAS,MAAM,SAAS,YAAY;AAC1C,UAAM,SAAS,OAAO,KAAK,MAAM,EAAE,SAAS,QAAQ;AACpD,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU,YAAY,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,MAAI,YAAY,SAAS,MAAM,GAAG;AAChC,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,aAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC;AAAA,IACjE,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,2BAA2B,MAAM,IAAI,CAAC;AAC9E;;;ACpBO,SAAS,iBAAiB,QAAsB,mBAAoD;AACzG,MAAI,MAAM,OAAO;AAEjB,MAAI,OAAO,WAAW;AACpB,eAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,OAAO,SAAS,GAAG;AAC/D,YAAM,QAAQ,oBAAoB,IAAI,KAAK,SAAS;AACpD,UAAI,SAAS,QAAQ,CAAC,SAAS,KAAK,SAAS,KAAK,GAAG;AACnD,cAAM,IAAI,MAAM,kBAAkB,KAAK,0BAA0B,IAAI,eAAe,SAAS,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,MAChH;AACA,YAAM,IAAI,WAAW,IAAI,IAAI,KAAK,KAAK;AAAA,IACzC;AAAA,EACF;AAEA,SAAO,aAAa,GAAG;AACzB;AAEA,SAAS,aAAa,KAAqB;AACzC,MAAI,CAAC,IAAI,WAAW,SAAS,KAAK,CAAC,IAAI,WAAW,UAAU,GAAG;AAC7D,UAAM,WAAW,GAAG;AAAA,EACtB;AACA,SAAO,IAAI,QAAQ,OAAO,EAAE;AAC9B;AAEO,SAAS,eAAe,MAAkB,iBAA0B,aAA8B;AACvG,MAAI,gBAAiB,QAAO,gBAAgB,QAAQ,OAAO,EAAE;AAE7D,QAAM,QAAQ,eAAe;AAC7B,QAAM,SAAS,KAAK,QAAQ,KAAK;AACjC,MAAI,QAAQ;AACV,WAAO,iBAAiB,MAAM;AAAA,EAChC;AAEA,QAAM,IAAI,MAAM,qDAAqD;AACvE;AAEA,eAAsB,iBACpB,WACA,MACA,QACyB;AACzB,QAAM,mBAAmB,uBAAuB,WAAW,IAAI;AAC/D,MAAI,iBAAiB,SAAS,GAAG;AAC/B,WAAO,CAAC,EAAE,MAAM,QAAiB,MAAM;AAAA,EAAuB,iBAAiB,KAAK,IAAI,CAAC,GAAG,CAAC;AAAA,EAC/F;AAEA,MAAI,OAAO,UAAU;AAErB,aAAW,SAAS,UAAU,YAAY;AACxC,QAAI,MAAM,OAAO,UAAU,KAAK,MAAM,IAAI,MAAM,QAAW;AACzD,YAAM,QAAQ,mBAAmB,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC;AACzD,aAAO,KAAK,WAAW,IAAI,MAAM,IAAI,KAAK,KAAK;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,MAAM,IAAI,IAAI,GAAG,OAAO,OAAO,GAAG,IAAI,EAAE;AAE9C,aAAW,SAAS,UAAU,YAAY;AACxC,QAAI,MAAM,OAAO,WAAW,KAAK,MAAM,IAAI,MAAM,QAAW;AAC1D,YAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,UAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,mBAAW,QAAQ,KAAK;AACtB,cAAI,aAAa,OAAO,MAAM,MAAM,OAAO,IAAI,CAAC;AAAA,QAClD;AAAA,MACF,OAAO;AACL,YAAI,aAAa,IAAI,MAAM,MAAM,OAAO,GAAG,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,QAAQ,OAAO,cAAc;AAEjD,QAAM,WAAW,sBAAsB,SAAS;AAChD,UAAQ,IAAI,UAAU,SAAS,SAAS,IAAI,SAAS,KAAK,IAAI,IAAI,kBAAkB;AAEpF,aAAW,SAAS,UAAU,YAAY;AACxC,QAAI,MAAM,OAAO,YAAY,KAAK,MAAM,IAAI,MAAM,QAAW;AAC3D,cAAQ,IAAI,MAAM,MAAM,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC;AAAA,IAClD;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,KAAK,MAAM,MAAM,UAAa,UAAU,aAAa;AACvD,UAAM,cAAc,sBAAsB,SAAS;AACnD,YAAQ,IAAI,gBAAgB,WAAW;AAEvC,QAAI;AACF,aAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,IACpC,QAAQ;AACN,aAAO,CAAC,EAAE,MAAM,QAAiB,MAAM,sDAAsD,CAAC;AAAA,IAChG;AAAA,EACF;AAEA,MAAI,OAAoB;AAAA,IACtB,QAAQ,UAAU;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AAEA,MAAI,OAAO,MAAM;AACf,QAAI;AACF,aAAO,MAAM,OAAO,KAAK,MAAM,KAAK,IAAI;AAAA,IAC1C,SAAS,OAAO;AACd,YAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,aAAO,CAAC,EAAE,MAAM,QAAiB,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAAA,IAC1E;AAAA,EACF;AAEA,MAAI;AACF,UAAM,WAAW,MAAM,eAAe,IAAI,SAAS,GAAG,MAAM,OAAO,YAAY;AAC/E,UAAM,eAAe,QAAQ,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA;AAAA;AACnE,UAAM,UAAU,MAAM,eAAe,QAAQ;AAE7C,QAAI,QAAQ,SAAS,KAAK,QAAQ,CAAC,EAAE,SAAS,QAAQ;AACpD,cAAQ,CAAC,IAAI,EAAE,MAAM,QAAQ,MAAM,eAAe,QAAQ,CAAC,EAAE,KAAK;AAAA,IACpE;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,WAAO,CAAC,EAAE,MAAM,QAAiB,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAAA,EACnE;AACF;AAEA,SAAS,uBACP,WACA,MACU;AACV,QAAM,SAAmB,CAAC;AAE1B,aAAW,SAAS,UAAU,YAAY;AACxC,QAAI,MAAM,YAAY,KAAK,MAAM,IAAI,MAAM,QAAW;AACpD,aAAO,KAAK,sBAAsB,MAAM,EAAE,gBAAgB,MAAM,IAAI,GAAG;AAAA,IACzE;AAAA,EACF;AAEA,MAAI,UAAU,aAAa,YAAY,KAAK,MAAM,MAAM,QAAW;AACjE,WAAO,KAAK,iCAAiC;AAAA,EAC/C;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,WAAsC;AACnE,QAAM,QAAQ,oBAAI,IAAY;AAE9B,aAAW,QAAQ,OAAO,OAAO,UAAU,SAAS,GAAG;AACrD,QAAI,KAAK,SAAS;AAChB,iBAAW,aAAa,OAAO,KAAK,KAAK,OAAO,GAAG;AACjD,cAAM,IAAI,SAAS;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,KAAK;AACzB;AAEA,SAAS,sBAAsB,WAAoC;AACjE,MAAI,CAAC,UAAU,aAAa,QAAS,QAAO;AAE5C,QAAM,aAAa,OAAO,KAAK,UAAU,YAAY,OAAO;AAC5D,MAAI,WAAW,SAAS,kBAAkB,EAAG,QAAO;AAEpD,SAAO,WAAW,CAAC,KAAK;AAC1B;;;AClLA,SAAS,KAAAA,UAAS;;;ACDlB,SAAS,SAAS;AAIX,SAAS,qBAAqB,WAA0D;AAC7F,QAAM,QAAsC,CAAC;AAE7C,aAAW,SAAS,UAAU,YAAY;AACxC,QAAI,YAAY,aAAa,MAAM,MAAM;AACzC,gBAAY,UAAU,SAAS,sBAAsB,KAAK,CAAC;AAE3D,QAAI,CAAC,MAAM,YAAY,CAAC,WAAW,SAAS,GAAG;AAC7C,kBAAY,UAAU,SAAS;AAAA,IACjC;AACA,UAAM,MAAM,IAAI,IAAI;AAAA,EACtB;AAEA,MAAI,UAAU,aAAa;AACzB,UAAM,cACJ,UAAU,YAAY,QAAQ,kBAAkB,KAChD,UAAU,YAAY,QAAQ,OAAO,KAAK,UAAU,YAAY,OAAO,EAAE,CAAC,CAAC;AAE7E,QAAI,aAAa,QAAQ;AACvB,UAAI,aAAa,aAAa,YAAY,MAAM;AAChD,YAAM,YAAsB,CAAC;AAC7B,UAAI,UAAU,YAAY,YAAa,WAAU,KAAK,UAAU,YAAY,WAAW;AACvF,UAAI,YAAY,YAAY,QAAW;AACrC,kBAAU,KAAK,YAAY,gBAAgB,YAAY,OAAO,CAAC,EAAE;AAAA,MACnE;AACA,UAAI,UAAU,SAAS,GAAG;AACxB,qBAAa,WAAW,SAAS,UAAU,KAAK,KAAK,CAAC;AAAA,MACxD;AACA,UAAI,CAAC,UAAU,YAAY,UAAU;AACnC,qBAAa,WAAW,SAAS;AAAA,MACnC;AACA,YAAM,MAAM,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAgC;AAC7D,QAAM,QAAkB,CAAC;AACzB,MAAI,MAAM,YAAa,OAAM,KAAK,MAAM,WAAW;AACnD,MAAI,MAAM,WAAY,OAAM,KAAK,cAAc;AAC/C,MAAI,MAAM,OAAO,OAAQ,OAAM,KAAK,WAAW,MAAM,OAAO,MAAM,EAAE;AACpE,MAAI,MAAM,OAAO,QAAS,OAAM,KAAK,YAAY,MAAM,OAAO,OAAO,EAAE;AACvE,MAAI,MAAM,YAAY,OAAW,OAAM,KAAK,YAAY,gBAAgB,MAAM,OAAO,CAAC,EAAE;AACxF,SAAO,MAAM,KAAK,KAAK,KAAK,MAAM,OAAO,QAAQ;AACnD;AAEA,SAAS,gBAAgB,OAAgB,SAAS,KAAa;AAC7D,QAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;AACpE,MAAI,IAAI,UAAU,OAAQ,QAAO;AACjC,SAAO,IAAI,MAAM,GAAG,SAAS,CAAC,IAAI;AACpC;AAEA,SAAS,aAAa,QAA8C;AAElE,MAAI,WAAW,UAAU,OAAO,UAAU,QAAW;AACnD,WAAO,EAAE,QAAQ,OAAO,KAAkC;AAAA,EAC5D;AAEA,MAAI,OAAO,MAAM;AACf,WAAO,aAAa,YAAY,OAAO,IAAI,GAAG,MAAM;AAAA,EACtD;AAEA,MAAI,OAAO,SAAS,SAAS;AAC3B,UAAM,QAAQ,OAAO,QACjB,aAAa,OAAO,KAA+B,IACnD,EAAE,QAAQ;AACd,QAAI,MAAM,EAAE,MAAM,KAAK;AACvB,QAAI,OAAO,aAAa,OAAW,OAAM,IAAI,IAAI,OAAO,QAAQ;AAChE,QAAI,OAAO,aAAa,OAAW,OAAM,IAAI,IAAI,OAAO,QAAQ;AAChE,WAAO,aAAa,KAAK,MAAM;AAAA,EACjC;AAEA,MAAI,OAAO,SAAS,YAAY,OAAO,YAAY;AACjD,UAAM,WAAyC,CAAC;AAEhD,QAAI,OAAO,YAAY;AACrB,YAAM,cAAc,IAAI,IAAI,OAAO,YAAY,CAAC,CAAC;AAEjD,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AAC5D,cAAM,aAAa;AACnB,YAAI,UAAU,aAAa,UAAU;AACrC,YAAI,WAAW,aAAa;AAC1B,oBAAU,QAAQ,SAAS,WAAW,WAAW;AAAA,QACnD;AACA,YAAI,CAAC,YAAY,IAAI,GAAG,KAAK,CAAC,WAAW,OAAO,GAAG;AACjD,oBAAU,QAAQ,SAAS;AAAA,QAC7B;AACA,iBAAS,GAAG,IAAI;AAAA,MAClB;AAAA,IACF;AAEA,QAAI,OAAO,yBAAyB,QAAS,OAAO,wBAAwB,OAAO,OAAO,yBAAyB,WAAY;AAC7H,aAAO,aAAa,EAAE,OAAO,QAAQ,EAAE,YAAY,GAAG,MAAM;AAAA,IAC9D;AAEA,WAAO,aAAa,EAAE,OAAO,QAAQ,GAAG,MAAM;AAAA,EAChD;AAEA,MAAI,OAAO,OAAO;AAChB,UAAM,UAAW,OAAO,MAAmC,IAAI,YAAY;AAC3E,QAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC;AAC1C,QAAI,SAAS,QAAQ,CAAC;AACtB,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,eAAS,EAAE,aAAa,QAAQ,QAAQ,CAAC,CAAC;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,OAAO;AAChB,UAAM,UAAW,OAAO,MAAmC,IAAI,YAAY;AAC3E,QAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC;AAC1C,UAAM,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI;AACxB,WAAO,EAAE,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAChC;AAEA,MAAI,OAAO,OAAO;AAChB,UAAM,UAAW,OAAO,MAAmC,IAAI,YAAY;AAC3E,QAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC;AAC1C,UAAM,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI;AACxB,WAAO,EAAE,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAChC;AAEA,QAAM,OAAO,gBAAgB,MAAM;AACnC,SAAO,aAAa,MAAM,MAAM;AAClC;AAEA,SAAS,gBAAgB,QAA8C;AACrE,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,uBAAuB,EAAE,OAAO,GAAG,MAAM;AAAA,IAClD,KAAK;AAAA,IACL,KAAK;AACH,aAAO,uBAAuB,EAAE,OAAO,GAAG,MAAM;AAAA,IAClD,KAAK;AACH,aAAO,EAAE,QAAQ;AAAA,IACnB;AACE,aAAO,EAAE,QAAQ;AAAA,EACrB;AACF;AAEA,IAAM,wBAAyE;AAAA,EAC7E,OAAO,CAAC,MAAM,EAAE,MAAM;AAAA,EACtB,KAAK,CAAC,MAAM,EAAE,IAAI;AAAA,EAClB,MAAM,CAAC,MAAM,EAAE,KAAK;AAAA,EACpB,UAAU,CAAC,MAAM,EAAE,SAAS;AAAA,EAC5B,aAAa,CAAC,MAAM,EAAE,SAAS;AAAA,EAC/B,MAAM,CAAC,MAAM,EAAE,KAAK;AACtB;AAEA,SAAS,uBAAuB,MAAmB,QAA8C;AAC/F,MAAI,OAAO,cAAc,OAAW,QAAO,KAAK,IAAI,OAAO,SAAS;AACpE,MAAI,OAAO,cAAc,OAAW,QAAO,KAAK,IAAI,OAAO,SAAS;AAEpE,MAAI,OAAO,SAAS;AAClB,QAAI;AACF,YAAM,KAAK,IAAI,OAAO,OAAO,OAAO;AACpC,aAAO,KAAK,MAAM,EAAE;AAAA,IACtB,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ;AACjB,UAAM,WAAW,sBAAsB,OAAO,MAAM;AACpD,QAAI,UAAU;AACZ,aAAO,SAAS,IAAI;AAAA,IACtB;AAAA,EAEF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAmB,QAA8C;AAC/F,MAAI,OAAO,SAAS,UAAW,QAAO,KAAK,IAAI;AAE/C,MAAI,OAAO,YAAY,QAAW;AAEhC,QAAI,OAAO,OAAO,qBAAqB,aAAa,OAAO,kBAAkB;AAC3E,aAAO,KAAK,GAAG,OAAO,OAAO;AAAA,IAC/B,OAAO;AACL,aAAO,KAAK,IAAI,OAAO,OAAO;AAAA,IAChC;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,QAAW;AAChC,QAAI,OAAO,OAAO,qBAAqB,aAAa,OAAO,kBAAkB;AAC3E,aAAO,KAAK,GAAG,OAAO,OAAO;AAAA,IAC/B,OAAO;AACL,aAAO,KAAK,IAAI,OAAO,OAAO;AAAA,IAChC;AAAA,EACF;AAGA,MAAI,OAAO,OAAO,qBAAqB,UAAU;AAC/C,WAAO,KAAK,GAAG,OAAO,gBAAgB;AAAA,EACxC;AACA,MAAI,OAAO,OAAO,qBAAqB,UAAU;AAC/C,WAAO,KAAK,GAAG,OAAO,gBAAgB;AAAA,EACxC;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,SAAuB,QAA8C;AACzF,MAAI,OAAO,YAAY,QAAW;AAChC,WAAO,QAAQ,QAAQ,OAAO,OAAO;AAAA,EACvC;AACA,SAAO;AACT;AAEA,SAAS,WAAW,QAA+B;AACjD,SAAO,kBAAkB,EAAE;AAC7B;AAEA,SAAS,YAAY,QAAiC;AACpD,QAAM,aAAa,OAAO,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ;AAE5D,MAAI,cAAc,OAAO,UAAU,GAAG;AACpC,UAAM,CAAC,OAAO,QAAQ,GAAG,IAAI,IAAI;AACjC,WAAO,EAAE,KAAK,CAAC,OAAO,QAAQ,GAAG,IAAI,CAAC;AAAA,EACxC;AAEA,MAAI,cAAc,OAAO,WAAW,GAAG;AACrC,WAAO,EAAE,QAAQ,OAAO,CAAC,CAAW;AAAA,EACtC;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,EAAE,QAAQ,OAAO,CAAC,CAA8B;AAAA,EACzD;AAEA,QAAM,UAAU,OAAO,IAAI,CAAC,MAAM,EAAE,QAAQ,CAA8B,CAAC;AAC3E,MAAI,QAAQ,UAAU,GAAG;AACvB,UAAM,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI;AACxB,WAAO,EAAE,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;AAAA,EAChC;AAEA,SAAO,EAAE,QAAQ;AACnB;;;ACpPO,SAAS,iBAAiB,MAAsB;AACrD,SAAO,KACJ,QAAQ,mBAAmB,GAAG,EAC9B,QAAQ,OAAO,GAAG,EAClB,QAAQ,UAAU,EAAE,EACpB,MAAM,GAAG,EAAE;AAChB;AAEO,SAAS,oBAAoB,MAA0B,YAAY,KAAa;AACrF,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,KAAK,UAAU,UAAW,QAAO;AACrC,SAAO,KAAK,MAAM,GAAG,YAAY,CAAC,IAAI;AACxC;;;AFJO,SAAS,cAAc,QAAmB,MAAkB,YAAoC;AACrG,aAAW,aAAa,KAAK,YAAY;AACvC,UAAM,WAAW,iBAAiB,UAAU,WAAW;AACvD,UAAM,kBAAkB,UAAU,WAAW,UAAU,eAAe,IAAI,KAAK,EAAE,QAAQ,QAAQ,GAAG;AACpG,UAAM,SAAS,UAAU,aAAa,kBAAkB;AACxD,UAAM,cAAc,oBAAoB,GAAG,MAAM,GAAG,cAAc,EAAE,KAAK,GAAG,UAAU,MAAM,IAAI,UAAU,IAAI;AAC9G,UAAM,QAAQ,qBAAqB,SAAS;AAE5C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,SAAkC;AACvC,cAAM,UAAU,MAAM,iBAAiB,WAAW,MAAM,UAAU;AAClE,eAAO,EAAE,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,QAAQ,SAAS,GAAG;AAC3B,+BAA2B,QAAQ,MAAM,UAAU;AAAA,EACrD;AACF;AAEA,SAAS,2BAA2B,QAAmB,MAAkB,YAAoC;AAC3G,QAAM,QAAQ;AAAA,IACZ,cAAcC,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,IAChG,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0DAA0D;AAAA,IACrG,WAAWA,GAAE,OAAOA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,6DAA6D;AAAA,EACnH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,SAA6F;AAClG,YAAM,QAAkB,CAAC;AAEzB,UAAI,KAAK,YAAY;AACnB,mBAAW,UAAU,KAAK,WAAW,QAAQ,OAAO,EAAE;AACtD,cAAM,KAAK,yBAAyB,WAAW,OAAO,EAAE;AAAA,MAC1D,WAAW,KAAK,iBAAiB,QAAW;AAC1C,cAAMC,UAAS,KAAK,QAAQ,KAAK,YAAY;AAC7C,YAAI,CAACA,SAAQ;AACX,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,wBAAwB,KAAK,YAAY,kBAAkB,KAAK,QAAQ,SAAS,CAAC,GAAG,CAAC;AAAA,UACjI;AAAA,QACF;AACA,mBAAW,UAAU,iBAAiBA,SAAQ,KAAK,SAAS;AAC5D,cAAM,KAAK,yBAAyB,WAAW,OAAO,EAAE;AACxD,YAAIA,QAAO,YAAa,OAAM,KAAK,MAAMA,QAAO,WAAW,GAAG;AAAA,MAChE,WAAW,KAAK,WAAW;AAEzB,cAAM,UAAU,KAAK,QAAQ,KAAK,CAAC,MAAM;AACvC,cAAI;AAAE,mBAAO,iBAAiB,CAAC,MAAM,WAAW;AAAA,UAAQ,QAAQ;AAAE,mBAAO;AAAA,UAAM;AAAA,QACjF,CAAC;AACD,YAAI,SAAS;AACX,qBAAW,UAAU,iBAAiB,SAAS,KAAK,SAAS;AAC7D,gBAAM,KAAK,iCAAiC,WAAW,OAAO,EAAE;AAAA,QAClE,OAAO;AACL,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,mHAAmH,CAAC;AAAA,UAC/J;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,KAAK,0BAA0B,WAAW,OAAO,EAAE;AAAA,MAC3D;AAEA,YAAM,KAAK,IAAI,oBAAoB;AACnC,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;AAC5C,cAAM,IAAI,KAAK,QAAQ,CAAC;AACxB,cAAM,WAAW,cAAc,CAAC;AAChC,cAAM,SAAS,aAAa,WAAW,UAAU,cAAc;AAC/D,cAAM,OAAO,EAAE,cAAc,WAAM,EAAE,WAAW,KAAK;AACrD,cAAM,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,GAAG,MAAM,EAAE;AAE9C,YAAI,EAAE,WAAW;AACf,qBAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,EAAE,SAAS,GAAG;AACnD,kBAAM,UAAU,EAAE,OAAO,UAAU,EAAE,KAAK,KAAK,GAAG,CAAC,MAAM;AACzD,kBAAM,KAAK,WAAW,IAAI,eAAe,EAAE,OAAO,IAAI,OAAO,GAAG,EAAE,cAAc,WAAM,EAAE,WAAW,KAAK,EAAE,EAAE;AAAA,UAC9G;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,QAAkE;AACvF,MAAI;AACF,WAAO,iBAAiB,MAAM;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AGtGO,SAAS,kBAAkB,QAAmB,MAAwB;AAC3E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa,yBAAyB,KAAK,KAAK,KAAK,KAAK,OAAO;AAAA,MACjE,UAAU;AAAA,IACZ;AAAA,IACA,aAAa;AAAA,MACX,UAAU;AAAA,QACR;AAAA,UACE,KAAK;AAAA,UACL,UAAU;AAAA,UACV,MAAM,KAAK,UAAU,KAAK,KAAK,MAAM,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AACzD,UAAM,WAAW,mBAAmB,IAAI;AACxC,UAAM,MAAM,qBAAqB,QAAQ;AAEzC,WAAO;AAAA,MACL,UAAU,QAAQ;AAAA,MAClB;AAAA,MACA;AAAA,QACE,cAAc,OAAO,eAAe,WAAW,IAAI,IAAI,MAAM,GAAG,GAAG;AAAA,QACnE,UAAU;AAAA,MACZ;AAAA,MACA,aAAa;AAAA,QACX,UAAU;AAAA,UACR;AAAA,YACE;AAAA,YACA,UAAU;AAAA,YACV,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,QAAQ,SAAS,GAAG;AAC3B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,QACE,aAAa,0CAA0C,KAAK,KAAK;AAAA,QACjE,UAAU;AAAA,MACZ;AAAA,MACA,aAAa;AAAA,QACX,UAAU;AAAA,UACR;AAAA,YACE,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM,KAAK,UAAU,KAAK,SAAS,MAAM,CAAC;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC/DA,SAAS,KAAAC,UAAS;AAKX,SAAS,gBAAgB,QAAmB,MAAkB,YAAoC;AACvG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,YAAY;AACV,YAAM,YAAY,KAAK,WAAW,IAAI,CAAC,OAAO;AAC5C,cAAM,SAAS,GAAG,aAAa,kBAAkB;AACjD,eAAO,KAAK,MAAM,GAAG,GAAG,OAAO,OAAO,CAAC,CAAC,IAAI,GAAG,IAAI,MAAM,GAAG,WAAW,GAAG,WAAW;AAAA,MACvF,CAAC;AAED,YAAM,cAAc,OAAO,QAAQ,KAAK,eAAe,EACpD,IAAI,CAAC,CAAC,MAAM,MAAM,MAAM,KAAK,IAAI,KAAK,OAAO,IAAI,GAAI,YAAY,SAAU,KAAK,OAAO,MAAM,MAAM,EAAE,EAAE;AAE1G,YAAM,OAAO;AAAA,QACX,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO;AAAA,QAChC;AAAA,QACA,KAAK,eAAe;AAAA,QACpB;AAAA,QACA,qBAAqB,MAAM,UAAU;AAAA,QACrC;AAAA,QACA,0BAA0B,IAAI;AAAA,QAC9B;AAAA,QACA,iBAAiB,KAAK,WAAW,MAAM;AAAA,QACvC,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA,YAAY,SAAS,IAAI,YAAY,KAAK,IAAI,IAAI;AAAA,QAClD;AAAA,QACA;AAAA,QACA,OAAO,KAAK,KAAK,OAAO,EAAE,IAAI,CAAC,SAAS,OAAO,IAAI,EAAE,EAAE,KAAK,IAAI,KAAK;AAAA,QACrE;AAAA,QACA,kBAAkB,IAAI;AAAA,MACxB,EACG,OAAO,CAAC,SAAS,SAAS,UAAa,SAAS,EAAE,EAClD,KAAK,IAAI;AAEZ,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS,EAAE,MAAM,QAAiB,KAAK;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,aAAaC,GAAE,OAAO,EAAE,SAAS,4CAA4C,EAAE;AAAA,IACjF,OAAO,EAAE,YAAY,MAAM;AACzB,YAAM,YAAY,KAAK,WAAW,KAAK,CAAC,OAAO,GAAG,gBAAgB,WAAW;AAE7E,UAAI,CAAC,WAAW;AACd,cAAM,YAAY,KAAK,WAAW,IAAI,CAAC,OAAO,GAAG,WAAW,EAAE,KAAK,IAAI;AACvE,eAAO;AAAA,UACL,UAAU;AAAA,YACR;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,MAAM,cAAc,WAAW,sCAAsC,SAAS;AAAA,cAChF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,OAAO,oBAAoB,WAAW,KAAK,IAAI;AAErD,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS,EAAE,MAAM,QAAiB,KAAK;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,MAAkB,YAAsC;AACpF,MAAI,KAAK,QAAQ,WAAW,EAAG,QAAO;AAEtC,QAAM,QAAQ,CAAC,YAAY;AAC3B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;AAC5C,UAAM,IAAI,KAAK,QAAQ,CAAC;AACxB,QAAI,WAA0B;AAC9B,QAAI;AAAE,iBAAW,iBAAiB,CAAC;AAAA,IAAE,QAAQ;AAAA,IAAa;AAC1D,UAAM,SAAS,aAAa,WAAW,UAAU,cAAc;AAC/D,UAAM,OAAO,EAAE,cAAc,WAAM,EAAE,WAAW,KAAK;AACrD,UAAM,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE;AAE9C,QAAI,EAAE,WAAW;AACf,iBAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,EAAE,SAAS,GAAG;AACnD,cAAM,UAAU,EAAE,OAAO,KAAK,EAAE,KAAK,KAAK,GAAG,CAAC,MAAM;AACpD,cAAM,KAAK,WAAW,IAAI,eAAe,EAAE,OAAO,IAAI,OAAO,GAAG,EAAE,cAAc,WAAM,EAAE,WAAW,KAAK,EAAE,EAAE;AAAA,MAC9G;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,QAAQ,SAAS,GAAG;AAC3B,UAAM,KAAK,IAAI,qDAAqD;AAAA,EACtE;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,kBAAkB,MAA0B;AACnD,MAAI,KAAK,KAAK,WAAW,EAAG,QAAO;AAEnC,QAAM,QAAQ,CAAC,SAAS;AACxB,aAAW,OAAO,KAAK,MAAM;AAC3B,QAAI,OAAO,SAAS,IAAI,IAAI;AAC5B,QAAI,IAAI,YAAa,SAAQ,KAAK,IAAI,WAAW;AACjD,QAAI,IAAI,aAAc,SAAQ,WAAW,IAAI,aAAa,GAAG;AAC7D,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,0BAA0B,MAA0B;AAC3D,MAAI,CAAC,KAAK,aAAc,QAAO;AAC/B,QAAM,OAAO,KAAK,aAAa,cAAc,GAAG,KAAK,aAAa,WAAW,OAAO;AACpF,SAAO;AAAA,IAAgC,IAAI,GAAG,KAAK,aAAa,GAAG;AACrE;AAEA,SAAS,oBAAoB,WAA4B,YAAiC;AACxF,QAAM,gBAAgB,UAAU,aAAa,kBAAkB;AAE/D,QAAM,SAAS,UAAU,WAAW,IAAI,CAAC,MAAM;AAC7C,UAAM,QAAQ;AAAA,MACZ,OAAO,EAAE,IAAI,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,aAAa,UAAU;AAAA,IACjE;AACA,QAAI,EAAE,WAAY,OAAM,CAAC,KAAK;AAC9B,UAAM,CAAC,KAAK,KAAK,EAAE,eAAe,EAAE,OAAO,QAAQ,KAAK;AACxD,QAAI,EAAE,OAAO,OAAQ,OAAM,CAAC,KAAK,aAAa,EAAE,OAAO,MAAM;AAC7D,QAAI,EAAE,YAAY,OAAW,OAAM,CAAC,KAAK,oBAAe,cAAc,EAAE,OAAO,CAAC;AAChF,WAAO,MAAM,CAAC;AAAA,EAChB,CAAC;AAED,QAAM,YAAY,gBAAgB,UAAU,SAAS;AACrD,QAAM,QAAQ,YAAY,UAAU,SAAS;AAE7C,QAAM,WAAW;AAAA,IACf,KAAK,UAAU,MAAM,IAAI,UAAU,IAAI,GAAG,aAAa;AAAA,IACvD,gBAAgB,UAAU,WAAW;AAAA,IACrC;AAAA,IACA,UAAU,UAAU,gBAAgB,UAAU,OAAO,KAAK;AAAA,IAC1D,UAAU,cAAc,oBAAoB,UAAU,WAAW,KAAK;AAAA,IACtE;AAAA,IACA;AAAA,IACA,OAAO,SAAS,IAAI,OAAO,KAAK,IAAI,IAAI;AAAA,IACxC;AAAA,IACA,kBAAkB,SAAS;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,GAAG;AACpB,aAAS,KAAK,YAAY,GAAG,OAAO,EAAE;AAAA,EACxC;AAEA,WAAS;AAAA,IACP;AAAA,IACA,UAAU,SAAS,SAAS,IACxB,UAAU,SAAS,IAAI,CAAC,MAAM,KAAK,OAAO,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,IACzE;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,UAAU,KAAK,SAAS,GAAG;AAC7B,UAAM,WAAW,CAAC,SAAS;AAC3B,eAAW,WAAW,UAAU,MAAM;AACpC,YAAM,YAAY,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AAC3D,UAAI,OAAO,SAAS,OAAO;AAC3B,UAAI,WAAW,YAAa,SAAQ,KAAK,UAAU,WAAW;AAC9D,UAAI,WAAW,aAAc,SAAQ,WAAW,UAAU,aAAa,GAAG;AAC1E,eAAS,KAAK,IAAI;AAAA,IACpB;AACA,aAAS,KAAK,SAAS,KAAK,IAAI,CAAC;AAAA,EACnC;AAEA,MAAI,UAAU,cAAc;AAC1B,UAAM,OAAO,UAAU,aAAa,cAAc,GAAG,UAAU,aAAa,WAAW,OAAO;AAC9F,aAAS,KAAK,IAAI,6BAA6B,KAAK,IAAI,GAAG,UAAU,aAAa,GAAG,EAAE;AAAA,EACzF;AAEA,SAAO,SACJ,OAAO,CAAC,SAAS,SAAS,MAAS,EACnC,KAAK,IAAI;AACd;AAEA,SAAS,kBAAkB,WAAoC;AAC7D,MAAI,CAAC,UAAU,YAAa,QAAO;AAEnC,QAAM,QAAQ;AAAA,IACZ,mBAAmB,UAAU,YAAY,WAAW,eAAe,YAAY;AAAA,IAC/E,UAAU,YAAY,eAAe;AAAA,IACrC;AAAA,IACA;AAAA,MACE,OAAO,OAAO,UAAU,YAAY,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC;AAAA,MAC5D;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAEA,QAAM,cAAc,UAAU,YAAY,QAAQ,kBAAkB,KAClE,OAAO,OAAO,UAAU,YAAY,OAAO,EAAE,CAAC;AAEhD,MAAI,aAAa,YAAY,QAAW;AACtC,UAAM,KAAK,IAAI,gBAAgB,WAAW,cAAc,YAAY,SAAS,MAAM,CAAC,GAAG,KAAK;AAAA,EAC9F;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,gBAAgB,WAAqD;AAC5E,QAAM,QAAkB,CAAC;AAEzB,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,SAAS,GAAG;AACpD,UAAM,KAAK,KAAK,IAAI,KAAK,KAAK,eAAe,kBAAkB,EAAE;AAEjE,QAAI,KAAK,QAAQ;AACf,YAAM,KAAK,aAAa,KAAK,cAAc,KAAK,QAAQ,MAAM,CAAC,EAAE,MAAM,IAAI,EAAE,KAAK,MAAM,CAAC,IAAI,OAAO;AAAA,IACtG;AAEA,QAAI,KAAK,YAAY,QAAW;AAC9B,YAAM,KAAK,YAAY;AACvB,YAAM,KAAK,aAAa,KAAK,cAAc,KAAK,SAAS,MAAM,CAAC,EAAE,MAAM,IAAI,EAAE,KAAK,MAAM,CAAC,IAAI,OAAO;AAAA,IACvG;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,WAAqD;AACxE,QAAM,QAAkB,CAAC;AAEzB,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,SAAS,GAAG;AACpD,QAAI,CAAC,KAAK,MAAO;AACjB,eAAW,CAAC,EAAE,IAAI,KAAK,OAAO,QAAQ,KAAK,KAAK,GAAG;AACjD,YAAM,SAAS,KAAK,eAAe,KAAK,gBAAgB;AACxD,YAAM,SAAS,KAAK,aAChB,OAAO,QAAQ,KAAK,UAAU,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,IACtE;AACJ,YAAM,OAAO,KAAK,cAAc,WAAM,KAAK,WAAW,KAAK;AAC3D,YAAM,KAAK,WAAW,IAAI,qBAAqB,MAAM,KAAK,SAAS,UAAU,MAAM,MAAM,EAAE,GAAG,IAAI,EAAE;AAAA,IACtG;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAwB;AAC7C,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,cAAc,KAAK;AAC5B;AAEA,SAAS,cAAc,OAAgB,WAAqB,QAAyB;AACnF,MAAI;AACF,WAAO,KAAK,UAAU,OAAO,MAAM,MAAM;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AZtPA,eAAsB,iBAAiB,SAAiD;AACtF,QAAM,MAAM,MAAM,SAAS,QAAQ,MAAM;AACzC,QAAM,OAAO,MAAM,YAAY,GAAG;AAElC,QAAM,aAAa,QAAQ,QAAQ,KAAK,SAAS;AACjD,QAAM,gBAAgB,QAAQ,WAAW,KAAK,WAAW;AAEzD,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAED,QAAM,OAAO,YAAY,QAAQ,MAAM,KAAK,eAAe;AAC3D,QAAM,UAAU,eAAe,MAAM,QAAQ,SAAS,QAAQ,WAAW;AAEzE,QAAM,aAA+B;AAAA,IACnC;AAAA,IACA;AAAA,IACA,gBAAgB,QAAQ;AAAA,IACxB,cAAc,QAAQ;AAAA,EACxB;AAEA,gBAAc,QAAQ,MAAM,UAAU;AACtC,oBAAkB,QAAQ,IAAI;AAC9B,kBAAgB,QAAQ,MAAM,UAAU;AAExC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,QAAQ;AACZ,YAAM,YAAY,IAAI,qBAAqB;AAC3C,YAAM,OAAO,QAAQ,SAAS;AAAA,IAChC;AAAA,EACF;AACF;;;AazDA,SAAS,UAAU,MAAyB;AAC1C,QAAM,OAAgB,CAAC;AAEvB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,UAAM,OAAO,KAAK,IAAI,CAAC;AAEvB,SAAK,QAAQ,QAAQ,QAAQ,eAAe,MAAM;AAChD,WAAK,SAAS;AACd;AAAA,IACF,YAAY,QAAQ,QAAQ,QAAQ,iBAAiB,MAAM;AACzD,WAAK,UAAU;AACf;AAAA,IACF,WAAY,QAAQ,oBAAqB,MAAM;AAC7C,YAAM,SAAS,SAAS,MAAM,EAAE;AAChC,UAAI,MAAM,MAAM,KAAK,SAAS,GAAG;AAC/B,gBAAQ,MAAM,8DAA8D,IAAI,GAAG;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,WAAK,cAAc;AACnB;AAAA,IACF,WAAW,QAAQ,QAAQ,QAAQ,UAAU;AAC3C,gBAAU;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB,WAAW,CAAC,IAAI,WAAW,GAAG,KAAK,CAAC,KAAK,QAAQ;AAC/C,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAkB;AACzB,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAwBb;AACD;AAEA,eAAe,OAAsB;AACnC,QAAM,OAAO,UAAU,QAAQ,IAAI;AAEnC,QAAM,SAAS,KAAK,UAAU,QAAQ,IAAI,gBAAgB,KAAK,QAAQ,IAAI,qBAAqB;AAEhG,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,qCAAqC;AACnD,YAAQ,MAAM,+DAA+D;AAC7E,YAAQ,MAAM,uDAAuD;AACrE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,KAAK,WAAW,QAAQ,IAAI,kBAAkB;AAE9D,MAAI,cAAc,KAAK;AACvB,MAAI,gBAAgB,UAAa,QAAQ,IAAI,sBAAsB,GAAG;AACpE,UAAM,SAAS,SAAS,QAAQ,IAAI,sBAAsB,GAAG,EAAE;AAC/D,QAAI,CAAC,MAAM,MAAM,KAAK,UAAU,GAAG;AACjC,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI;AACF,UAAM,MAAM,MAAM,iBAAiB;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,UAAU,IAAI,KAAK,WAAW;AACpC,UAAM,cAAc,OAAO,KAAK,IAAI,KAAK,OAAO,EAAE;AAClD,YAAQ,OAAO;AAAA,MACb,gCAAgC,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,OAAO,WAAM,OAAO,WAAW,WAAW;AAAA;AAAA,IACzG;AAEA,UAAM,IAAI,MAAM;AAAA,EAClB,SAAS,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,cAAQ,OAAO,MAAM,wBAAwB,MAAM,OAAO;AAAA,CAAI;AAC9D,UAAI,MAAM,OAAO;AACf,gBAAQ,OAAO,MAAM,GAAG,MAAM,KAAK;AAAA,CAAI;AAAA,MACzC;AAAA,IACF,OAAO;AACL,cAAQ,OAAO,MAAM,wBAAwB,OAAO,KAAK,CAAC;AAAA,CAAI;AAAA,IAChE;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,KAAK;","names":["z","z","server","z","z"]}
@@ -0,0 +1,134 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { OpenAPIV3 } from 'openapi-types';
3
+
4
+ interface AuthConfig {
5
+ bearerToken?: string;
6
+ apiKey?: string;
7
+ basicAuth?: {
8
+ username: string;
9
+ password: string;
10
+ };
11
+ oauth2?: {
12
+ clientId: string;
13
+ clientSecret: string;
14
+ tokenUrl: string;
15
+ scopes?: string[];
16
+ };
17
+ custom?: (url: string, init: RequestInit) => RequestInit | Promise<RequestInit>;
18
+ }
19
+
20
+ interface ParsedServerVariable {
21
+ enum?: string[];
22
+ default: string;
23
+ description?: string;
24
+ }
25
+ interface ParsedServer {
26
+ url: string;
27
+ description?: string;
28
+ variables?: Record<string, ParsedServerVariable>;
29
+ }
30
+ interface ParsedTag {
31
+ name: string;
32
+ description?: string;
33
+ externalDocs?: {
34
+ url: string;
35
+ description?: string;
36
+ };
37
+ }
38
+ interface ExternalDocs {
39
+ url: string;
40
+ description?: string;
41
+ }
42
+ interface ParsedExample {
43
+ summary?: string;
44
+ description?: string;
45
+ value?: unknown;
46
+ }
47
+ interface ParsedLink {
48
+ operationId?: string;
49
+ operationRef?: string;
50
+ parameters?: Record<string, string>;
51
+ description?: string;
52
+ }
53
+ interface ParsedResponse {
54
+ description: string;
55
+ content?: Record<string, {
56
+ schema?: OpenAPIV3.SchemaObject;
57
+ }>;
58
+ schema?: OpenAPIV3.SchemaObject;
59
+ mediaType?: string;
60
+ example?: unknown;
61
+ examples?: Record<string, ParsedExample>;
62
+ links?: Record<string, ParsedLink>;
63
+ }
64
+ interface ParsedOperation {
65
+ operationId: string;
66
+ method: string;
67
+ path: string;
68
+ summary?: string;
69
+ description?: string;
70
+ deprecated?: boolean;
71
+ parameters: ParsedParameter[];
72
+ requestBody?: ParsedRequestBody;
73
+ responses: Record<string, ParsedResponse>;
74
+ security: OpenAPIV3.SecurityRequirementObject[];
75
+ tags: string[];
76
+ externalDocs?: ExternalDocs;
77
+ }
78
+ interface ParsedParameter {
79
+ name: string;
80
+ in: 'path' | 'query' | 'header' | 'cookie';
81
+ required: boolean;
82
+ description?: string;
83
+ schema: OpenAPIV3.SchemaObject;
84
+ example?: unknown;
85
+ examples?: Record<string, ParsedExample>;
86
+ deprecated?: boolean;
87
+ }
88
+ interface ParsedRequestBody {
89
+ required: boolean;
90
+ description?: string;
91
+ content: Record<string, {
92
+ schema: OpenAPIV3.SchemaObject;
93
+ example?: unknown;
94
+ examples?: Record<string, ParsedExample>;
95
+ }>;
96
+ }
97
+ interface ParsedSpec {
98
+ title: string;
99
+ version: string;
100
+ description?: string;
101
+ servers: ParsedServer[];
102
+ operations: ParsedOperation[];
103
+ schemas: Record<string, OpenAPIV3.SchemaObject>;
104
+ securitySchemes: Record<string, OpenAPIV3.SecuritySchemeObject>;
105
+ tags: ParsedTag[];
106
+ externalDocs?: ExternalDocs;
107
+ raw: OpenAPIV3.Document;
108
+ }
109
+
110
+ interface FetchWithRetryOptions {
111
+ timeout?: number;
112
+ retries?: number;
113
+ retryDelay?: number;
114
+ retryOn?: number[];
115
+ }
116
+
117
+ interface OpenApiMcpOptions {
118
+ source: string | OpenAPIV3.Document;
119
+ name?: string;
120
+ version?: string;
121
+ baseUrl?: string;
122
+ serverIndex?: number;
123
+ auth?: AuthConfig;
124
+ headers?: Record<string, string>;
125
+ fetchOptions?: FetchWithRetryOptions;
126
+ }
127
+ interface OpenApiMcp {
128
+ server: McpServer;
129
+ spec: ParsedSpec;
130
+ serve(): Promise<void>;
131
+ }
132
+ declare function createOpenApiMcp(options: OpenApiMcpOptions): Promise<OpenApiMcp>;
133
+
134
+ export { type AuthConfig, type ExternalDocs, type FetchWithRetryOptions, type OpenApiMcp, type OpenApiMcpOptions, type ParsedOperation, type ParsedServer, type ParsedServerVariable, type ParsedSpec, type ParsedTag, createOpenApiMcp };