import React, { useState, useEffect } from 'react'; import { motion } from 'framer-motion'; import { FiAlertCircle, FiX, FiGrid, FiList, FiPlus, FiInfo, FiTool, FiZap, FiShield, FiDatabase, FiServer, FiPackage, FiGithub, FiHardDrive, } from 'react-icons/fi'; import Typography from '../components/ui/Typography'; import { Button } from '../components/ui/Button'; import { Card, CardContent } from '../components/ui/Card'; import { MCPServerList } from '../components/mcp/MCPServerList'; import { MCPSetupWizard } from '../components/mcp/MCPSetupWizard'; import { MCPConnectionTester } from '../components/mcp/MCPConnectionTester'; import { MCPServerCatalog } from '../components/mcp/MCPServerCatalog'; import { MCPRegistry } from '../components/mcp/MCPRegistry'; import { AddMCPServer } from '../components/mcp/AddMCPServer'; import { MCPInfoPanel } from '../components/mcp/MCPInfoPanel'; import { useMCPStore } from '../stores/mcpStore'; import { MCPServerConfig, MCPServerFormData } from '../types/mcp'; import { cn } from '../lib/utils'; interface MCPServerQuickInstall { name: string; template: { type: string; config: Record; }; requirements?: string[]; } type ViewMode = 'servers' | 'browse'; interface Tab { key: ViewMode; label: string; icon: React.ElementType; description: string; } const tabs: Tab[] = [ { key: 'servers', label: 'My Servers', icon: FiServer, description: 'Manage your installed MCP servers', }, { key: 'browse', label: 'Browse Catalog', icon: FiPackage, description: 'Discover and install new servers', }, ]; const tabGradients = { servers: 'from-hgo-blue to-hgo-green', browse: 'from-hgo-green to-hgo-purple', }; /** * Main page for MCP server management * @returns Complete MCP management interface with server list and configuration */ const MCPPage: React.FC = () => { const [isAddModalOpen, setIsAddModalOpen] = useState(false); const [isLearnMCPModalOpen, setIsLearnMCPModalOpen] = useState(false); const [editingServer, setEditingServer] = useState( null ); const [testingServerId, setTestingServerId] = useState(null); const [viewMode, setViewMode] = useState('servers'); const [serverTemplate, setServerTemplate] = useState(null); const { servers, isLoading, error, connectionTests, addServer, updateServer, deleteServer, toggleServer, testConnection, loadServers, reloadServers, clearError, } = useMCPStore(); useEffect(() => { loadServers(); }, [loadServers]); useEffect(() => { if (serverTemplate) { setIsAddModalOpen(true); } }, [serverTemplate]); useEffect(() => { const interval = setInterval(() => { reloadServers(); }, 5000); return () => clearInterval(interval); }, [reloadServers]); const handleAddServer = async (data: MCPServerFormData) => { try { if (editingServer) { await updateServer(editingServer.id, { name: data.name, type: data.type, config: data.config, }); } else { await addServer(data); } setIsAddModalOpen(false); setEditingServer(null); setServerTemplate(null); } catch (error) {} }; const handleEditServer = (serverId: string) => { const server = servers.find((s) => s.id === serverId); if (server) { setEditingServer(server); setIsAddModalOpen(true); } }; const handleDeleteServer = async (serverId: string) => { if ( window.confirm( 'Are you sure you want to delete this server? This action cannot be undone.' ) ) { try { await deleteServer(serverId); } catch (error) {} } }; const handleToggleServer = async (serverId: string, enabled: boolean) => { try { await toggleServer(serverId, enabled); } catch (error) {} }; const handleTestConnection = async (serverId: string) => { setTestingServerId(serverId); try { await testConnection(serverId); } catch (error) { } finally { setTestingServerId(null); } }; const handleCloseModal = () => { setIsAddModalOpen(false); setEditingServer(null); setServerTemplate(null); }; const handleQuickInstall = (server: MCPServerQuickInstall) => { setServerTemplate({ name: server.name, type: server.template.type, config: server.template.config, requirements: server.requirements, }); setViewMode('servers'); }; const handleRegistryInstall = async (server: { id: string; name: string; description: string; author?: string; version?: string }) => { await loadServers(); setViewMode('servers'); }; if (isLoading && servers.length === 0) { return (
Loading MCP servers...
); } return (
{/* Header */}
MCP Servers Extend your agent's capabilities with Model Context Protocol servers
{/* Error Message */} {error && (
)} {/* Info Banner for First Time Users */} {servers.length === 0 && !isLoading && viewMode === 'servers' && (
Get Started with MCP Servers MCP servers extend your agent with powerful capabilities like file system access, web browsing, database connections, and code execution. Browse the catalog to discover available servers or add your own custom server.
)} {/* Main Content Card */} {/* Tabs */}
{/* Tab Content */} {viewMode === 'servers' ? (
setIsAddModalOpen(true)} />
{testingServerId && ( s.id === testingServerId)?.name || 'Server' } onTest={() => handleTestConnection(testingServerId)} result={connectionTests[testingServerId]?.result} loading={false} /> )} s.status === 'connected' || s.status === 'ready' ).length } totalTools={servers.reduce( (acc, s) => acc + (s.tools?.length || 0), 0 )} />
) : ( )}
{/* Learn about MCP Modal */} {isLearnMCPModalOpen && (
e.stopPropagation()} > {/* Modal Header */}
What is MCP?
{/* Modal Content */}
Model Context Protocol The Model Context Protocol (MCP) is an open standard that enables seamless integration between AI assistants and external data sources and tools. It provides a universal way for AI models to access and interact with various services.
Key Benefits
  • Enhanced Capabilities: Connect your agent to databases, APIs, file systems, and more
  • Secure Integration: Maintain control over what data and tools your agent can access
  • Modular Design: Add or remove capabilities without modifying core agent logic
Popular MCP Servers
Filesystem
Read, write, and manage local files
GitHub
Access repositories and code
PostgreSQL
Query and manage databases
Custom
Build your own integrations
Getting Started: Click the "Add Server" button to configure your first MCP server. Each server extends your agent with new capabilities that can be used during conversations.
{/* Modal Footer */}
Learn more at modelcontextprotocol.io →
)}
); }; export default MCPPage;