| # 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. |
|
|