diff --git a/apps/sim/lib/api/contracts/mcp.ts b/apps/sim/lib/api/contracts/mcp.ts index 1c0159e9ec2..b41cff74d95 100644 --- a/apps/sim/lib/api/contracts/mcp.ts +++ b/apps/sim/lib/api/contracts/mcp.ts @@ -38,9 +38,14 @@ export const mcpTransportSchema = z.enum(['streamable-http']) export const mcpAuthTypeSchema = z.enum(['none', 'headers', 'oauth']) +const consecutiveFailuresSchema = z.preprocess( + (value) => (typeof value === 'number' ? value : undefined), + z.number().default(0) +) + export const mcpServerStatusConfigSchema = z .object({ - consecutiveFailures: z.number().default(0), + consecutiveFailures: consecutiveFailuresSchema, lastSuccessfulDiscovery: z.string().nullable().default(null), }) .passthrough() diff --git a/apps/sim/lib/mcp/service.ts b/apps/sim/lib/mcp/service.ts index 12c30e7c8c3..7e97d3fc2de 100644 --- a/apps/sim/lib/mcp/service.ts +++ b/apps/sim/lib/mcp/service.ts @@ -328,11 +328,14 @@ class McpService { ) .limit(1) - const currentConfig: McpServerStatusConfig = - (currentServer?.statusConfig as McpServerStatusConfig | null) ?? { - consecutiveFailures: 0, - lastSuccessfulDiscovery: null, - } + const storedConfig = currentServer?.statusConfig as Partial | null + const currentConfig: McpServerStatusConfig = { + consecutiveFailures: + typeof storedConfig?.consecutiveFailures === 'number' + ? storedConfig.consecutiveFailures + : 0, + lastSuccessfulDiscovery: storedConfig?.lastSuccessfulDiscovery ?? null, + } const now = new Date()