{"record":{"id":"c822f4a99ba28d5e","repo":"langflow-ai/langflow","slug":"no-supported-files-found-in-folder-allowed-types","errorCode":null,"errorMessage":"No supported files found in folder. Allowed types: ${types?.join(\", \")}","messagePattern":"No supported files found in folder\\. Allowed types: (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"src/frontend/src/hooks/files/use-upload-file.ts","lineNumber":54,"sourceCode":"  const uploadFile = async ({\n    files,\n  }: {\n    files?: File[];\n  }): Promise<string[]> => {\n    try {\n      const filesToUpload = await getFilesToUpload({ files });\n      const filesIds: string[] = [];\n\n      // Filter files by supported types when using folder selection\n      let validFiles = filesToUpload;\n      if (webkitdirectory && types) {\n        validFiles = filesToUpload.filter((file) => {\n          const fileExtension = file.name.split(\".\").pop()?.toLowerCase();\n          return fileExtension && types.includes(fileExtension);\n        });\n\n        if (validFiles.length === 0) {\n          throw new Error(\n            `No supported files found in folder. Allowed types: ${types?.join(\", \")}`,\n          );\n        }\n      }\n\n      for (const file of validFiles) {\n        validateFileSize(file);\n        // Check if file extension is allowed (for non-folder selection)\n        if (!webkitdirectory) {\n          const fileExtension = file.name.split(\".\").pop()?.toLowerCase();\n          if (!fileExtension || (types && !types.includes(fileExtension))) {\n            throw new Error(\n              `File type ${fileExtension} not allowed. Allowed types: ${types?.join(\", \")}`,\n            );\n          }\n          if (!multiple && filesToUpload.length !== 1) {\n            throw new Error(\"Multiple files are not allowed\");\n          }","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/langflow-ai/langflow/blob/976ec789d2886a86de109c044d089d68e96c9a35/src/frontend/src/hooks/files/use-upload-file.ts#L36-L72","documentation":"400 produced when get_config_path(client) raises ValueError — the client name is not one of cursor/windsurf/claude, or the OS is unsupported for that client (e.g. Claude config on a non-Windows, non-macOS, non-WSL system). The ValueError's text (raised in the path-resolution helper) is passed through as the detail.","triggerScenarios":"POST /{project_id}/install with body.client='vscode' or 'cline'; or client='claude' on plain Linux where no Claude Desktop config path is defined ('Unsupported operating system for Claude configuration').","commonSituations":"Asking to install into a client Langflow does not support; using the Claude Desktop flow on a bare Linux box (Claude Desktop has no Linux build).","solutions":["Use one of the supported client values: 'cursor', 'windsurf', or 'claude'.","On plain Linux, install into Cursor/Windsurf instead of Claude, or copy the MCP JSON manually to whatever client you use.","Check the response detail — it echoes the ValueError explaining exactly which condition failed."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"SUPPORTED_CLIENTS = {\"cursor\", \"windsurf\", \"claude\"}\nif body[\"client\"].lower() not in SUPPORTED_CLIENTS:\n    raise ValueError(f\"unsupported client; choose from {SUPPORTED_CLIENTS}\")","typeGuard":"def is_supported_mcp_client(name: str) -> bool:\n    return name.lower() in {\"cursor\", \"windsurf\", \"claude\"}","tryCatchPattern":null,"preventionTips":["Restrict UI/client choices to cursor, windsurf, claude.","On plain Linux, don't offer the 'claude' target — there is no Claude Desktop config path."],"tags":["mcp","install","http-400","client-support"],"backgroundTag":null,"analyzedSha":"976ec789d2886a86de109c044d089d68e96c9a35","analyzedAt":"2026-08-14T18:23:12.227Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}