Skip to main content
Interactive blocks are the vocabulary of confirmation cards and setup forms — declared statically as a UiView in the manifest:
schemaVersion is 1. Hosts render newer views’ unknown blocks as safe placeholders rather than failing.

Common props

Every block accepts:

Tokens

Colors are semantic tokens — the host owns the palette, so cards inherit every restyle.

Layout blocks

card

stack

Display blocks

Icon refs accept https: or data: image URLs; unresolved token names render nothing (falling back to your integration’s icon where the host shows one) rather than a broken image.

Input blocks

All inputs take bind (required), label?, and required?: required inputs gate the confirm action until they hold a non-whitespace value; the marker is a quiet permanent *.

Action blocks

actions

Give a view exactly one confirm and one cancel. button is the standalone single-action variant (label ✅, role?, actionId?, color?, disabledIf?).

widget

A view may instead be a single sandboxed HTML block — see Widget confirmations: Rules: at most one widget per view; no button/actions blocks anywhere alongside it.

canvas

Reserved. { "type": "canvas", "src", "height", "maxHeight?" } — an MCP-Apps-style embedded resource. Declared in the contract, rejected by validation in schemaVersion: 1.

Bindings

A binding is {{name}} — whitespace-tolerant, dotted paths allowed ({{user.name}}):
  • In text, bindings interpolate into the string.
  • On inputs, bind: "{{url}}" shows the argument’s current value and stages edits. On approval, staged edits are folded back into the argument object (nested paths fold into their top-level key) and replace the agent’s proposed values.
  • Every bound name must exist in the tool’s inputSchema properties — validated at install.
Validate any view standalone with validateView(view) from @voiceos/integration-sdk.