import type { MCPServer } from '~/lib/services/mcpService';
import McpStatusBadge from '~/components/@settings/tabs/mcp/McpStatusBadge';
import McpServerListItem from '~/components/@settings/tabs/mcp/McpServerListItem';
type McpServerListProps = {
serverEntries: [string, MCPServer][];
expandedServer: string | null;
checkingServers: boolean;
onlyShowAvailableServers?: boolean;
toggleServerExpanded: (serverName: string) => void;
};
export default function McpServerList({
serverEntries,
expandedServer,
checkingServers,
onlyShowAvailableServers = false,
toggleServerExpanded,
}: McpServerListProps) {
if (serverEntries.length === 0) {
return
No MCP servers configured
;
}
const filteredEntries = onlyShowAvailableServers
? serverEntries.filter(([, s]) => s.status === 'available')
: serverEntries;
return (
{filteredEntries.map(([serverName, mcpServer]) => {
const isAvailable = mcpServer.status === 'available';
const isExpanded = expandedServer === serverName;
const serverTools = isAvailable ? Object.entries(mcpServer.tools) : [];
return (
toggleServerExpanded(serverName)}
className="flex items-center gap-1.5 text-bolt-elements-textPrimary"
aria-expanded={isExpanded}
>
{serverName}
{mcpServer.config.type === 'sse' || mcpServer.config.type === 'streamable-http' ? (
{mcpServer.config.url}
) : (
{mcpServer.config.command} {mcpServer.config.args?.join(' ')}
)}
{checkingServers ? (
) : (
)}
{/* Error message */}
{!isAvailable && mcpServer.error && (
Error: {mcpServer.error}
)}
{/* Tool list */}
{isExpanded && isAvailable && (
Available Tools:
{serverTools.length === 0 ? (
No tools available
) : (
{serverTools.map(([toolName, toolSchema]) => (
))}
)}
)}
);
})}
);
}