"use client"; import { memo } from "react"; import { Package, Star, Eye, ExternalLink, CheckCircle, Zap, Settings, PlayCircle, Loader2, } from "lucide-react"; import { MCPProvider } from "@/lib/types/mcp"; interface MCPCardProps { mcp: MCPProvider; onInstall: () => void; onUninstall: () => void; onViewDetails: () => void; mode?: "marketplace" | "installed"; onEditConfig?: () => void; onTestServer?: () => void; isTesting?: boolean; installingStatus?: { status: string; message: string; percentage: number; }; } export const MCPCard = memo( function MCPCard({ mcp, onInstall, onUninstall, onViewDetails, mode = "marketplace", onEditConfig, onTestServer, isTesting = false, installingStatus, }: MCPCardProps) { const getCategoryColor = (category: string) => { switch (category) { case "map": return "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200"; case "browser": return "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200"; case "office": return "bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-200"; case "search": return "bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200"; case "database": return "bg-indigo-100 text-indigo-800 dark:bg-indigo-900 dark:text-indigo-200"; case "finance": return "bg-emerald-100 text-emerald-800 dark:bg-emerald-900 dark:text-emerald-200"; case "code": return "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200"; case "chart": return "bg-pink-100 text-pink-800 dark:bg-pink-900 dark:text-pink-200"; case "payment": return "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200"; default: return "bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-200"; } }; const formatDownloads = (downloads: number) => { if (downloads >= 1000000) return `${(downloads / 1000000).toFixed(1)}M`; if (downloads >= 1000) return `${(downloads / 1000).toFixed(1)}K`; return downloads.toString(); }; const isOfficial = mcp.tags?.includes("official") || false; const toolCount = mcp.tools?.length || 0; return (
by {mcp.author}
{mcp.description}
{/* Stats */}{installingStatus.message}