Client Core
FreeNot checkedRenderer-agnostic in-iframe runtime for MCP Apps: the only postMessage JSON-RPC peer.
About
Renderer-agnostic in-iframe runtime for MCP Apps: the only postMessage JSON-RPC peer.
README
A less-opinionated, multi-renderer framework for building MCP Apps — interactive UIs returned from Model Context Protocol tools and rendered inside hosts like Claude, ChatGPT and VS Code.
It implements the MCP Apps / mcp-ui contract (a tool binds a ui:// HTML
resource rendered in a sandboxed iframe, talking back over JSON-RPC postMessage), but unlike
Skybridge it is deliberately unopinionated:
- Server on Hono — runs on Node and Cloudflare Workers, not Express.
- Pluggable renderer, chosen per app — author components in Vue or Flutter, both first-class.
- End-to-end type safety from
zodtool schemas: inferred typed hooks in Vue, generated typed Dart models for Flutter. - Full local dev — a host emulator, hot reload, and a public tunnel.
Documentation
Full documentation lives in docs/ — a Nuxt/Docus site deployed to Cloudflare Workers.
pnpm docs:dev # run the docs site locally (http://localhost:7001)
pnpm docs:deploy # build (SSG) + wrangler deploy
Packages
| Package | Responsibility |
|---|---|
@mcpapps/protocol |
Pure types + constants for the MCP Apps / mcp-ui contract. Single source of truth. |
@mcpapps/client-core |
The renderer-agnostic in-iframe runtime: the only postMessage JSON-RPC peer. |
@mcpapps/server |
Hono-mountable MCP server: defineApp/defineTool, ui:// resource serving. |
@mcpapps/vue |
Vue hooks (useToolResult/useCallTool/useTheme) + renderer adapter. |
@mcpapps/vite-plugin-vue |
Compiles a .vue component into a self-contained ui:// HTML resource. |
@mcpapps/flutter |
Compiles a Flutter Web app into a ui:// component (loader HTML + cached assets). |
mcpapps_bridge (Dart) |
Dart↔host bridge (runMcpApp, McpApp.of(context)) over client-core via js_interop. |
@mcpapps/dev |
Local host emulator + Cloudflare tunnel. |
@mcpapps/cli |
@mcpapps/create scaffolder + the mcpapps CLI. |
@mcpapps/typegen |
Generate typed Dart models from zod schemas (zod → JSON Schema → Dart). |
The mcpapps CLI
Inside a project (with an mcpapps.config.ts):
mcpapps dev # host emulator with live-reload (edit a component → it re-renders)
mcpapps serve # MCP server over HTTP (add --stdio for the stdio transport)
mcpapps build # compile components
mcpapps deploy # compile + wrangler deploy
Live-reload re-renders the component on save and replays the last tool result, so edits appear instantly without losing state.
Renderers
Each app picks one renderer. Vue components are self-contained (tens of KB) and
ideal for lightweight cards. Flutter components are richer but multi-megabyte
(CanvasKit): the emulator can serve their asset bundle via iframe src, while deployed
hosts usually receive one inlined HTML document (often rendered with srcdoc). Flutter is
best for stateful/graphical UIs, and should use McpAutoSize for tall content plus
callTool/McpAppHttpClient for backend calls from opaque-origin iframes. Both renderers
consume the same host bridge, so the server, emulator, and protocol are identical across
them.
Create a new app
pnpm create @mcpapps my-app # Vue (default)
pnpm create @mcpapps my-app --renderer flutter
cd my-app && pnpm install && pnpm dev
(or npm create @mcpapps@latest my-app). The scaffolder generates a complete project —
a tool with zod schemas, a component, the Hono server, a Workers entry, and the
dev emulator — wired and ready to run.
Quick start (this repo)
pnpm setup # install + codegen
pnpm dev # runs the Vue example emulator -> http://localhost:5179
pnpm check # biome ci + typecheck + test (the CI gate)
To run the Flutter example (needs Flutter — auto-detected via FLUTTER_BIN,
your PATH, or fvm) on http://localhost:5189:
pnpm dev:flutter # alias for: pnpm --filter @mcpapps/example-weather-flutter start
pnpm dev:vue # the Vue example explicitly (same as pnpm dev)
Status
Under active development. See docs / the plan for the milestone roadmap (M1 Vue vertical slice
first, then real-host hardening, then the Flutter renderer).
Install Client Core in Claude Desktop, Claude Code & Cursor
unyly install client-coreInstalls into Claude Desktop, Claude Code, Cursor & VS Code — handles npx, uvx and build-from-source repos for you.
First time? Get the CLI: curl -fsSL https://unyly.org/install | sh
Or configure manually
Run in your terminal:
claude mcp add client-core -- npx -y @mcpapps/client-coreFAQ
Is Client Core MCP free?
Yes, Client Core MCP is free — one-click install via Unyly at no cost.
Does Client Core need an API key?
No, Client Core runs without API keys or environment variables.
Is Client Core hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Client Core in Claude Desktop, Claude Code or Cursor?
Open Client Core on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
LibreOffice Tools
Enables AI agents to read, write, and edit Office documents via LibreOffice with token-efficient design. Supports multiple formats including DOCX, XLSX, PPTX, a
by passerbyflutterdannote/figma-use
Full Figma control: create shapes, text, components, set styles, auto-layout, variables, export. 80+ tools.
by dannoteLogo.dev
Search and retrieve company logos by brand or domain. Customize size, format, and theme to match your design needs. Accelerate design, prototyping, and content
by NOVA-3951PIX4Dmatic
Enables GUI automation for controlling PIX4Dmatic on Windows through MCP. Supports launching, focusing, capturing screenshots, sending hotkeys, clicking UI elem
by jangjo123Compare Client Core with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All design MCPs
