open-mcp-apps
MCP serverDev toolsPersistent, interactive MCP Apps — the AI builds an app once, you both reuse it
This server has no hosted endpoint yet, so ahel can't serve it. You can still add it. It stays paused until ahel can serve it.
Serve it through your gateway
One link, every agent. Your own credentials, stored once.
Tools it gives your agents (33)
| Tool | What it does |
|---|---|
| open_app | Open ANY app from the registry by name as an interactive widget — use when the user wants to SEE or OPERATE the data (to merely read facts, use data_list — no UI). |
| 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. |
| 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. |
| 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. |
| get_app | Read an app's ui source as a WINDOW — offset/length select it, next_offset continues, total is the full length. |
| save_app | 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... |
| 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... |
| 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). |
| call_function | Run a function an app declares (manifest.functions) — data in, data out, no UI needed. |
| 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). |
| data_batch | Apply up to 200 writes in ONE transaction — for seeding an app from what you already know, or filling a board in one go, instead of one call per row. |
| 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. |
| 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. |
| 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_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_update_item | Shallow-merge fields into an item (set a key to null to remove it). Uses optimistic concurrency. |
| data_move_item | Move an item to another group and/or position (e.g. kanban column). |
| data_delete_item | 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. |
| 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. |
| 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... |
| file_write | 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. |
| file_write_begin | 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 ~5 MiB of raw bytes), then... |
| file_write_chunk | Append the next chunk of bytes (base64) to an upload started with file_write_begin. Send chunks strictly in order, one at a time. |
| file_write_commit | 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. |
| file_delete | Permanently delete one file an app has stored. |
| 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). |
| 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). |
| delete_app | 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. |
| 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. |
| 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). |
| install_from_app_store | Install (or update) a ready-made app from the built-in App Store into the user's registry. |
| 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. |
| security_set | Privileged writer for reserved settings keys (security:* / policy:*) — the ONLY tool that can write them; the generic data_* tools refuse reserved keys. |
Signals
- GitHub stars
- 27
- Last commit
- Aug 2026
- Weekly downloads
- 219
- Tools captured
- 33