Move transport toggle to left and make it only affect new servers

- Add newServerTransportType state for next server to be added
- Move toggle to left side directly after 'Add New Server' label
- Add transportType to McpServer interface to store per-server transport
- Update connections to use server-specific transport type
- Change toggle styling to rounded-full (pill style)
This commit is contained in:
Glen Maddern 2025-06-26 09:50:30 +10:00
commit 59d2dfca8b

View file

@ -7,17 +7,16 @@ interface McpServer {
url: string url: string
enabled: boolean enabled: boolean
name?: string name?: string
transportType: 'auto' | 'http' | 'sse'
} }
// MCP Connection wrapper for a single server // MCP Connection wrapper for a single server
function McpConnection({ function McpConnection({
server, server,
onConnectionUpdate, onConnectionUpdate,
transportType,
}: { }: {
server: McpServer server: McpServer
onConnectionUpdate: (serverId: string, data: any) => void onConnectionUpdate: (serverId: string, data: any) => void
transportType: 'auto' | 'http' | 'sse'
}) { }) {
// Use the MCP hook with the server URL // Use the MCP hook with the server URL
const connection = useMcp({ const connection = useMcp({
@ -25,7 +24,7 @@ function McpConnection({
debug: true, debug: true,
autoRetry: false, autoRetry: false,
popupFeatures: 'width=500,height=600,resizable=yes,scrollbars=yes', popupFeatures: 'width=500,height=600,resizable=yes,scrollbars=yes',
transportType, transportType: server.transportType,
}) })
// Update parent component with connection data // Update parent component with connection data
@ -59,6 +58,7 @@ const McpServerModal: React.FC<McpServerModalProps> = ({ isOpen, onClose, onTool
const stored = localStorage.getItem('mcpTransportType') const stored = localStorage.getItem('mcpTransportType')
return (stored as 'auto' | 'http' | 'sse') || 'http' return (stored as 'auto' | 'http' | 'sse') || 'http'
}) })
const [newServerTransportType, setNewServerTransportType] = useState<'auto' | 'http' | 'sse'>('http')
// Helper to cycle through transport types // Helper to cycle through transport types
const cycleTransportType = () => { const cycleTransportType = () => {
@ -75,6 +75,22 @@ const McpServerModal: React.FC<McpServerModalProps> = ({ isOpen, onClose, onTool
} }
}) })
} }
// Helper to cycle through new server transport types
const cycleNewServerTransportType = () => {
setNewServerTransportType((current) => {
switch (current) {
case 'auto':
return 'http'
case 'http':
return 'sse'
case 'sse':
return 'auto'
default:
return 'http'
}
})
}
// const logRef = useRef<HTMLDivElement>(null) // Removed for now as debug logs not implemented in multi-server version // const logRef = useRef<HTMLDivElement>(null) // Removed for now as debug logs not implemented in multi-server version
// Save servers to localStorage whenever they change // Save servers to localStorage whenever they change
@ -132,6 +148,7 @@ const McpServerModal: React.FC<McpServerModalProps> = ({ isOpen, onClose, onTool
url: newServerUrl.trim(), url: newServerUrl.trim(),
enabled: true, enabled: true,
name: new URL(newServerUrl.trim()).hostname, name: new URL(newServerUrl.trim()).hostname,
transportType: newServerTransportType,
} }
setServers((prev) => [...prev, newServer]) setServers((prev) => [...prev, newServer])
@ -271,8 +288,8 @@ const McpServerModal: React.FC<McpServerModalProps> = ({ isOpen, onClose, onTool
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
{getStatusBadge(server.enabled ? state : 'disabled')} {getStatusBadge(server.enabled ? state : 'disabled')}
{server.enabled && state === 'ready' && ( {server.enabled && state === 'ready' && (
<span className="px-2 py-1 text-xs bg-blue-100 text-blue-800 rounded font-mono"> <span className="px-2 py-1 text-xs bg-blue-100 text-blue-800 rounded-md font-mono">
{transportType.toUpperCase()} {server.transportType.toUpperCase()}
</span> </span>
)} )}
<button <button
@ -343,14 +360,14 @@ const McpServerModal: React.FC<McpServerModalProps> = ({ isOpen, onClose, onTool
{/* Add New Server */} {/* Add New Server */}
<div className="border-t pt-4"> <div className="border-t pt-4">
<div className="flex items-center justify-between mb-3"> <div className="flex items-center gap-3 mb-3">
<h3 className="font-medium text-sm">Add New Server</h3> <h3 className="font-medium text-sm">Add New Server</h3>
<button <button
onClick={cycleTransportType} onClick={cycleNewServerTransportType}
className="px-2 py-1 text-xs border border-gray-300 rounded bg-gray-50 hover:bg-gray-100 font-mono" className="px-3 py-1 text-xs border border-gray-300 rounded-full bg-gray-50 hover:bg-gray-100 font-mono"
title="Click to cycle through transport types" title="Click to cycle through transport types"
> >
{transportType.toUpperCase()} {newServerTransportType.toUpperCase()}
</button> </button>
</div> </div>
<div className="flex gap-2"> <div className="flex gap-2">
@ -398,7 +415,7 @@ const McpServerModal: React.FC<McpServerModalProps> = ({ isOpen, onClose, onTool
{servers {servers
.filter((s) => s.enabled) .filter((s) => s.enabled)
.map((server) => ( .map((server) => (
<McpConnection key={server.id} server={server} onConnectionUpdate={handleConnectionUpdate} transportType={transportType} /> <McpConnection key={server.id} server={server} onConnectionUpdate={handleConnectionUpdate} />
))} ))}
</> </>
) )