From 697e94e935afde9899c7095e47fec88abaf820ee Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Tue, 30 Dec 2025 15:02:56 +0100 Subject: [PATCH] fix: prevent crash when invalid OpenAPI spec is loaded for tool servers (#20257) * enh * fix --- src/lib/apis/index.ts | 9 ++++++++- src/lib/utils/index.ts | 19 ++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/lib/apis/index.ts b/src/lib/apis/index.ts index f37f525793..6b5e67e47b 100644 --- a/src/lib/apis/index.ts +++ b/src/lib/apis/index.ts @@ -379,6 +379,13 @@ export const getToolServersData = async (servers: object[]) => { } if (res) { + if (!res.paths) { + return { + error: 'Invalid OpenAPI spec', + url: server?.url + }; + } + const { openapi, info, specs } = { openapi: res, info: res.info, @@ -1667,7 +1674,7 @@ export interface ModelMeta { profile_image_url?: string; } -export interface ModelParams {} +export interface ModelParams { } export type GlobalModelConfig = ModelConfig[]; diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 16d2fd1079..1e148972c3 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -357,9 +357,9 @@ export const generateInitialsImage = (name) => { const initials = sanitizedName.length > 0 ? sanitizedName[0] + - (sanitizedName.split(' ').length > 1 - ? sanitizedName[sanitizedName.lastIndexOf(' ') + 1] - : '') + (sanitizedName.split(' ').length > 1 + ? sanitizedName[sanitizedName.lastIndexOf(' ') + 1] + : '') : ''; ctx.fillText(initials.toUpperCase(), canvas.width / 2, canvas.height / 2); @@ -515,10 +515,10 @@ export const compareVersion = (latest, current) => { return current === '0.0.0' ? false : current.localeCompare(latest, undefined, { - numeric: true, - sensitivity: 'case', - caseFirst: 'upper' - }) < 0; + numeric: true, + sensitivity: 'case', + caseFirst: 'upper' + }) < 0; }; export const extractCurlyBraceWords = (text) => { @@ -1249,6 +1249,11 @@ function resolveSchema(schemaRef, components, resolvedSchemas = new Set()) { export const convertOpenApiToToolPayload = (openApiSpec) => { const toolPayload = []; + // Guard against invalid or non-OpenAPI specs (e.g., MCP-style configs) + if (!openApiSpec || !openApiSpec.paths) { + return toolPayload; + } + for (const [path, methods] of Object.entries(openApiSpec.paths)) { for (const [method, operation] of Object.entries(methods)) { if (operation?.operationId) {