(input: string)
| 27 | } |
| 28 | |
| 29 | function parseInput(input: string): { name: string; config: MCPConfig } | null { |
| 30 | const trimmed = input.trim(); |
| 31 | if (!trimmed) return null; |
| 32 | |
| 33 | if (trimmed.startsWith("{")) { |
| 34 | try { |
| 35 | const parsed = JSON.parse(trimmed); |
| 36 | |
| 37 | if (parsed.mcpServers && typeof parsed.mcpServers === "object") { |
| 38 | const serverNames = Object.keys(parsed.mcpServers); |
| 39 | if (serverNames.length > 0) { |
| 40 | const serverName = serverNames[0]; |
| 41 | const serverConfig = parsed.mcpServers[serverName]; |
| 42 | const command = normalizeCommand(serverConfig.command); |
| 43 | if (serverConfig.args && Array.isArray(serverConfig.args)) { |
| 44 | command.push(...serverConfig.args); |
| 45 | } |
| 46 | return { |
| 47 | name: serverName, |
| 48 | config: { |
| 49 | command, |
| 50 | enabled: serverConfig.enabled ?? true, |
| 51 | type: serverConfig.type || "local", |
| 52 | ...((serverConfig.env || serverConfig.environment) && { |
| 53 | environment: serverConfig.env || serverConfig.environment |
| 54 | }), |
| 55 | ...(serverConfig.url && { url: serverConfig.url }), |
| 56 | ...(serverConfig.timeout && { timeout: serverConfig.timeout }), |
| 57 | ...(serverConfig.oauth && { oauth: serverConfig.oauth }), |
| 58 | }, |
| 59 | }; |
| 60 | } |
| 61 | } |
| 62 | |
| 63 | if (parsed.command !== undefined || parsed.url !== undefined) { |
| 64 | const command = normalizeCommand(parsed.command); |
| 65 | if (parsed.args && Array.isArray(parsed.args)) { |
| 66 | command.push(...parsed.args); |
| 67 | } |
| 68 | return { |
| 69 | name: "mcp-server", |
| 70 | config: { |
| 71 | command, |
| 72 | enabled: parsed.enabled ?? true, |
| 73 | type: parsed.type || "local", |
| 74 | ...((parsed.env || parsed.environment) && { |
| 75 | environment: parsed.env || parsed.environment |
| 76 | }), |
| 77 | ...(parsed.url && { url: parsed.url }), |
| 78 | ...(parsed.timeout && { timeout: parsed.timeout }), |
| 79 | ...(parsed.oauth && { oauth: parsed.oauth }), |
| 80 | }, |
| 81 | }; |
| 82 | } |
| 83 | } catch {} |
| 84 | } |
| 85 | |
| 86 | const parts = trimmed.split(/\s+/); |
no test coverage detected