React MCP SPA
React MCP SPA
Una aplicación de página única (SPA) de React minimalista que se empaqueta en un único blob HTML y es servida por un servidor de MCP Apps. La SPA no utiliza enrutamiento de rutas URL; elige qué página renderizar leyendo el nombre de la herramienta actual desde el contexto del host MCP.
Estructura
packages/ui/ — SPA de React + Vite, compilada en un blob HTML de un solo archivo mediante
vite-plugin-singlefile.packages/mcp/ — Servidor MCP que utiliza
@modelcontextprotocol/ext-apps/server. Registra herramientas (show-home,show-counter,show-profile) que apuntan todas al mismo recursoui://.packages/playground/ — Entorno de desarrollo que renderiza la SPA dentro de una interfaz de chat simulada con entradas JSON para
hostContextytoolResult, para que las páginas puedan probarse sin un host MCP.
Instalación
Requiere Node.js ≥ 20 y pnpm ≥ 9.
pnpm installDesarrollar la interfaz de usuario de forma aislada
pnpm run dev:uiAbra la URL impresa (por ejemplo, http://localhost:5173). La SPA detecta que no hay un host MCP y muestra un selector de rutas para que pueda previsualizar cada página.
Playground — probar el renderizado sin MCP
pnpm run dev:playgroundSe abre en http://localhost:5174. El playground reutiliza el renderizador de rutas real de la SPA (RouteRenderer de packages/ui/src/Router.tsx) y lo envuelve en una interfaz de chat simulada. El encabezado tiene dos áreas de texto JSON: una para el hostContext (que determina qué página se renderiza mediante toolInfo.tool.name) y otra para el toolResult pasado a la página. Los botones preestablecidos cargan pares de contexto+resultado listos para cada herramienta registrada; las ediciones en cualquiera de las áreas de texto vuelven a renderizar en vivo la burbuja de salida de la herramienta del asistente.
Compilar y ejecutar el servidor MCP
pnpm run build # builds packages/ui → dist/index.html, then packages/mcp
pnpm run serve:mcp # starts Streamable HTTP server on http://localhost:3001/mcpPara transporte stdio:
pnpm --filter @react-mcp-spa/mcp run serve:stdioExponer el servidor con cloudflared
Algunos clientes MCP (incluidos los alojados) no pueden acceder a localhost. Utilice cloudflared para abrir un túnel rápido que asigne una URL HTTPS pública.
Instale cloudflared a través del gestor de paquetes de su sistema operativo:
# macOS (Homebrew)
brew install cloudflared
# Linux (Debian/Ubuntu)
# See https://pkg.cloudflare.com/ for the apt repo, or grab the .deb from
# https://github.com/cloudflare/cloudflared/releases
# Windows (winget)
winget install --id Cloudflare.cloudflaredInicie el servidor localmente:
pnpm run serve:mcpEn otra terminal, ejecute:
cloudflared tunnel --url http://localhost:3001
# or: pnpm run tunnelcloudflared imprime una URL como https://<random>.trycloudflare.com. Añada /mcp y utilícela como la URL de su servidor MCP:
https://<random>.trycloudflare.com/mcpEl túnel permanece activo hasta que cierre cloudflared. Para obtener un nombre de host estable, configure un túnel de Cloudflare con nombre en lugar de un túnel rápido.
Empaquetado como una extensión de Claude Desktop (.mcpb)
El repositorio incluye un empaquetador que produce un MCP Bundle instalable para Claude Desktop. La extensión ejecuta el servidor a través de stdio; no se requiere túnel.
pnpm run pack:mcpbEsto compila ambos paquetes, prepara el servidor compilado + HTML de la interfaz de usuario + node_modules de producción en build/mcpb-staging/, e invoca mcpb pack para producir:
build/react-mcp-spa.mcpbPara instalarlo, haga doble clic en el archivo .mcpb en Finder/Explorer (o arrástrelo a Claude Desktop). Claude valida el manifiesto y registra el servidor; después de la instalación, las tres herramientas (show-home, show-counter, show-profile) estarán disponibles y cada una renderizará su página como una interfaz de usuario de React en línea.
El manifiesto del paquete se encuentra en mcpb/manifest.json — actualice la version allí (y en packages/mcp/package.json) al realizar una nueva versión de la extensión.
Cómo funciona el enrutamiento
La SPA nunca lee window.location. En su lugar, packages/ui/src/App.tsx utiliza useApp() de @modelcontextprotocol/ext-apps/react y:
Lee
app.getHostContext().toolInfo.tool.namepara saber qué herramienta invocó el host; esta es la "ruta".Se suscribe a
app.ontoolresultpara recibir elCallToolResultdel servidor y pasarlo a la página como datos.Observa
app.onhostcontextchangedpara que las actualizaciones de tema / área segura / configuración regional se rendericen correctamente.
Añadir una nueva página es un cambio de dos pasos:
Registre una herramienta en packages/mcp/src/server.ts con
_meta.ui.resourceUriapuntando al recurso compartidoui://react-mcp-spa/app.html.Añada un caso para el nombre de la herramienta en
renderRoute()dentro de packages/ui/src/App.tsx.
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/billy-yoyo/McpReactSpa'
If you have feedback or need assistance with the MCP directory API, please join our Discord server