import React from 'react'; import { Button, Input } from 'antd'; import { PlusOutlined } from '@ant-design/icons'; import type { AIMCPServerConfig } from '../../types'; import { parseMCPCommandDraft, type ParseMCPCommandDraftResult, } from '../../utils/mcpCommandDraft'; import { buildMCPLaunchPreview, MCP_COMMAND_PARSE_EXAMPLE, } from '../../utils/mcpServerGuidance'; import { buildMCPQuickAddServerSeed } from '../../utils/mcpServerDraftSeed'; import { MCP_SERVER_DRAFT_TEMPLATES } from '../../utils/mcpServerTemplates'; import type { OverlayWorkbenchTheme } from '../../utils/overlayWorkbenchTheme'; import AIMCPCommandDraftPreview from './AIMCPCommandDraftPreview'; import { buildMCPHintStyle, mcpLabelStyle } from './AIMCPHelpBlock'; interface AIMCPQuickAddServerPanelProps { cardBg: string; cardBorder: string; inputBg: string; darkMode: boolean; overlayTheme: OverlayWorkbenchTheme; onAddServer: (seed?: Partial) => void; } const renderParseSummary = ( rawCommandDraft: string, parsedCommandDraft: ParseMCPCommandDraftResult, overlayTheme: OverlayWorkbenchTheme, ) => { if (!rawCommandDraft.trim()) { return '支持带引号路径、带空格参数,以及 KEY=VALUE / $env:KEY=VALUE; / set KEY=VALUE && 环境变量前缀。'; } if (!parsedCommandDraft.ok || !parsedCommandDraft.draft) { return parsedCommandDraft.error || '完整命令解析失败,请检查命令格式。'; } const envCount = Object.keys(parsedCommandDraft.draft.env || {}).length; return ( 将解析为:命令 {parsedCommandDraft.draft.command},参数 {parsedCommandDraft.draft.args.length} 个,环境变量 {envCount} 个。 ); }; const AIMCPQuickAddServerPanel: React.FC = ({ cardBg, cardBorder, inputBg, darkMode, overlayTheme, onAddServer, }) => { const [rawCommandDraft, setRawCommandDraft] = React.useState(''); const parsedCommandDraft = parseMCPCommandDraft(rawCommandDraft); const handleAddFromCommand = () => { if (!parsedCommandDraft.ok || !parsedCommandDraft.draft) { return; } onAddServer(buildMCPQuickAddServerSeed(parsedCommandDraft.draft)); setRawCommandDraft(''); }; return (
一行命令快速新增
先选最接近的模板,或直接粘贴 README 里的一整行启动命令。GoNavi 会先拆成 command、args 和 env,再生成一个可继续编辑的 MCP 草稿。
常见启动方式模板
不确定 command 和 args 怎么拆时,直接点一个模板新增草稿;每张卡片下面展示的就是 GoNavi 实际会启动的命令预览。
{MCP_SERVER_DRAFT_TEMPLATES.map((template) => ( ))}
setRawCommandDraft(event.target.value)} placeholder={`粘贴完整命令,例如:\n${MCP_COMMAND_PARSE_EXAMPLE}`} style={{ borderRadius: 10, background: inputBg, border: `1px solid ${cardBorder}`, fontFamily: 'var(--gn-font-mono)' }} />
{renderParseSummary(rawCommandDraft, parsedCommandDraft, overlayTheme)}
{parsedCommandDraft.ok && parsedCommandDraft.draft && rawCommandDraft.trim() && ( )}
); }; export default AIMCPQuickAddServerPanel;