React MCP SPA
React MCP SPA
Минималистичное одностраничное приложение (SPA) на React, упакованное в один HTML-файл и обслуживаемое сервером MCP Apps. SPA не использует маршрутизацию по URL-путям — оно выбирает, какую страницу отобразить, считывая имя текущего инструмента из контекста хоста MCP.
Структура
packages/ui/ — SPA на React + Vite, собираемое в единый HTML-файл с помощью
vite-plugin-singlefile.packages/mcp/ — MCP-сервер, использующий
@modelcontextprotocol/ext-apps/server. Регистрирует инструменты (show-home,show-counter,show-profile), которые указывают на один и тот же ресурсui://.packages/playground/ — инструмент для разработки, который отображает SPA внутри имитации чата с JSON-вводами для
hostContextиtoolResult, чтобы страницы можно было тестировать без MCP-хоста.
Установка
Требуется Node.js версии ≥ 20 и pnpm версии ≥ 9.
pnpm installРазработка UI в изоляции
pnpm run dev:uiОткройте указанный URL (например, http://localhost:5173). SPA обнаружит отсутствие MCP-хоста и покажет выбор маршрута, чтобы вы могли просмотреть каждую страницу.
Playground — тестирование рендеринга без MCP
pnpm run dev:playgroundОткрывается по адресу http://localhost:5174. Playground повторно использует реальный рендерер маршрутов SPA (RouteRenderer из packages/ui/src/Router.tsx) и оборачивает его в имитацию чата. В заголовке есть два текстовых поля JSON — одно для hostContext (определяет, какая страница отображается через toolInfo.tool.name), и другое для toolResult, передаваемого на страницу. Кнопки пресетов загружают готовые пары контекст+результат для каждого зарегистрированного инструмента; изменения в любом из текстовых полей обновляют вывод инструмента помощника в реальном времени.
Сборка и запуск 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/mcpДля транспорта stdio:
pnpm --filter @react-mcp-spa/mcp run serve:stdioПубликация сервера через cloudflared
Некоторые MCP-клиенты (включая облачные) не могут получить доступ к localhost. Используйте cloudflared, чтобы открыть быстрый туннель, который присваивает публичный HTTPS URL.
Установите cloudflared через менеджер пакетов вашей ОС:
# 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.cloudflaredЗапустите сервер локально:
pnpm run serve:mcpВ другом терминале выполните:
cloudflared tunnel --url http://localhost:3001
# or: pnpm run tunnelcloudflared выведет URL вида https://<random>.trycloudflare.com. Добавьте /mcp и используйте его как URL вашего MCP-сервера:
https://<random>.trycloudflare.com/mcpТуннель остается активным, пока вы не завершите работу cloudflared. Для получения стабильного имени хоста настройте именованный туннель Cloudflare вместо быстрого туннеля.
Упаковка в качестве расширения Claude Desktop (.mcpb)
В репозитории есть упаковщик, который создает устанавливаемый MCP Bundle для Claude Desktop. Расширение запускает сервер через stdio — туннель не требуется.
pnpm run pack:mcpbЭта команда собирает оба пакета, подготавливает скомпилированный сервер + UI HTML + рабочие node_modules в папке build/mcpb-staging/ и вызывает mcpb pack для создания:
build/react-mcp-spa.mcpbЧтобы установить его, дважды щелкните файл .mcpb в Finder/Explorer (или перетащите его в Claude Desktop). Claude проверит манифест и зарегистрирует сервер; после установки три инструмента (show-home, show-counter, show-profile) станут доступны, и каждый из них будет отображать свою страницу как встроенный React UI.
Манифест пакета находится в mcpb/manifest.json — обновляйте там version (а также в packages/mcp/package.json) при выпуске новой версии расширения.
Как работает маршрутизация
SPA никогда не считывает window.location. Вместо этого packages/ui/src/App.tsx использует useApp() из @modelcontextprotocol/ext-apps/react и:
Считывает
app.getHostContext().toolInfo.tool.name, чтобы узнать, какой инструмент вызвал хост — это и есть "маршрут".Подписывается на
app.ontoolresult, чтобы получитьCallToolResultот сервера и передать его на страницу в качестве данных.Отслеживает
app.onhostcontextchanged, чтобы обновления темы, безопасных областей (safe-area) или локали корректно перерисовывались.
Добавление новой страницы — это двухэтапный процесс:
Зарегистрируйте инструмент в packages/mcp/src/server.ts с
_meta.ui.resourceUri, указывающим на общий ресурсui://react-mcp-spa/app.html.Добавьте case для имени инструмента в
renderRoute()внутри 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