stackyapper_validate_artifact. See Checking a draft.Build a project estimate MCP app with an hours input, a $100 hourly rate, a calculated total, and a reset button. Use no connected data. Validate it, save it, and open it so I can try the controls.
stackyapper_validate_artifact checks the complete source and its declared
tools without saving anything. For a React component, it also renders the
draft once, as it first appears, and reports each unsupported element,
property, or style, or an error, along with where it occurs in the page.| Result | What it means |
passed | The first view rendered with no issues. Later states after a click or input were not checked. |
passed_initial_state | The first view rendered, but the page reads app data, uses the clipboard, or starts a timer when it opens. Anything that depends on those results was not checked. |
failed | Rendering stopped at the first issue. Fix it and check again to find any later issue. |
skipped | The source has other problems to fix first, so it was not rendered. |
unavailable | The render check could not run. Only the source checks ran, so the rendered page is unchecked. |
not_applicable | The source is a JSON document or backup-only content, which is not rendered. |
YYYY-MM-DD format.| Client capability | What opens |
MCP Apps with text/html;profile=mcp-app | An embedded, network-isolated hosted page |
| MCP without that capability | An authenticated Stackyapper portal link |
| Export/import only | A stackyapper.artifact/v1 backup package |
stackyapper.ui/v1 is JSON data, not executable code. The root has exactly two
keys: format and blocks. Supported block types are heading, text,
status, metric, table, control, and work_queue.12345678{ "format": "stackyapper.ui/v1", "blocks": [ { "type": "heading", "text": "Morning service check", "level": 2 }, { "type": "status", "label": "Backup", "value": "Healthy", "tone": "good" }, { "type": "metric", "label": "Open alerts", "value": "2", "detail": "Review before noon" } ] }
{ "format": "stackyapper.ui/v1", "blocks": [ { "type": "table", "caption": "Devices approaching replacement", "columns": [ { "key": "device", "label": "Device" }, { "key": "age", "label": "Age" } ], "rows": [ { "device": "Laptop 014", "age": "4 years" } ] } ] }
{ "format": "stackyapper.ui/v1", "blocks": [ { "type": "control", "kind": "refresh", "label": "Refresh open tickets", "description": "Reads up to three open tickets with your current access.", "binding": { "role": "psa", "tool_name": "cw_search_tickets", "arguments": { "conditions": "closedFlag=false", "pageSize": 3 } } } ] }
bindings argument declares what the control may use:123[ { "role": "psa", "service": "connectwise", "tool_names": ["cw_search_tickets"] } ]
work_queue when a saved artifact needs to keep the shape of a dispatch
board, alert queue, or task list instead of flattening it into unrelated metric
cards. It must be the document’s only block: a histogram, local search and
facets, filter chips, compact rows, and one optional governed query control.
Every facet, histogram, and chip match key must name a declared column, and
filters and chip_groups are required even when empty. Search, facets, chips, histogram selection, sorting, density, and
list copying all run locally over the bounded saved rows. The query control’s
fresh result is shown separately; it does not silently rewrite the saved
snapshot.{ "format": "stackyapper.ui/v1", "blocks": [ { "type": "work_queue", "item_label": "tickets", "eyebrow": "Service operations", "title": "Dispatch Console", "status": "80 open", "histogram": { "label": "Open by age", "hint": "Select a bar to filter", "items": [ { "label": "30d+", "value": "23", "tone": "warning", "match": { "key": "age_bucket", "value": "30d+" } } ] }, "filters": [{ "key": "board", "label": "All boards" }], "chip_groups": [], "columns": [ { "key": "ticket", "label": "Ticket" }, { "key": "board", "label": "Board" }, { "key": "age", "label": "Age", "kind": "age" }, { "key": "age_bucket", "label": "Age bucket", "hidden": true } ], "rows": [ { "ticket": "#42 Printer offline · Acme", "board": "Service", "age": "31d", "age_bucket": "30d+" } ], "footer": ["ConnectWise via Stackyapper"], "control": { "label": "Query latest", "binding": { "role": "psa", "tool_name": "cw_search_tickets", "arguments": { "page": 1, "pageSize": 2 } } } } ] }
bindings argument."23").stackyapper.ui/v1 document: 64 KiB.stackyapper.artifact/v1 is a deterministic, backup-only JSON package. It
contains the title, description, source, and reviewed bindings. Its SHA-256
checksum detects corruption; it is not a signature and does not prove who
created the package. Import validates the checksum and artifact format, removes
all original identifiers, and creates a new private artifact owned by the
importing viewer with “Imported copy” appended to its title.stackyapper_validate_artifact, then open the saved
artifact and review it.