From bb39cb1e99f6e1983e81a2813f27bf786fbf51f8 Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Tue, 16 Sep 2025 17:20:14 +0700 Subject: [PATCH 1/3] fix/mcp-json-validation --- .../src/containers/dialogs/AddEditMCPServer.tsx | 15 +++++++++++++-- web-app/src/locales/en/mcp-servers.json | 6 ++++++ web-app/src/locales/zh-CN/mcp-servers.json | 6 ++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/web-app/src/containers/dialogs/AddEditMCPServer.tsx b/web-app/src/containers/dialogs/AddEditMCPServer.tsx index 3eea75d32..21d90ec2c 100644 --- a/web-app/src/containers/dialogs/AddEditMCPServer.tsx +++ b/web-app/src/containers/dialogs/AddEditMCPServer.tsx @@ -285,9 +285,20 @@ export default function AddEditMCPServer({ setError(t('mcp-servers:editJson.errorFormat')) return } - // For each server in the JSON, call onSave + // Check if this looks like a server config object instead of the expected format + if (parsedData.command || parsedData.url) { + setError(t('mcp-servers:editJson.errorMissingServerNameKey')) + return + } + + // For each server in the JSON, validate serverName and call onSave Object.entries(parsedData).forEach(([serverName, config]) => { - onSave(serverName.trim(), config as MCPServerConfig) + const trimmedServerName = serverName.trim() + if (!trimmedServerName) { + setError(t('mcp-servers:editJson.errorServerName')) + return + } + onSave(trimmedServerName, config as MCPServerConfig) }) onOpenChange(false) resetForm() diff --git a/web-app/src/locales/en/mcp-servers.json b/web-app/src/locales/en/mcp-servers.json index 4c76d6f0d..6b8170097 100644 --- a/web-app/src/locales/en/mcp-servers.json +++ b/web-app/src/locales/en/mcp-servers.json @@ -26,6 +26,12 @@ "errorParse": "Failed to parse initial data", "errorPaste": "Invalid JSON format in pasted content", "errorFormat": "Invalid JSON format", + "errorServerName": "Server name is required and cannot be empty", + "errorMissingServerNameKey": "JSON must be structured as {\"serverName\": {config}} - missing server name key", + "errorServerConfig": "Invalid server configuration for '{{serverName}}'", + "errorMissingCommand": "Missing required 'command' field for server '{{serverName}}'", + "errorMissingUrl": "Missing required 'url' field for server '{{serverName}}'", + "errorInvalidType": "Invalid transport type for server '{{serverName}}'. Must be 'stdio', 'http', or 'sse'", "save": "Save" }, "checkParams": "Please check the parameters according to the tutorial.", diff --git a/web-app/src/locales/zh-CN/mcp-servers.json b/web-app/src/locales/zh-CN/mcp-servers.json index 17d64af77..371ffaff6 100644 --- a/web-app/src/locales/zh-CN/mcp-servers.json +++ b/web-app/src/locales/zh-CN/mcp-servers.json @@ -26,6 +26,12 @@ "errorParse": "解析初始数据失败", "errorPaste": "粘贴内容中的 JSON 格式无效", "errorFormat": "JSON 格式无效", + "errorServerName": "服务器名称为必填项,不能为空", + "errorMissingServerNameKey": "JSON 必须按 {\"serverName\": {config}} 格式结构化 - 缺少服务器名称键", + "errorServerConfig": "服务器 '{{serverName}}' 的配置无效", + "errorMissingCommand": "服务器 '{{serverName}}' 缺少必需的 'command' 字段", + "errorMissingUrl": "服务器 '{{serverName}}' 缺少必需的 'url' 字段", + "errorInvalidType": "服务器 '{{serverName}}' 的传输类型无效。必须为 'stdio'、'http' 或 'sse'", "save": "保存" }, "checkParams": "请根据教程检查参数。", From 703b44558c8880b5c9ce570163a681821c8c21cc Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Tue, 16 Sep 2025 17:24:32 +0700 Subject: [PATCH 2/3] chore: update locale mcp json --- web-app/src/locales/de-DE/mcp-servers.json | 2 ++ web-app/src/locales/en/mcp-servers.json | 4 ---- web-app/src/locales/id/mcp-servers.json | 2 ++ web-app/src/locales/pl/mcp-servers.json | 2 ++ web-app/src/locales/vn/mcp-servers.json | 2 ++ web-app/src/locales/zh-CN/mcp-servers.json | 4 ---- web-app/src/locales/zh-TW/mcp-servers.json | 2 ++ 7 files changed, 10 insertions(+), 8 deletions(-) diff --git a/web-app/src/locales/de-DE/mcp-servers.json b/web-app/src/locales/de-DE/mcp-servers.json index 45feffac5..e38c20d3b 100644 --- a/web-app/src/locales/de-DE/mcp-servers.json +++ b/web-app/src/locales/de-DE/mcp-servers.json @@ -26,6 +26,8 @@ "errorParse": "Fehler beim Parsen der initialen Daten", "errorPaste": "Ungültiges JSON Format in dem eingefügten Inhalt", "errorFormat": "Ungültiges JSON Format", + "errorServerName": "Servername ist erforderlich und darf nicht leer sein", + "errorMissingServerNameKey": "JSON muss als {\"serverName\": {config}} strukturiert sein - fehlender Servername-Schlüssel", "save": "Speichern" }, "checkParams": "Bitte überprüfe die Parameter gemäß dem Tutorial.", diff --git a/web-app/src/locales/en/mcp-servers.json b/web-app/src/locales/en/mcp-servers.json index 6b8170097..a6bc5c2d8 100644 --- a/web-app/src/locales/en/mcp-servers.json +++ b/web-app/src/locales/en/mcp-servers.json @@ -28,10 +28,6 @@ "errorFormat": "Invalid JSON format", "errorServerName": "Server name is required and cannot be empty", "errorMissingServerNameKey": "JSON must be structured as {\"serverName\": {config}} - missing server name key", - "errorServerConfig": "Invalid server configuration for '{{serverName}}'", - "errorMissingCommand": "Missing required 'command' field for server '{{serverName}}'", - "errorMissingUrl": "Missing required 'url' field for server '{{serverName}}'", - "errorInvalidType": "Invalid transport type for server '{{serverName}}'. Must be 'stdio', 'http', or 'sse'", "save": "Save" }, "checkParams": "Please check the parameters according to the tutorial.", diff --git a/web-app/src/locales/id/mcp-servers.json b/web-app/src/locales/id/mcp-servers.json index 54fb87ba9..c4f041d1b 100644 --- a/web-app/src/locales/id/mcp-servers.json +++ b/web-app/src/locales/id/mcp-servers.json @@ -26,6 +26,8 @@ "errorParse": "Gagal mengurai data awal", "errorPaste": "Format JSON tidak valid pada konten yang ditempel", "errorFormat": "Format JSON tidak valid", + "errorServerName": "Nama server wajib diisi dan tidak boleh kosong", + "errorMissingServerNameKey": "JSON harus berstruktur sebagai {\"serverName\": {config}} - kunci nama server hilang", "save": "Simpan" }, "checkParams": "Silakan periksa parameter sesuai dengan tutorial.", diff --git a/web-app/src/locales/pl/mcp-servers.json b/web-app/src/locales/pl/mcp-servers.json index 34588fa3a..c95ab9dd4 100644 --- a/web-app/src/locales/pl/mcp-servers.json +++ b/web-app/src/locales/pl/mcp-servers.json @@ -26,6 +26,8 @@ "errorParse": "Błąd parsowania wstępnych danych", "errorPaste": "Wprowadzono JSON o niepoprawnym formacie", "errorFormat": "Niepoprawny format JSON", + "errorServerName": "Nazwa serwera jest wymagana i nie może być pusta", + "errorMissingServerNameKey": "JSON musi być w formacie {\"serverName\": {config}} - brakuje klucza nazwy serwera", "save": "Zapisz" }, "checkParams": "Proszę sprawdzić parametry we wprowadzeniu.", diff --git a/web-app/src/locales/vn/mcp-servers.json b/web-app/src/locales/vn/mcp-servers.json index 7c06a102b..151af4a9d 100644 --- a/web-app/src/locales/vn/mcp-servers.json +++ b/web-app/src/locales/vn/mcp-servers.json @@ -26,6 +26,8 @@ "errorParse": "Không thể phân tích cú pháp dữ liệu ban đầu", "errorPaste": "Định dạng JSON không hợp lệ trong nội dung đã dán", "errorFormat": "Định dạng JSON không hợp lệ", + "errorServerName": "Tên máy chủ là bắt buộc và không được để trống", + "errorMissingServerNameKey": "JSON phải có cấu trúc {\"serverName\": {config}} - thiếu khóa tên máy chủ", "save": "Lưu" }, "checkParams": "Vui lòng kiểm tra các tham số theo hướng dẫn.", diff --git a/web-app/src/locales/zh-CN/mcp-servers.json b/web-app/src/locales/zh-CN/mcp-servers.json index 371ffaff6..4a7a0b986 100644 --- a/web-app/src/locales/zh-CN/mcp-servers.json +++ b/web-app/src/locales/zh-CN/mcp-servers.json @@ -28,10 +28,6 @@ "errorFormat": "JSON 格式无效", "errorServerName": "服务器名称为必填项,不能为空", "errorMissingServerNameKey": "JSON 必须按 {\"serverName\": {config}} 格式结构化 - 缺少服务器名称键", - "errorServerConfig": "服务器 '{{serverName}}' 的配置无效", - "errorMissingCommand": "服务器 '{{serverName}}' 缺少必需的 'command' 字段", - "errorMissingUrl": "服务器 '{{serverName}}' 缺少必需的 'url' 字段", - "errorInvalidType": "服务器 '{{serverName}}' 的传输类型无效。必须为 'stdio'、'http' 或 'sse'", "save": "保存" }, "checkParams": "请根据教程检查参数。", diff --git a/web-app/src/locales/zh-TW/mcp-servers.json b/web-app/src/locales/zh-TW/mcp-servers.json index 0eb781497..68229368b 100644 --- a/web-app/src/locales/zh-TW/mcp-servers.json +++ b/web-app/src/locales/zh-TW/mcp-servers.json @@ -26,6 +26,8 @@ "errorParse": "解析初始資料失敗", "errorPaste": "貼上內容的 JSON 格式無效", "errorFormat": "JSON 格式無效", + "errorServerName": "伺服器名稱為必填項目,不能為空", + "errorMissingServerNameKey": "JSON 必須依照 {\"serverName\": {config}} 結構 - 缺少伺服器名稱鍵值", "save": "儲存" }, "checkParams": "請根據教學檢查參數。", From a3c2c1aa3b0b15c29c56d86ffd04071c55915d45 Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Tue, 16 Sep 2025 22:35:51 +0700 Subject: [PATCH 3/3] fix: validat type mcp json --- .../containers/dialogs/AddEditMCPServer.tsx | 21 +++++++++++++++---- web-app/src/locales/de-DE/mcp-servers.json | 1 + web-app/src/locales/en/mcp-servers.json | 1 + web-app/src/locales/id/mcp-servers.json | 1 + web-app/src/locales/pl/mcp-servers.json | 1 + web-app/src/locales/vn/mcp-servers.json | 1 + web-app/src/locales/zh-CN/mcp-servers.json | 1 + web-app/src/locales/zh-TW/mcp-servers.json | 1 + 8 files changed, 24 insertions(+), 4 deletions(-) diff --git a/web-app/src/containers/dialogs/AddEditMCPServer.tsx b/web-app/src/containers/dialogs/AddEditMCPServer.tsx index 21d90ec2c..cf2813009 100644 --- a/web-app/src/containers/dialogs/AddEditMCPServer.tsx +++ b/web-app/src/containers/dialogs/AddEditMCPServer.tsx @@ -291,15 +291,28 @@ export default function AddEditMCPServer({ return } - // For each server in the JSON, validate serverName and call onSave - Object.entries(parsedData).forEach(([serverName, config]) => { + // For each server in the JSON, validate serverName and config + for (const [serverName, config] of Object.entries(parsedData)) { const trimmedServerName = serverName.trim() if (!trimmedServerName) { setError(t('mcp-servers:editJson.errorServerName')) return } - onSave(trimmedServerName, config as MCPServerConfig) - }) + + // Validate the config object + const serverConfig = config as MCPServerConfig + + // Validate type field if present + if (serverConfig.type && !['stdio', 'http', 'sse'].includes(serverConfig.type)) { + setError(t('mcp-servers:editJson.errorInvalidType', { + serverName: trimmedServerName, + type: serverConfig.type + })) + return + } + + onSave(trimmedServerName, serverConfig as MCPServerConfig) + } onOpenChange(false) resetForm() setError(null) diff --git a/web-app/src/locales/de-DE/mcp-servers.json b/web-app/src/locales/de-DE/mcp-servers.json index e38c20d3b..a4af1c87b 100644 --- a/web-app/src/locales/de-DE/mcp-servers.json +++ b/web-app/src/locales/de-DE/mcp-servers.json @@ -28,6 +28,7 @@ "errorFormat": "Ungültiges JSON Format", "errorServerName": "Servername ist erforderlich und darf nicht leer sein", "errorMissingServerNameKey": "JSON muss als {\"serverName\": {config}} strukturiert sein - fehlender Servername-Schlüssel", + "errorInvalidType": "Ungültiger Typ '{{type}}' für Server '{{serverName}}'. Typ muss 'stdio', 'http' oder 'sse' sein", "save": "Speichern" }, "checkParams": "Bitte überprüfe die Parameter gemäß dem Tutorial.", diff --git a/web-app/src/locales/en/mcp-servers.json b/web-app/src/locales/en/mcp-servers.json index a6bc5c2d8..baeefe1ef 100644 --- a/web-app/src/locales/en/mcp-servers.json +++ b/web-app/src/locales/en/mcp-servers.json @@ -28,6 +28,7 @@ "errorFormat": "Invalid JSON format", "errorServerName": "Server name is required and cannot be empty", "errorMissingServerNameKey": "JSON must be structured as {\"serverName\": {config}} - missing server name key", + "errorInvalidType": "Invalid type '{{type}}' for server '{{serverName}}'. Type must be 'stdio', 'http', or 'sse'", "save": "Save" }, "checkParams": "Please check the parameters according to the tutorial.", diff --git a/web-app/src/locales/id/mcp-servers.json b/web-app/src/locales/id/mcp-servers.json index c4f041d1b..78d5ff55e 100644 --- a/web-app/src/locales/id/mcp-servers.json +++ b/web-app/src/locales/id/mcp-servers.json @@ -28,6 +28,7 @@ "errorFormat": "Format JSON tidak valid", "errorServerName": "Nama server wajib diisi dan tidak boleh kosong", "errorMissingServerNameKey": "JSON harus berstruktur sebagai {\"serverName\": {config}} - kunci nama server hilang", + "errorInvalidType": "Tipe '{{type}}' untuk server '{{serverName}}' tidak valid. Tipe harus 'stdio', 'http', atau 'sse'", "save": "Simpan" }, "checkParams": "Silakan periksa parameter sesuai dengan tutorial.", diff --git a/web-app/src/locales/pl/mcp-servers.json b/web-app/src/locales/pl/mcp-servers.json index c95ab9dd4..260a3b089 100644 --- a/web-app/src/locales/pl/mcp-servers.json +++ b/web-app/src/locales/pl/mcp-servers.json @@ -28,6 +28,7 @@ "errorFormat": "Niepoprawny format JSON", "errorServerName": "Nazwa serwera jest wymagana i nie może być pusta", "errorMissingServerNameKey": "JSON musi być w formacie {\"serverName\": {config}} - brakuje klucza nazwy serwera", + "errorInvalidType": "Niepoprawny typ '{{type}}' dla serwera '{{serverName}}'. Typ musi być 'stdio', 'http' lub 'sse'", "save": "Zapisz" }, "checkParams": "Proszę sprawdzić parametry we wprowadzeniu.", diff --git a/web-app/src/locales/vn/mcp-servers.json b/web-app/src/locales/vn/mcp-servers.json index 151af4a9d..e27a448c3 100644 --- a/web-app/src/locales/vn/mcp-servers.json +++ b/web-app/src/locales/vn/mcp-servers.json @@ -28,6 +28,7 @@ "errorFormat": "Định dạng JSON không hợp lệ", "errorServerName": "Tên máy chủ là bắt buộc và không được để trống", "errorMissingServerNameKey": "JSON phải có cấu trúc {\"serverName\": {config}} - thiếu khóa tên máy chủ", + "errorInvalidType": "Loại '{{type}}' cho máy chủ '{{serverName}}' không hợp lệ. Loại phải là 'stdio', 'http' hoặc 'sse'", "save": "Lưu" }, "checkParams": "Vui lòng kiểm tra các tham số theo hướng dẫn.", diff --git a/web-app/src/locales/zh-CN/mcp-servers.json b/web-app/src/locales/zh-CN/mcp-servers.json index 4a7a0b986..591824b25 100644 --- a/web-app/src/locales/zh-CN/mcp-servers.json +++ b/web-app/src/locales/zh-CN/mcp-servers.json @@ -28,6 +28,7 @@ "errorFormat": "JSON 格式无效", "errorServerName": "服务器名称为必填项,不能为空", "errorMissingServerNameKey": "JSON 必须按 {\"serverName\": {config}} 格式结构化 - 缺少服务器名称键", + "errorInvalidType": "服务器 '{{serverName}}' 的类型 '{{type}}' 无效。类型必须是 'stdio'、'http' 或 'sse'", "save": "保存" }, "checkParams": "请根据教程检查参数。", diff --git a/web-app/src/locales/zh-TW/mcp-servers.json b/web-app/src/locales/zh-TW/mcp-servers.json index 68229368b..ff8e0345b 100644 --- a/web-app/src/locales/zh-TW/mcp-servers.json +++ b/web-app/src/locales/zh-TW/mcp-servers.json @@ -28,6 +28,7 @@ "errorFormat": "JSON 格式無效", "errorServerName": "伺服器名稱為必填項目,不能為空", "errorMissingServerNameKey": "JSON 必須依照 {\"serverName\": {config}} 結構 - 缺少伺服器名稱鍵值", + "errorInvalidType": "伺服器 '{{serverName}}' 的類型 '{{type}}' 無效。類型必須是 'stdio'、'http' 或 'sse'", "save": "儲存" }, "checkParams": "請根據教學檢查參數。",