MCP server for the QORM app platform, enabling AI agents to inspect, test, design, and operate live QORM applications through a comprehensive set of tools for UI rendering, state management, accessibility auditing, and design patching.
QORM MCP server has 23 well-defined tools with explicit schemas and descriptions. Naming follows verb_noun convention (qorm_<action>). Most tools have detailed, context-rich descriptions (100-500 chars) explaining WHAT, WHEN, and WHY. Input schemas are properly structured with types and required fields. However, several critical gaps reduce the score: (1) Many parameter descriptions are minimal or absent (e.g., qorm_window's 'id', 'url', 'js' lack context on format/constraints); (2) Output schemas are NOT documented, tools describe what they return in prose but lack formal JSON Schema definitions; (3) Error handling guidance is absent, no recovery hints or error categorization; (4) Some tools combine multiple concerns (qorm_window handles move, open, close, eval, tile, focus, minimize, pin, unpin, 9 operations in one tool); (5) No pagination guidance for tools returning lists (qorm_query, qorm_list_actions). Baseline: 194 chars avg description (QORM ~250 chars, good), but 0% of tools document output schemas (should be 100%).
Derive the accessibility tree for the entry scene: every node's ARIA role, accessible name and semantic state (checked/disabled/required/value), plus an audit of accessibility issues — interactive controls and images that would reach a screen reader with no accessible name. Use it to check a11y coverage or find what to fix. Read-only.
Read the shared session's live presence: returns {events:[who (human/agent) did what, oldest to newest], humanFocus:{element, secondsAgo}, humanTyping:{entry, secondsAgo}, humanFilled:{field, secondsAgo}, inflight:N} — so the agent sees what the human just did, the element they are on now, the text they last typed, AND which hidden (password) fields they filled (label only; a password value is never captured), and collaborates in context. Browser/WebView events and native canvas pointer/keyboard actions enter the same human activity stream and DevTool; both hosts report privacy-safe focus/typing/filled presence, and neither captures password values. `inflight` counts the background work the app still has open (async `http.*` requests plus waiting `delay` steps): 0 means the app has settled and what you read now is final, above 0 means a reply is still coming and the current frame is a loading state — read again before drawing conclusions. Only available in a running `qorm run` session. Read-only.
DESIGN (commit): apply patch ops to the LIVE app. Must pass the previewToken returned by qorm_preview_patch for the same ops — apply is bound to a review. Snapshots the pre-image so it can be undone. If the app declares enforced design tokens, a color style may only be set to one of their values.
Output schemas not documented. All 23 tools describe return values in prose (e.g., 'returns {events:[...], humanFocus:{...}}') but lack formal JSON Schema definitions. LLMs cannot reliably parse unstructured text responses or plan downstream tool calls without typed output schemas.
qorm_window combines 9 distinct operations (move, open, close, eval, tile, focus, minimize, pin, unpin) in a single tool. This violates single-responsibility principle and forces LLMs to reason about which operation to select. Should split into separate tools: qorm_move_window, qorm_open_window, qorm_close_window, qorm_eval_window_js, qorm_tile_window, qorm_focus_window, qorm_minimize_window, qorm_pin_window, qorm_unpin_window.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
TEST the app: evaluate checks against current state and rendered HTML. Each check is {kind: 'stateEquals'|'htmlContains'|'nodeExists', ...}. Returns per-check pass/fail and overall.
List all built-in hardware/native capabilities: each capability's canonical name + widget type, the qormToNative op strings it accepts, its qormOn<Name> callback, and which platforms (ios/android/mac/linux/windows/web) implement it. Read-only — how an agent discovers what hardware exists and exactly how to call it. Mini-program is a static export target: no live tools apply.
Capture the actual last-presented native Canvas pixel plane as a base64 PNG. Optional id still returns the full surface plus a physical-pixel clip rectangle for that node; it does not pretend to isolate or re-render the subtree. Fails loudly outside a running native Canvas host, before its first frame, for absent/invisible nodes, or when safety limits are exceeded. Read-only.
Capture a specific node subtree by node id: returns isolated rendered HTML and child layout hierarchy for visual AI feedback. Read-only.
TEST: measure the layout of the current scene — returns the bounding box (x, y, width, height in CSS pixels) and computed style (color, fontSize, fontWeight, etc.) of every node. Use it to verify spacing, alignment, and visual properties. Read-only.
DESIGN (safe): show the structural diff a patch would make (added/removed node ids and, per changed node, which fields) without touching the live app. Review before apply.
OPERATE the live app: dispatch an action (mutating state) and return the new state and rendered HTML.
Serialise the whole current app (manifest + scenes + actions) into an UNSIGNED bundle (with content hash). A human/CI signs it (`qorm sign`) before OTA deploy — the agent never holds the signing key. Read-only.
Serialise the current (possibly patched) entry scene back to QORM JSON, so design work done via apply_patch can be saved or shipped. Read-only.
Return a node's type, props, and child ids by node id. Read-only.
Inspect the QORM app: id, name, entry scene, scene ids, state schema, current state, action ids, static compiler diagnostics, the resolved host window config (window: width/height/title/resizable/chromeless/transparent — set via qorm.config.json or qorm.json display/platforms.desktop.window), and the design-token system (designTokens: name -> {type,value,enforce}) when declared, agentPolicy (effective MCP tool permissions from qorm.json agent.policy when declared), breakpoints (manifest width thresholds as breakpoint.<name> booleans), and capabilities (runtime gate policy when declared). Enforced color tokens hard-constrain apply_patch: a color style may only be set to one of their values. Read-only.
List available actions and a summary of each action's steps. Read-only.
DESIGN (safe): apply patch ops to a COPY of the app and return the resulting HTML plus a previewToken. Side-effect-free — the live app is unchanged. Ops: {op:'setProp',target,key,value} | {op:'addChild',target,node} | {op:'insertBefore'|'insertAfter',target,node} | {op:'replace',target,node} | {op:'wrap',target,node} | {op:'move',target,into} | {op:'remove',target}.
Find nodes matching a selector (any of: type, textContains, idContains, hasProp — combined with AND). Returns each match's id, type, label and ancestor path. Use this to locate nodes before patching. Read-only.
Render the current app to HTML so the agent can see what the UI looks like — the scene the session is actually on, after its route guard has been resolved (a guarded scene the session may not enter is never rendered). Read-only.
OPERATE the live app: set a state path to a value and return the new state and rendered HTML. A dotted path NESTS, exactly like the state.set action step: path 'user.name' writes name inside user, so a binding {{ state.user.name }} reads it back. Computed (derived) values are read-only — a path inside the computed namespace is rejected, because they are republished from their declarations at every frame.
Dispatch an action against a COPY of state and return before/after/changed. Side-effect-free: the live app is never modified.
Reverse-lookup: given a node id (e.g. one a human clicked in the devtool or you found via qorm_query), return where it is declared in the app's source — file (relative to the app dir), 1-based line, and that line's text. Lets you jump straight to the JSON to edit it. Unavailable for a signed bundle (no source tree) or a templated id. Read-only.
DESIGN (undo): revert the last apply_patch. Returns the reverted HTML. Snapshots are retained for the session only — a server restart clears them.
Control the desktop app window: op=move needs x,y,w,h (top-left px); op=focus/minimize/pin/unpin act on the window. The control engine positions the user's window. Supported on macOS and Windows desktop apps.
Parameter descriptions are sparse or missing. qorm_window parameters (id, url, js, x, y, w, h) lack format/constraint guidance. E.g., 'id' has no description of what identifier format is expected; 'js' lacks security warnings about eval; 'x,y,w,h' lack pixel range constraints.
No error handling guidance. Tools lack recovery hints (e.g., 'If node not found, try qorm_query() first') or error categorization (retryable vs user-fixable vs fatal). qorm_capture_canvas states 'Fails loudly' but provides no guidance on what to do when it fails.
No pagination or result-limiting guidance. qorm_query, qorm_list_actions, qorm_capabilities return lists but lack page/offset/limit parameters or documentation of max result counts. Large result sets risk context window exhaustion.