import React, { useState, useMemo } from 'react' import { FiCode, FiDatabase, FiCpu, FiBriefcase, FiCloud, FiClock, FiSearch, FiStar, FiPlus, FiExternalLink, FiTerminal, FiFilter, FiX, FiCheck, FiDownload } from 'react-icons/fi' import { Button } from '../ui' import { Input } from '../ui' import Typography from '../ui/Typography' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip' import { cn } from '../../lib/utils' import popularServersData from '../../data/popularMCPServers.json' interface MCPServerCatalogProps { onQuickInstall: (server: PopularMCPServer) => void installedServerIds?: string[] } interface PopularMCPServer { id: string name: string description: string category: string popularity: number difficulty: 'easy' | 'medium' | 'hard' tags: string[] setupTime: string template: { type: string config: Record } requirements: string[] documentation?: string installCommand?: string quickSetup: boolean } interface Category { id: string name: string description: string icon: string } const iconMap: Record = { FiCode, FiDatabase, FiCpu, FiBriefcase, FiCloud } const difficultyColors = { easy: 'text-green-600 bg-green-100 dark:text-green-400 dark:bg-green-900/20', medium: 'text-yellow-600 bg-yellow-100 dark:text-yellow-400 dark:bg-yellow-900/20', hard: 'text-red-600 bg-red-100 dark:text-red-400 dark:bg-red-900/20' } const difficultyLabels = { easy: 'Easy Setup', medium: 'Moderate', hard: 'Advanced' } /** * Server card component for displaying individual server details */ const ServerCard: React.FC<{ server: PopularMCPServer isInstalled: boolean onQuickInstall: () => void }> = ({ server, isInstalled, onQuickInstall }) => { const [showRequirements, setShowRequirements] = useState(false) return (
{isInstalled ? (
) : ( )}
{server.name}
{server.description}
{server.popularity}%
{difficultyLabels[server.difficulty]}
{server.setupTime}
{server.tags.slice(0, 3).map(tag => ( {tag} ))}
{server.requirements.length > 0 && ( )} {showRequirements && (
Requirements:
    {server.requirements.map((req, index) => (
  • • {req}
  • ))}
)} {(server.documentation || server.installCommand) && (
{server.documentation && ( )} {server.installCommand && (

Copy install command

)}
)}
) } /** * MCP Server Catalog component for browsing and installing popular servers */ export const MCPServerCatalog: React.FC = ({ onQuickInstall, installedServerIds = [] }) => { const [searchQuery, setSearchQuery] = useState('') const [selectedCategory, setSelectedCategory] = useState(null) const [sortBy, setSortBy] = useState<'popularity' | 'name' | 'difficulty'>('popularity') const categories = popularServersData.categories as Category[] const servers = popularServersData.servers as PopularMCPServer[] const filteredServers = useMemo(() => { let filtered = servers if (searchQuery) { const query = searchQuery.toLowerCase() filtered = filtered.filter(server => server.name.toLowerCase().includes(query) || server.description.toLowerCase().includes(query) || server.tags.some(tag => tag.toLowerCase().includes(query)) ) } if (selectedCategory) { filtered = filtered.filter(server => server.category === selectedCategory) } filtered.sort((a, b) => { switch (sortBy) { case 'popularity': return b.popularity - a.popularity case 'name': return a.name.localeCompare(b.name) case 'difficulty': { const difficultyOrder = { easy: 0, medium: 1, hard: 2 } return difficultyOrder[a.difficulty] - difficultyOrder[b.difficulty] } default: return 0 } }) return filtered }, [searchQuery, selectedCategory, sortBy, servers]) const handleQuickInstall = (server: PopularMCPServer) => { onQuickInstall(server) } return (
Popular MCP Servers
Discover and install popular MCP servers to extend your agent's capabilities
setSearchQuery(e.target.value)} className="pl-10" />
{categories.map(category => { const Icon = iconMap[category.icon] || FiCode return ( ) })}
Showing {filteredServers.length} of {servers.length} servers {searchQuery && ( )}
{filteredServers.length > 0 ? (
{filteredServers.map(server => ( handleQuickInstall(server)} /> ))}
) : (
No servers found matching your criteria
)}
) }