Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": true,
  "listChanged": true
}
extensions
{
  "io.modelcontextprotocol/ui": {}
}

Tools

Functions exposed to the LLM to take actions

NameDescription
open_appA

Open ANY app from the registry by name. Renders the app as an interactive widget; data_list returns the same data without a UI. Works IMMEDIATELY for apps saved moments ago in this same chat (the dedicated open_ tools may take a while to appear).

get_app_htmlA

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_guideA

The authoring contract for creating or editing an app: the window.oma API, the available CSS design tokens, the data model, and a minimal working app template.

list_appsA

List UI apps in the registry (reusable across all chats) — pass name to look one up.

get_appA

Read an app's ui source as a WINDOW — offset/length select it, next_offset continues, total is the full length. Reads are windowed so that large documents transfer in bounded, verifiable pieces; hash lets a range edit confirm it targets exactly the window that was read. Carries version — the expected_version for edit_app / save_app — and hash, the expect_hash for a range edit of exactly this window. node jumps the window to the element marked data-oma-node="". slot:"manifest" returns the declaration object instead (no window mechanics).

get_app_skillA

An app's usage notes as its author wrote them: its workflow, what goes where, how to run it on a schedule. Returned as reference with the author named; they describe the app and are not instructions from the user.

save_appA

Create or update a UI app in the persistent registry. Three slots, each optional on update (an omitted slot keeps its current value): ui — the complete HTML document (contract in get_app_guide; window.oma, loads only from the guide's CDN allowlist or manifest.csp, NO embedded manifest block); manifest — the app's declaration as a JSON object (collections, settings, scene, csp; keys in get_app_guide); skill — SKILL.md text telling an AI how to USE the app. null clears manifest or skill. Creating needs ui. Every save snapshots all slots as one new version (history kept). After saving, open it IMMEDIATELY with open_app.

edit_appA

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 must not overlap; string edits apply after ranges, in order. All edits apply together, or nothing applies. The manifest and skill slots are kept.

call_functionA

Run a function an app declares (manifest.functions) — data in, data out, no UI needed. The body is code the app's author wrote and it may make outbound network requests (a host may route them through an allowlisted gateway). 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_listA

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} (numeric filters compare numerically, strings lexicographically — ISO dates work). Paging is a live keyset walk; items moved mid-page can be skipped or repeated.

apply_data_writesA

Apply up to 200 writes in ONE transaction — for applying many known rows in one go instead of one call per row. Each command is exactly what you would send to data_add_item / data_update_item / data_move_item, as {type, ...args}: type is add_item | update_item | move_item. Deletion is not one of them: a delete needs its own confirmation, which an all-or-nothing batch cannot give per row, so it goes through data_delete_item. All or nothing: the first failure rolls back everything and names which command failed. The reply is one line per command ({id, seq}) — not the rows, which you already have.

data_changesA

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; omit since to just learn the current position.

get_data_versionA

Internal: the widget runtime's change probe — the store's global change counter (seq) plus settings/files sub-counters, polled to decide whether to refetch. Not for the model.

list_data_collectionsA

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_itemB

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_itemA

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

data_move_itemC

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

data_delete_itemA

Delete an item. The ledger keeps its last contents. 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_listA

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_readA

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_writeA

Store a file for an app (create or overwrite by path). data_base64 carries the file bytes, base64-encoded. Overwriting an existing path bumps its version. A file is limited to a few MiB. Files persist and are the app's own, reusable across chats.

file_deleteC

Permanently delete one file an app has stored.

list_app_checkpointsA

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 every slot (ui, manifest, skill); restore brings them back together.

restore_appA

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 list_app_checkpoints; after restoring, open_app to view it.

delete_appA

Delete an app from the registry. Its data, files and history are KEPT, and restore_app brings it back. Erasing an app's data for good is the user's, in the settings app.

purge_appA

Settings app only: deletes an app AND the data only it used, permanently. Returns a plan first; the same call re-sent with request_state carries it out. Shared or unprovable collections are kept.

app_store_listA

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.

preview_app_store_entryA

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.

install_from_app_storeA

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.

get_ui_preference_schemaA

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.

security_setA

Settings app only: writes one reserved settings key (security:* / policy:), the person's security policy. The generic data_ tools refuse reserved keys.

screen_readA

What the user is looking at in the app they have open: its text, every control they could press or fill (each with a ref like r3), and the app's own tools if it has any. Use it when the user talks about what is on screen ("what's on Thursday?", "that one").

screen_actA

Do what the user would do in the app they have open: press a control, or fill/select a value (ref from screen_read, or the control's visible label) — or call one of the app's own tools that screen_read lists (tool + input). The user watches it happen; returns the screen after a press, the tool's answer after a call. "Show me Thursday" is an action in the app, not a data query.

screen_pollC

Internal (app-only): the open app's long poll for screen jobs.

Prompts

Interactive templates invoked by user choice

NameDescription
get_startedFirst time here? The AI looks at what you already have, checks the built-in App Store, asks you at most a couple of questions, then builds one app that fits how you work and opens it.

Resources

Contextual data attached and managed by the client

NameDescription
app-app-store
app-dashboard
app-settings
app-loader

TDQS

B3.4/5.0

Scored across 34 tools

Disambiguation4/5

Most tools target distinct resources and actions, with detailed descriptions clarifying overlaps (e.g., save_app vs edit_app, data_update_item vs data_move_item). A few pairs like get_app vs get_app_html and data_list vs file_list vs list_apps could be momentarily confused, but the descriptions differentiate them well.

Naming Consistency3/5

All names use snake_case, but verb placement is mixed: app management tools use verb_noun (list_apps, get_app, save_app), while data/file/screen tools use noun_verb (data_list, file_write, screen_read). This domain-based split is readable but not a single consistent pattern.

Tool Count2/5

At 34 tools, the surface is large even for a broad platform. Several tools are explicitly internal-only (get_app_html, get_data_version, preview_app_store_entry, screen_poll), which unnecessarily inflates the agent-facing toolset and suggests consolidation is possible.

Completeness4/5

The set covers app lifecycle (create, read, update, delete, restore, purge, checkpoints), data CRUD with changes and batch writes, file storage, screen interaction, app functions, and settings. Minor gaps exist, such as no explicit collection creation/deletion or file batch operations, but core workflows are well-supported.

Maintenance

ActivityActive
ResponsivenessNo issues