import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { X, Save, Wrench } from "lucide-react"; import { McpServer } from "../../types"; import { buttonStyles, inputStyles } from "../../lib/styles"; interface McpFormModalProps { editingId?: string; initialData?: McpServer; onSave: (id: string, server: McpServer) => void; onClose: () => void; } const parseEnvText = (text: string): Record => { const lines = text .split("\n") .map((l) => l.trim()) .filter((l) => l.length > 0); const env: Record = {}; for (const l of lines) { const idx = l.indexOf("="); if (idx > 0) { const k = l.slice(0, idx).trim(); const v = l.slice(idx + 1).trim(); if (k) env[k] = v; } } return env; }; const formatEnvText = (env?: Record): string => { if (!env) return ""; return Object.entries(env) .map(([k, v]) => `${k}=${v}`) .join("\n"); }; /** * MCP 表单模态框组件 * 用于添加或编辑 MCP 服务器 */ const McpFormModal: React.FC = ({ editingId, initialData, onSave, onClose, }) => { const { t } = useTranslation(); const [formId, setFormId] = useState(editingId || ""); const [formType, setFormType] = useState<"stdio" | "sse">( initialData?.type || "stdio", ); const [formCommand, setFormCommand] = useState(initialData?.command || ""); const [formArgsText, setFormArgsText] = useState( (initialData?.args || []).join(" "), ); const [formEnvText, setFormEnvText] = useState( formatEnvText(initialData?.env), ); const [formCwd, setFormCwd] = useState(initialData?.cwd || ""); const [saving, setSaving] = useState(false); // 编辑模式下禁止修改 ID const isEditing = !!editingId; const handleValidateCommand = async () => { if (!formCommand) return; try { const ok = await window.api.validateMcpCommand(formCommand.trim()); const message = ok ? t("mcp.validation.ok") : t("mcp.validation.fail"); // 这里简单使用 alert,实际项目中应该使用 notification 系统 alert(message); } catch (_error) { alert(t("mcp.validation.fail")); } }; const handleSubmit = async () => { if (!formId.trim()) { alert(t("mcp.error.idRequired")); return; } if (!formCommand.trim()) { alert(t("mcp.error.commandRequired")); return; } setSaving(true); try { const server: McpServer = { type: formType, command: formCommand.trim(), args: formArgsText .split(/\s+/) .map((s) => s.trim()) .filter((s) => s.length > 0), env: parseEnvText(formEnvText), ...(formCwd ? { cwd: formCwd } : {}), // 保留原有的 enabled 状态 ...(initialData?.enabled !== undefined ? { enabled: initialData.enabled } : {}), }; onSave(formId.trim(), server); } finally { setSaving(false); } }; return (
{/* Backdrop */}
{/* Modal */}
{/* Header */}

{isEditing ? t("mcp.editServer") : t("mcp.addServer")}

{/* Content */}
{/* ID */}
setFormId(e.target.value)} disabled={isEditing} />
{/* Type & CWD */}
setFormCwd(e.target.value)} />
{/* Command */}
setFormCommand(e.target.value)} />
{/* Args */}
setFormArgsText(e.target.value)} />
{/* Env */}