onChange(updateMcpServer(server, { name: value }))}
value={server.name}
/>
onChange(changeMcpTransport(server, value as McpServerDefinition['transport']))}
options={[
{ value: 'local', label: 'Local process' },
{ value: 'http', label: 'HTTP' },
{ value: 'sse', label: 'SSE' },
]}
value={server.transport}
/>
{server.transport === 'local' ? (
onChange(updateMcpServer(server, { command: value }))}
placeholder="node"
value={server.command}
/>
onChange(updateMcpServer(server, { args: splitMultiline(value) }))}
placeholder="One argument per line"
rows={4}
value={joinMultiline(server.args)}
/>
onChange(updateMcpServer(server, { cwd: value || undefined }))}
placeholder="Optional"
value={server.cwd ?? ''}
/>
) : (
onChange(updateMcpServer(server, { url: value }))}
placeholder="https://example.com/mcp"
value={server.url}
/>
)}
onChange(updateMcpServer(server, { tools: splitTokens(value) }))}
placeholder="Use * for all tools, or list one tool per line"
rows={4}
value={joinMultiline(server.tools)}
/>
onChange(
updateMcpServer(server, {
timeoutMs: value.trim() ? Number(value) : undefined,
}),
)
}
placeholder="Optional"
value={server.timeoutMs?.toString() ?? ''}
/>
Keep secrets out of this form. Use commands or endpoints that authenticate through the OS or external tooling.
);
}
function LspProfileEditor({
profile,
onChange,
onBack,
onSave,
onDelete,
}: {
profile: LspProfileDefinition;
onChange: (profile: LspProfileDefinition) => void;
onBack: () => void;
onSave: () => Promise