// ======================================== // Codex MCP Card Component // ======================================== // Read-only display card for Codex MCP servers (no edit/delete) import { useIntl } from 'react-intl'; import { Server, Power, PowerOff, ChevronDown, ChevronUp, Lock, Link, } from 'lucide-react'; import { Card } from '@/components/ui/Card'; import { Badge } from '@/components/ui/Badge'; import { cn } from '@/lib/utils'; import type { McpServer } from '@/lib/api'; import { isHttpMcpServer, isStdioMcpServer } from '@/lib/api'; // ========== Types ========== export interface CodexMcpCardProps { server: McpServer; enabled: boolean; isExpanded: boolean; onToggleExpand: () => void; /** Optional: When true, indicates this card is in editable mode (for CodexMcpEditableCard extension) */ isEditable?: boolean; } // ========== Component ========== export function CodexMcpCard({ server, enabled, isExpanded, onToggleExpand, // isEditable prop is for CodexMcpEditableCard extension compatibility isEditable: _isEditable = false, }: CodexMcpCardProps) { const { formatMessage } = useIntl(); const isHttp = isHttpMcpServer(server); const isStdio = isStdioMcpServer(server); // Get display text for server summary line const getServerSummary = () => { if (isHttp) { return server.url; } if (isStdio) { return `${server.command || ''} ${server.args?.join(' ') || ''}`.trim(); } return ''; }; return ( {/* Header */}
{server.name} {/* Transport type badge */} {isHttp && ( {formatMessage({ id: 'mcp.transport.http' })} )} {/* Read-only badge */} {formatMessage({ id: 'mcp.codex.readOnly' })} {enabled && ( {formatMessage({ id: 'mcp.status.enabled' })} )}

{getServerSummary()}

{/* Disabled toggle button (visual only, no edit capability) */}
{enabled ? : }
{isExpanded ? ( ) : ( )}
{/* Expanded Content */} {isExpanded && (
{/* HTTP Server Details */} {isHttp && ( <> {/* URL */}

{formatMessage({ id: 'mcp.http.url' })}

{server.url}
{/* HTTP Headers - show count only for read-only card */} {(server.headers || server.httpHeaders || server.bearerTokenEnvVar) && (

{formatMessage({ id: 'mcp.http.headers' })}

{server.headers && Object.entries(server.headers).map(([name]) => (
{name} = ****
))} {server.httpHeaders && Object.entries(server.httpHeaders).map(([name]) => (
{name} = ****
))} {server.bearerTokenEnvVar && (
Authorization = Bearer $${server.bearerTokenEnvVar} {formatMessage({ id: 'mcp.http.envVar' })}
)}
)} )} {/* STDIO Server Details */} {isStdio && ( <> {/* Command details */}

{formatMessage({ id: 'mcp.command' })}

{server.command}
{/* Args */} {server.args && server.args.length > 0 && (

{formatMessage({ id: 'mcp.args' })}

{server.args.map((arg: string, idx: number) => ( {arg} ))}
)} {/* Environment variables */} {server.env && Object.keys(server.env).length > 0 && (

{formatMessage({ id: 'mcp.env' })}

{Object.entries(server.env).map(([key, value]) => (
{key} = {value as string}
))}
)} )} {/* Read-only notice */}

{formatMessage({ id: 'mcp.codex.readOnlyNotice' })}

)}
); } export default CodexMcpCard;