{"slug": "every-mcp-client-rebuilds-the-same-seven-screens", "title": "Every MCP client rebuilds the same seven screens", "summary": "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.", "body_md": "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:\n\nNone 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.\n\nThe 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.\n\n38 components you copy into your project with a CLI:\n\n```\nnpx mcp-elements add mcp-tool-call\n```\n\nThat 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.\n\nSeven 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.\n\nHere's a full MCP flow in three components:\n\n``` js\nimport { McpServerStatus, McpToolCall, McpConsentDialog } from '@mcp-elements/react'\nimport { createToolState } from '@mcp-elements/core'\n\n// 1. Connection state\n<McpServerStatus status=\"connected\" serverName=\"github-mcp\" />\n\n// 2. OAuth consent\n<McpConsentDialog\n  open={showConsent}\n  serverName=\"GitHub MCP\"\n  scopes={['repo:read', 'user.email:read']}\n  onApprove={handleApprove}\n  onDeny={handleDeny}\n/>\n\n// 3. Tool execution\nconst toolState = createToolState()\ntoolState.start({ tool: 'search_repos', args: { query: 'mcp-elements' } })\n\n<McpToolCall state={toolState} onRetry={() => toolState.reset()} />\n```\n\nThe architecture is three layers, and the layering is the whole trick:\n\nBecause the state machine and the stylesheet are shared, the React and Angular versions of `McpToolCall`\n\ndon't just look the same — they *behave* the same, transition for transition. When I fixed a focus-management bug in the dialog last week, the fix was the same fix in all three frameworks, because the bug lived in one place.\n\nThis is also my answer to a complaint I kept seeing in issue trackers: the Svelte request on vercel/ai-elements has been open since September 2025. Framework-agnostic core plus thin adapters means adding a framework is a bounded amount of work, not a rewrite. Svelte and Lit adapters are on the roadmap.\n\nThings that took longer than the happy path, and that you get for free by copying:\n\n`aria-live`\n\nso state changes are announced. Almost no AI component library handles this.It's not an MCP client SDK — you bring your own connection and wire its events into the state machines. It's not a chat framework; there's no runtime, no provider, no cloud anything. And it's v0.1: all seven MCP components ship for all three frameworks, the base set is complete in React and Angular, and Vue has ten of the base components so far, with the rest in progress.\n\nThe MCP Apps frame tracks the spec as published in January 2026. The spec is young. If it moves, the component moves — and since you own the copy in your repo, you decide when to take that update.\n\nThe docs site renders every component live on the page — the playground demos are the actual components running, not screenshots:\n\n`npx mcp-elements add mcp-tool-call`\n\nMIT licensed. If you've built an MCP client and something you needed isn't in the set, open an issue — the next batch of components gets picked from real gaps, not my guesses.", "url": "https://wpnews.pro/news/every-mcp-client-rebuilds-the-same-seven-screens", "canonical_source": "https://dev.to/mayurrawte/every-mcp-client-rebuilds-the-same-seven-screens-1764", "published_at": "2026-07-07 13:51:16+00:00", "updated_at": "2026-07-07 13:58:47.936107+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools", "large-language-models", "ai-infrastructure"], "entities": ["MCP Elements", "Vercel", "CopilotKit", "Deep Chat", "shadcn", "GitHub", "Svelte", "Lit"], "alternates": {"html": "https://wpnews.pro/news/every-mcp-client-rebuilds-the-same-seven-screens", "markdown": "https://wpnews.pro/news/every-mcp-client-rebuilds-the-same-seven-screens.md", "text": "https://wpnews.pro/news/every-mcp-client-rebuilds-the-same-seven-screens.txt", "jsonld": "https://wpnews.pro/news/every-mcp-client-rebuilds-the-same-seven-screens.jsonld"}}