Every MCP client rebuilds the same seven screens MCP Elements, a new open-source component library, provides 38 UI components for building MCP clients, addressing the repetitive work of implementing screens like tool-call cards, consent dialogs, and server status indicators. The library uses a framework-agnostic core with adapters for React, Angular, and Vue, allowing developers to copy components directly into their projects via CLI without runtime dependencies. It aims to simplify MCP client development by offering composable, accessible primitives that follow the shadcn model. MCP went from 2M to 97M monthly SDK downloads in a year. There are over 9,400 servers in the registry. A lot of people are suddenly building MCP clients — and if you've built one, you already know where this is going, because you've built these screens: None of these are hard the first time you describe them. All of them are annoying the third time you build them. The tool-call card alone is a state machine with six states idle, pending, running, done, error, cancelled , retry logic, theme tokens, and accessibility work — call it a week if you do it properly, which is exactly why most clients don't. The chat side of this stack is well served. Vercel's AI Elements, assistant-ui, CopilotKit — good projects. But they're React-only CopilotKit also does Angular , and none of them ship the MCP-specific pieces. The one multi-framework option, Deep Chat, is a single monolithic widget, not primitives you can compose. When I went looking for a consent dialog I could copy into an Angular app, there wasn't one. So I built the set. 38 components you copy into your project with a CLI: npx mcp-elements add mcp-tool-call That drops the component source, its CSS, and the core state machine it uses into your repo, with imports rewritten to relative paths. There is no runtime dependency to upgrade or get broken by. If you want to change how the retry button works, you edit the file. It's the shadcn model, applied to MCP. Seven components are MCP-specific — the list above. The other 31 are the base and AI pieces you need around them: chat bubble, streaming text, prompt input, source card, buttons, dialogs, the usual. Here's a full MCP flow in three components: js import { McpServerStatus, McpToolCall, McpConsentDialog } from '@mcp-elements/react' import { createToolState } from '@mcp-elements/core' // 1. Connection state