MCP.Market

Open Apps MCP server

by 2nd1st·io.github.2nd1st/open-mcp-apps·v0.5.9·36 stars

Persistent, interactive MCP Apps — the AI builds an app once, you both reuse it

A92/100grade A
What users say
No reviews yet
Be the first
Safety scan
A92/100

full report

Adoption
Growing

36 stars117 downloads/wk

Reviews

Write one

Nobody has reviewed Open Apps yet.

If you have run it, two minutes of your experience saves the next person an afternoon.

Open Apps tools (32, 10 write)

write = sends, deletes, buys or posts

Read from the package source without running it. The installed server may list more.

  • app_history

    List an app's checkpoints as {checkpoint, ts, ui_size} — metadata only, NEVER the source (keeps context small; use get_app for the current source). Checkpoint 1 is the oldest; restore_app takes that number. History survives delete_app (tombstone). Each checkpoint snapshots BOTH slots (ui + manifest); restore brings back the pair.

  • app_html

    Internal: returns raw app HTML plus its trust tier and capability grants for the universal loader widget. Not useful to call directly — use get_app to read source.

  • app_store_list

    Browse the built-in App Store: ready-made, high-quality apps shipped with the engine that the user can install into their registry. Shows install state. Renders no UI — open_app {app: "app-store"} shows the browsable App Store app.

  • app_store_preview

    Internal: returns an App Store entry's ui and manifest plus its mock-data fixtures, so the App Store app can render a LIVE sandboxed preview card (srcdoc + stub oma + mock snapshot). Read-only; nothing is installed. Not useful to call directly.

  • call_functionwrite action

    Run a function an app declares (manifest.functions) — data in, data out, no UI needed. Args are checked against the declared params; failures return the declared schema so the retry needs no extra read. The reply carries the return value plus a receipt per write.

  • data_add_item

    Add an item to a collection. `group` is the app-defined lane/section (e.g. a kanban column); `fields` is a JSON object (e.g. {title, done, notes…}).

  • data_batch
  • data_changes

    What happened in a collection after a ledger position YOU hold — including edits the USER made in the widget, which never pass through you. Any mark you already have works as `since`: a write ack's `seq`, data_list's `version`, or the last call's `next_since`. Returns the contiguous run of events right after it (oldest first, whole events: actor, item id, fields) plus `next_since` to continue; omi

  • data_collections

    List every data collection that exists (name, item count, last activity). Use when unsure where data lives, what boards the user has, or which collection to bind an app to. Renders no UI.

  • data_delete_itemwrite action

    Delete an item permanently. May return reason:"confirmation_required" with a request_state — show the user what is named in `note`, then re-send the same call with request_state attached.

  • data_list

    Read items in full — every field, plus the item id you need to update or delete it. No UI (use open_app for that). Returns a PAGE: up to `limit` (default 100) matching items, with `total` and — when more exist — `next_cursor`; returned/total make a short delivery self-evident. `match` filters: a bare value means equals; an object is operators {ne, lt, lte, gt, gte, contains, prefix, exists} (numer

  • data_move_item

    Move an item to another group and/or position (e.g. kanban column).

  • data_update_itemwrite action

    Shallow-merge fields into an item (set a key to null to remove it). Uses optimistic concurrency.

  • data_version

    The cheapest possible change check: returns the global change counter (seq) plus settings/files sub-counters. If seq hasn't moved since you last looked, NOTHING changed anywhere — skip re-reading. Widgets use this for adaptive polling; you can too before re-listing a collection.

  • delete_appwrite action

    Delete an app from the registry. Default data:"keep" is a tombstone: its data, files and history are KEPT and restore_app can bring the app back. data:"cascade" ALSO permanently deletes the data provably only this app used (plus its settings) — it always returns a disposition plan first: read the plan to the user (what will be deleted AND what will be kept and why), then re-send the same call with

  • edit_app

    Surgical edits to an app WITHOUT round-tripping the whole source. Two edit forms, mixable: RANGE {offset, length, expect_hash, new_string} replaces a span you read with get_app (cheapest — echo the window's offset/returned/hash, no anchor text travels); STRING {old_string, new_string} replaces an exact-once match (or set replace_all). Range offsets always address the expected_version document and

  • file_deletewrite action

    Permanently delete one file an app has stored.

  • file_list

    List the files an app (app) has stored — a PAGE of {path, size, mime, version} plus usage totals; limit/cursor page through, prefix narrows. These are opaque user files (attachments, exports) the app keeps — separate from its structured data collection. Renders no UI.

  • file_read

    Read one file an app has stored, as a WINDOW of its bytes: offset/length select it, data_base64 carries exactly that window, next_offset continues (same window grammar as get_app, and for the same reason). Reassemble by concatenating decoded windows; sha256 is the WHOLE file's hash, so reassembly is checkable.

  • file_writewrite action

    Store a file for an app (create or overwrite by path). `data_base64` is the file bytes, base64-encoded — pass any file the user gave you or that you generated. Overwriting an existing path bumps its version. Single-call writes are limited to a few MiB. Files persist and are the app's own, reusable across chats.

  • file_write_beginwrite action

    Start a chunked upload for a file too big for file_write's single call. Returns an upload_id; send the bytes in order with file_write_chunk (each chunk up to ~… MiB of raw bytes), then file_write_commit names the file. Uploads expire after 30 idle minutes; per-file ceiling … MiB.

  • file_write_chunkwrite action

    Append the next chunk of bytes (base64) to an upload started with file_write_begin. Send chunks strictly in order, one at a time. Pass `seq` (0-based chunk index) so a resend after a lost response is acknowledged instead of double-appended.

  • file_write_commitwrite action

    Finalize an upload as an app file (create or overwrite by path) — the chunked equivalent of file_write. The upload is consumed either way; on failure, restart from file_write_begin.

  • get_app

    Read an app's ui source as a WINDOW — offset/length select it, next_offset continues, total is the full length. Windows exist because some hosts silently drop the MIDDLE of an oversized result: a big app read whole can arrive mutilated with no sign, and an edit saved from it destroys the source. Carries version — the expected_version for edit_app / save_app — and hash, the expect_hash for a range

  • get_app_guide

    READ THIS FIRST before creating or editing an app. Returns the window.oma API contract, available CSS design tokens, the data model, and a minimal working app template.

  • install_from_app_store

    Install (or update) a ready-made app from the built-in App Store into the user's registry. Once installed it behaves like any app of the user's own; its UI updates come from the App Store (newer store version), not from edits. Use app_store_list to see what's available. Installing is HALF the job: before handing it over, seed the collection with the user's real rows (data_batch, from what you alre

  • list_apps

    List UI apps in the registry (reusable across all chats). If the UI the user wants already exists, prefer opening it over creating a new one. Lists the user's openable apps by default — pass name to look one up, or widen with kind/visibility.

  • promote_app

    Upgrade a kind:"visual" app to a full app in ONE atomic step: the engine flips `kind` in the stored manifest, keeping every other declared key, and saves a new version (OCC-guarded, history kept). Already an app is a no-op; downgrades are refused — demoting is an author edit (save_app with the manifest), not a lifecycle verb.

  • restore_app

    Roll an app back to one of its earlier checkpoints: re-saves that checkpoint's HTML as a NEW current one (nothing is lost — history is preserved and you can roll forward again). Use when a newer edit broke the UI. Get the checkpoint number from app_history; after restoring, open_app to view it.

  • save_appwrite action

    Create or update a UI app in the persistent registry. Two slots, each optional on update (an omitted slot keeps its current value): ui — the complete self-contained HTML document (contract in get_app_guide; window.oma, no external resources, NO embedded manifest block) — and manifest, the app's declaration as a JSON object (kind, collections, settings, scene; keys in get_app_guide). manifest: null

  • security_set

    Privileged writer for reserved settings keys (security:* / policy:*) — the ONLY tool that can write them; the generic data_* tools refuse reserved keys. Upserts one key/value in the settings collection.

  • ui_prefs_schema

    The engine-owned catalog of SHARED preferences (key, type, label, default, options) that the settings app renders. Apps read effective values via oma.pref(); this tool only describes what exists. Read-only.

Public scan report

scanner v0.1.10 · 2026-11-03 · same rubric, same numbers if you re-run it

no findings
  • Code scan84 source files scanned25/25
  • –Live reliabilityno gateway calls yet and no remote to proben/a
  • –Tool poisoningtools not inspected (local package is not executed); not countedn/a
  • Auth qualitylocal package, no credentials required12/15
  • Maintenancelast push 18 days ago15/15
  • Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
Overall 92/100. Components that don't apply are left out of the denominator. Any critical finding is an F.RubricAppeal a findingJSON

How Open Apps compares

Against every graded MCP server, from our own scans and uptime checks. Updated after each scan run.

Safety score
92/100
higher than 95% of 48,255 servers
Tools
32
the typical server has 7
Tools that change things
31%
typical: 0%. Fewer write tools means less an agent can break
GitHub stars
36
more than 92% of 28,688 servers
Downloads a week
117
more than 66% of 12,191 servers with a package

What its tools let an agent do: 20 read · 1 create · 9 change · 1 delete · 1 run or deploy

Install Open Apps in Claude Code, Cursor or VS Code

Runs npx -y @2nd1st/open-mcp-apps on your machine. Read the scan report first; the gateway never runs local packages.

claude mcp add open-mcp-apps -- npx -y @2nd1st/open-mcp-apps
Add to Cursor

What the publisher says

From the Open Apps repository's README, as published. We do not edit it. Read it on GitHub

open-mcp-apps

English | 简体中文

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

open-mcp-apps is an open engine built on MCP Apps (ui://, io.modelcontextprotocol/ui) — an extension to the core Model Context Protocol specification, and the first official one, live since 26 January 2026. It gives any MCP-Apps-capable host (Claude Desktop, claude.ai, Codex, ChatGPT, …) three things the extension itself doesn't provide:

the authoring guide, writes a single-file HTML app against a tiny window.oma API, and saves it. From that moment you can open it by name, in this chat and every future one.

  1. An app registry the AI can write to. Ask for a UI that doesn't exist — the AI reads

collections of items backed by SQLite plus an append-only changeevent ledger. Every mutation is an idempotent domain command (commandid) with optimistic concurrency (expected_version). The AI and the human edit the same store — the widget is just a view.

  1. Persistent, versioned data — separate from the UI. Apps bind to generic

the app with the official MCP App bridge, host theming (Claude's design tokens, light/dark), and the window.oma data API. What you write is a view; the protocol, persistence, idempotency and theming are the engine's problem.

  1. A shell runtime so AI-written apps actually work. Serving ui://, the engine wraps

Which of those hosts this engine reaches. It runs on your machine and binds 127.0.0.1, so it serves the hosts on that same machine: Claude Desktop, Claude Code, Codex, plus its own browser viewer. A browser host cannot reach a loopback server on your laptop, so claude.ai and ChatGPT web need a remote deployment — today that means the hosted openmcp.app, which runs this same engine for you. Running that remote shape yourself is on the roadmap and not done.

Install

open-mcp-apps runs as a local MCP server. First get it connected to your host (below); then onboarding happens inside the host, separately — that's where the AI builds your first app.

From npm — nothing to clone

Shortened. The full README is on GitHub.

Nothing above is checked by us. What we check is on the safety report.

Open Apps: common questions

Is Open Apps MCP server safe?
Yes, by our scan: it is graded A (92/100). Read the Open Apps safety report
How do I install Open Apps?
It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
Does Open Apps need an API key?
No secret keys are declared. It reads 3 settings from the environment.
Is Open Apps maintained?
The last commit was 19 days ago (2026-10-16). The latest release is v0.5.9.
How does Open Apps compare with other MCP servers?
safety score 92/100 (higher than 95% of 48,255 servers); tools 32 (the typical server has 7); tools that change things 31% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.