open-mcp-apps

open-mcp-apps

An open engine that gives AI persistent, reusable UI components with a writable component registry, versioned data storage, and a shell runtime, enabling AI to create, save, and reuse single-purpose apps.

Category
访问服务器

README

open-mcp-apps

English | 简体中文

Give your AI a persistent, reusable UI. It builds the component once — you keep it forever.

open-mcp-apps is an open engine built on the MCP Apps standard (ui://, SEP-1865). It gives any MCP-Apps-capable host (Claude Desktop, claude.ai, …) three things the standard itself doesn't provide:

  1. A component registry the AI can write to. Ask for a UI that doesn't exist — the AI reads the authoring guide, writes a single-file HTML component against a tiny window.oma API, and saves it. From that moment open_<name> is a tool, in this chat and every future one.
  2. Persistent, versioned data — separate from the UI. Components bind to generic collections of items backed by SQLite plus an append-only change_event ledger. Every mutation is an idempotent domain command (command_id) with optimistic concurrency (expected_version). The AI and the human edit the same store — the widget is just a view.
  3. A shell runtime so AI-written components actually work. Serving ui://, the engine wraps the component with the official MCP App bridge, host theming (Claude's design tokens, light/dark), and the window.oma data API. A component is ~50 lines of view code; the protocol, persistence, idempotency and theming are the engine's problem.

The loop

"make me a kanban"
      │
      ▼
list_components ── exists? ──► open_kanban          (reuse, instant)
      │ no
      ▼
get_component_guide ──► AI writes HTML ──► save_component
      │
      ▼
open_kanban  →  rendered inline, themed, persistent — reusable in every future chat

Components accumulate. Each one is single-purpose and independent — a board, a tracker, a splitter — minted for the task in front of you and kept for the next time you need it.

Install (Claude Desktop)

Fastest — hand it to an AI with shell access (Claude Code, or any agent that can run commands). Paste:

Read https://raw.githubusercontent.com/2nd1st/open-mcp-apps/main/INSTALL.md and follow it.

The agent clones, builds, seeds, and registers the server in your Claude Desktop config. (Any install needs a shell — this just hands the shell steps to the agent instead of to you.)

Or do it yourself — one command after cloning:

git clone https://github.com/2nd1st/open-mcp-apps && cd open-mcp-apps
node install.mjs

install.mjs installs deps, builds the shell, seeds the components, and merges an open-mcp-apps entry into claude_desktop_config.json without clobbering your other servers (pinning the exact node that ran it, for the native SQLite ABI). Prefer to wire it up by hand? Run npm install && node build.mjs && node seed.mjs, then add this yourself (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "open-mcp-apps": {
      "command": "node",
      "args": ["/absolute/path/to/open-mcp-apps/src/server.mjs"]
    }
  }
}

Restart Claude Desktop. New here? Open the onboard prompt from the + / slash menu — the AI looks at what you do and proposes a few single-purpose apps worth keeping, then builds the ones you pick. Or just ask directly:

  • "show my kanban board" → renders the seed kanban (drag & drop, persistent)
  • "make me a habit tracker" → watch it read the guide, write the component, save it, open it
  • close the app, reopen, ask again → everything is still there

First-run permissions: the first few tool calls each show an approval dialog — pick "Always allow". The tool set is small and stable on purpose: read-only tools generally skip approval, and the single open_component tool covers opening every component (including ones the AI creates later), so after those first clicks it's zero-prompt forever. You can also batch it in Settings → Connectors → open-mcp-apps → Tool permissions. Note: a Desktop auto-update occasionally resets these decisions (upstream #56954) — just re-allow. Multiple widgets in one conversation work fine (kanban + notes + pomodoro side by side).

What's in the box

src/server.mjs stdio MCP server; single open_component path (per-component open_<name> tools opt-in)
src/http.mjs /mcp (stateless Streamable HTTP) + /view/<name> browser viewer, bound to 127.0.0.1
src/store.mjs SQLite: items + component registry + change_event ledger (idempotent, OCC)
src/shell-runtime.js browser runtime injected into every component (window.oma)
src/shell.mjs wraps stored HTML with runtime + design-token fallbacks at serve time
src/guide.mjs the authoring contract the AI reads before generating a component
components/ seed components — 6 apps (kanban, todo, pomodoro, notes, expense-split, reading-list) + 2 system (settings, dashboard)
node test/server-smoke.mjs   # 113 assertions over real stdio — incl. runtime component creation
node test/http-smoke.mjs     #  16 assertions over the HTTP transport
node test/seed-smoke.mjs     #   7 assertions on the seed / design-kit pipeline

Design positions (why it's built this way)

  • UI and data persist separately, both versioned. Components are views; collections are truth; the ledger is history. Swap either without losing the other.
  • The AI talks domain commands, never SQL, never raw state. That's what makes human+AI concurrent editing safe (idempotency + optimistic concurrency at the command layer).
  • Standard-first. Everything rides the MCP Apps standard bridge — no host-private APIs. One codebase should serve every host that renders ui://.
  • Single-purpose, not composite. Each app owns one scenario and its own collection; the engine mints a new one rather than cramming features into an old one. System apps (settings, dashboard) are the deliberate exception — engine-owned, privileged, allowed to see across collections.

Security model

Trust is tiered by where a component came from. Locally-authored and system components run in direct mode. The engine also ships a runner — a sandboxed srcdoc iframe with a CSP-first document and a minimal read-scoped bridge — as the mandatory execution mode for any component that isn't locally trusted, plus reserved security:* / policy:* config keys that generic data writes can't touch and an out-of-band privileged writer.

Honest status: the runner is built and tested but dormant — there is no install-from-elsewhere path yet, so nothing untrusted actually reaches it today. It exists so the door is already the right shape when a shared library lands. Treat it as a foundation, not a shipped guarantee.

Host support (live-tested 2026-07-22)

Host Renders widgets Human clicks widget AI operates data Same store
Claude Desktop (local stdio) ✅ full loop incl. sendMessage reply
Browser viewer (/view/<name>) ✅ (no chat attached — sendMessage degrades to a notice) via CLI AI
Codex desktop (ChatGPT app, enable_mcp_apps flag) ✅ experimental ❌ host's widget→server proxy not wired yet (openai/codex#28912)
codex CLI / IDE — (text fallback by design)
ChatGPT web (Work mode) supported by the standard — needs remote HTTPS (/mcp + tunnel), untested here

Everything rides the standard bridge, so host fixes upstream (e.g. #28912) benefit this project with zero changes.

Status / roadmap

Early v0 — proven end-to-end on Claude Desktop; cross-vendor render + shared store proven on Codex desktop and the browser viewer.

  • [x] engine: registry + shell + generic data commands + ledger
  • [x] seed components: 6 apps + 2 system components
  • [x] AI component creation loop (guide → save → dynamic tool)
  • [x] MCP-native onboarding (onboard prompt + instructions hook)
  • [x] security foundation: trust tiers + sandboxed runner + reserved config keys
  • [ ] npx one-command install
  • [ ] remote (Streamable HTTP) mode → claude.ai / ChatGPT / mobile
  • [ ] component export/import → sharing → community library
  • [ ] activate the runner path for shared/untrusted components

MIT © 2nd1st

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选