{ "name": "mcp-capability-matrix", "type": "registry:ui", "title": "MCP Capability Matrix", "description": "Which server provides which capability, and where two of them collide. MCP names are not namespaced by the protocol, so two servers exposing `search` is decided by your client’s merge order — silently. A per-server list can never show that.", "category": "MCP", "dependencies": [ "lucide-react@^1.39.0" ], "registryDependencies": [ "badge", "lib-motion", "lib-styles", "lib-utils" ], "files": [ { "path": "components/ui/mcp-capability-matrix.tsx", "type": "registry:ui", "content": "import type { ComponentProps, ReactNode } from 'react'\nimport { Check, TriangleAlert } from 'lucide-react'\nimport { Badge } from '@/components/ui/badge'\nimport { enterFade } from '@/lib/motion'\nimport { radius, surface } from '@/lib/styles'\nimport { cn } from '@/lib/utils'\n\n/**\n * Which server provides which capability, and where two of them collide.\n *\n * The problem this exists for: MCP capability names are not namespaced by the\n * protocol. Connect two servers that both expose `search`, and which one the\n * model reaches is decided by your client's merge order — silently. A per-server\n * list can never show that, because the collision only exists *between* lists.\n *\n * So the grid is capabilities down, servers across, and any row with more than\n * one provider is flagged. That flag is the entire reason to render a matrix\n * rather than a set of cards.\n *\n * Grid, not a table element: the header column is sticky while the server\n * columns scroll, which `