React MCP SPA
React MCP SPA
Eine minimale React Single-Page-Anwendung, die in einen einzelnen HTML-Blob gebündelt und von einem MCP Apps-Server bereitgestellt wird. Die SPA verwendet kein URL-Pfad-Routing – sie wählt die zu rendernde Seite aus, indem sie den aktuellen Tool-Namen aus dem MCP-Host-Kontext liest.
Layout
packages/ui/ — React + Vite SPA, erstellt als ein einzelner HTML-Blob mittels
vite-plugin-singlefile.packages/mcp/ — MCP-Server unter Verwendung von
@modelcontextprotocol/ext-apps/server. Registriert Tools (show-home,show-counter,show-profile), die alle auf dieselbeui://-Ressource verweisen.packages/playground/ — Entwicklungs-Tool, das die SPA innerhalb einer Mock-Chat-UI mit JSON-Eingaben für
hostContextundtoolResultrendert, sodass Seiten ohne einen MCP-Host getestet werden können.
Installation
Erfordert Node.js ≥ 20 und pnpm ≥ 9.
pnpm installEntwicklung der UI in Isolation
pnpm run dev:uiÖffnen Sie die ausgegebene URL (z. B. http://localhost:5173). Die SPA erkennt, dass kein MCP-Host vorhanden ist, und zeigt eine Routenauswahl an, damit Sie jede Seite in der Vorschau ansehen können.
Playground — Rendering ohne MCP testen
pnpm run dev:playgroundÖffnet sich unter http://localhost:5174. Der Playground verwendet den echten Routen-Renderer der SPA (RouteRenderer aus packages/ui/src/Router.tsx) und bettet ihn in eine Mock-Chat-UI ein. Der Header verfügt über zwei JSON-Textbereiche – einen für den hostContext (steuert über toolInfo.tool.name, welche Seite gerendert wird) und einen für das toolResult, das an die Seite übergeben wird. Preset-Schaltflächen laden fertige Kontext-Ergebnis-Paare für jedes registrierte Tool; Änderungen an einem der Textbereiche rendern die Tool-Ausgabe-Sprechblase des Assistenten live neu.
MCP-Server erstellen und ausführen
pnpm run build # builds packages/ui → dist/index.html, then packages/mcp
pnpm run serve:mcp # starts Streamable HTTP server on http://localhost:3001/mcpFür stdio-Transport:
pnpm --filter @react-mcp-spa/mcp run serve:stdioBereitstellung des Servers mit cloudflared
Einige MCP-Clients (einschließlich gehosteter) können localhost nicht erreichen. Verwenden Sie cloudflared, um einen schnellen Tunnel zu öffnen, der eine öffentliche HTTPS-URL zuweist.
Installieren Sie cloudflared über Ihren Betriebssystem-Paketmanager:
# 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.cloudflaredStarten Sie den Server lokal:
pnpm run serve:mcpFühren Sie in einem anderen Terminal Folgendes aus:
cloudflared tunnel --url http://localhost:3001
# or: pnpm run tunnelcloudflared gibt eine URL wie https://<random>.trycloudflare.com aus. Hängen Sie /mcp an und verwenden Sie diese als Ihre MCP-Server-URL:
https://<random>.trycloudflare.com/mcpDer Tunnel bleibt bestehen, bis Sie cloudflared beenden. Für einen stabilen Hostnamen konfigurieren Sie einen benannten Cloudflare-Tunnel anstelle eines schnellen Tunnels.
Verpacken als Claude Desktop-Erweiterung (.mcpb)
Das Repo enthält einen Packer, der ein installierbares MCP Bundle für Claude Desktop erstellt. Die Erweiterung führt den Server über stdio aus – es ist kein Tunnel erforderlich.
pnpm run pack:mcpbDies erstellt beide Pakete, stellt den kompilierten Server + UI-HTML + Prod-node_modules unter build/mcpb-staging/ bereit und ruft mcpb pack auf, um Folgendes zu erzeugen:
build/react-mcp-spa.mcpbUm es zu installieren, doppelklicken Sie auf die .mcpb im Finder/Explorer (oder ziehen Sie sie auf Claude Desktop). Claude validiert das Manifest und registriert den Server; nach der Installation sind die drei Tools (show-home, show-counter, show-profile) verfügbar und jedes rendert seine Seite als Inline-React-UI.
Das Bundle-Manifest befindet sich unter mcpb/manifest.json — erhöhen Sie dort (und in packages/mcp/package.json) die version, wenn Sie ein neues Erweiterungs-Release erstellen.
Funktionsweise des Routings
Die SPA liest niemals window.location. Stattdessen verwendet packages/ui/src/App.tsx useApp() aus @modelcontextprotocol/ext-apps/react und:
Liest
app.getHostContext().toolInfo.tool.name, um zu wissen, welches Tool der Host aufgerufen hat – dies ist die "Route".Abonniert
app.ontoolresult, um dasCallToolResultvom Server zu empfangen und es als Daten an die Seite zu übergeben.Überwacht
app.onhostcontextchanged, damit Aktualisierungen von Design / Safe-Area / Gebietsschema korrekt neu gerendert werden.
Das Hinzufügen einer neuen Seite ist eine Änderung in zwei Schritten:
Registrieren Sie ein Tool in packages/mcp/src/server.ts, wobei
_meta.ui.resourceUriauf die gemeinsameui://react-mcp-spa/app.html-Ressource verweist.Fügen Sie einen Fall für den Tool-Namen in
renderRoute()innerhalb von packages/ui/src/App.tsx hinzu.
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