| # Example: Basic Server (React) | |
|  | |
| An MCP App example with a React UI. | |
| > [!TIP] | |
| > Looking for a vanilla JavaScript example? See [`basic-server-vanillajs`](https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/basic-server-vanillajs)! | |
| ## Overview | |
| - Tool registration with a linked UI resource | |
| - React UI using the [`useApp()`](https://modelcontextprotocol.github.io/ext-apps/api/functions/_modelcontextprotocol_ext-apps_react.useApp.html) hook | |
| - App communication APIs: [`callServerTool`](https://modelcontextprotocol.github.io/ext-apps/api/classes/app.App.html#callservertool), [`sendMessage`](https://modelcontextprotocol.github.io/ext-apps/api/classes/app.App.html#sendmessage), [`sendLog`](https://modelcontextprotocol.github.io/ext-apps/api/classes/app.App.html#sendlog), [`openLink`](https://modelcontextprotocol.github.io/ext-apps/api/classes/app.App.html#openlink) | |
| ## Key Files | |
| - [`server.ts`](server.ts) - MCP server with tool and resource registration | |
| - [`mcp-app.html`](mcp-app.html) / [`src/mcp-app.tsx`](src/mcp-app.tsx) - React UI using `useApp()` hook | |
| ## Getting Started | |
| ```bash | |
| npm install | |
| npm run dev | |
| ``` | |
| ## How It Works | |
| 1. The server registers a `get-time` tool with metadata linking it to a UI HTML resource (`ui://get-time/mcp-app.html`). | |
| 2. When the tool is invoked, the Host renders the UI from the resource. | |
| 3. The UI uses the MCP App SDK API to communicate with the host and call server tools. | |
| ## Build System | |
| This example bundles into a single HTML file using Vite with `vite-plugin-singlefile` — see [`vite.config.ts`](vite.config.ts). This allows all UI content to be served as a single MCP resource. Alternatively, MCP apps can load external resources by defining [`_meta.ui.csp.resourceDomains`](https://modelcontextprotocol.github.io/ext-apps/api/interfaces/app.McpUiResourceCsp.html#resourcedomains) in the UI resource metadata. | |