NV Elements Catalog Starters Repo System Themes Getting Started Getting Started Installation CLI MCP Skills Lint Integrations Getting Started Angular Bundles Custom Elements Golang Hugo Import Maps Lit Lit Library MCP Apps NextJS Nuxt Preact React SolidJS Svelte TypeScript Vue About Changelog Metrics Support Accessibility Contributions Requests Migration Foundations Typography Iconography Themes Design Tokens Size & Space Objects Interactions Support Status Color Animation Fonts Layers Custom Layout Horizontal Vertical Grid Popovers i18n Visualization View Transitions Elements Accordion Alert Avatar Badge Breadcrumb Button Button Group Card Chat Message Checkbox Color Combobox Copy Button Datagrid Integrations Column Action Column Alignment Column Fixed Column width Container Card Display Settings Footer Heatmap Keynav Multi Select Pagination Panel Detail Panel Grid Performance Placeholder Row Action Row Groups Row Sort Scroll Height Single Select Stripe Date Datetime Dialog Divider Dot Drawer Dropdown Dropdown Group Dropzone File Format Datetime Format Number Format Relative Time Forms Validation Actions Control Icon Icon Button Input Input Group Logo Menu Month Notification Page Page Header Page Loader Pagination Panel Progressive Filter Chip Progress Bar Progress Ring Password Preferences Input Pulse Radio Range Resize Handle Search Select Skeleton Sort Button Sparkline Star Rating Steps Switch Tabs Tag Textarea Time Toast Toggletip Toolbar Tooltip Tree Week Patterns Authentication Browse Chat Dashboard Editor Empty States Heatmap Keyboard Shortcut Logging Media Navigation Onboarding Panel Responsive Search Subheader Trend Code Codeblock Monaco Input Diff Input Editor Diff Editor Problems Markdown Markdown CSS Utility Labs Responsive Layout Viewport Container Patterns Forms API Design Properties & Attributes Slots Registration CustomEvents Stateless Composition Styles Packaging Glossary Logs Internal Guidelines Agent Harness Agent Tooling Agent Ownership Documentation Examples TypeScript Testing Unit Testing Accessibility Testing Lighthouse Testing SSR Testing Visual Testing Troubleshooting Component Creation Internal Examples All Examples

MCP Apps

Demo Download Source Documentation

Elements components are standard Web Components. They run anywhere the host can render HTML and load JavaScript modules. This includes browser apps, framework apps, static HTML pages, and iframe-based MCP UI surfaces.

MCP Apps render tool UI inside an isolated iframe. The host controls the container, fetches a ui:// HTML resource from the MCP server, and passes tool input and results to the view through the MCP Apps message channel. Because Elements registers native custom elements such as nve-page, nve-alert, and nve-button, the app view does not need a React, Vue, or Svelte adapter to render.

Install CLI

Install the Elements CLI to your system. This will add the nve command to your path and provide several helpful commands for working with Elements.

MacOS / Linux Windows CMD NodeJS

    

Create a New Project

Use the Elements CLI to quickly bootstrap a new mcp-app project with the necessary dependencies:


    

Setup an Existing Project

Setup an existing project to use Elements you can use the setup command to add the necessary dependencies and configure the MCP server.


    

If not yet done, install NodeJS. NodeJS is a JavaScript runtime that has a large ecosystem of tooling and packages for Web Development. Once installed the Node Package Manager (NPM) will be available for use.

Manual Integration

If installing to an existing project, install the core dependencies:


    

Minimal App Shape

An MCP App using Elements has three pieces:

  1. An MCP tool that declares _meta.ui.resourceUri.
  2. A matching ui:// HTML resource served with text/html;profile=mcp-app.
  3. A browser view that imports Elements, connects to the host, and renders tool data.

    

The HTML resource can use Elements exactly like any other web page:


    

Register only the Elements used by the app:


    

Layout And Sizing

MCP hosts own the iframe. The app should treat host dimensions as constraints, not as a canvas it can force to a fixed width.

Read app.getHostContext().containerDimensions after connecting. If the host provides a fixed width, let the app fill it. If it provides maxWidth, keep the layout responsive up to that maximum. The MCP Apps SDK sends size-change notifications by default, so the host can resize flexible containers as the app content changes.