Read the talk
Beyond Components: Designing Generative UI for MCP Apps

Ruben Casas of Postman examines the progression from static components to declarative interfaces and runtime-generated code, explaining why MCP apps provide essential containment and how shared human-agent workspaces could reshape interaction.
From a talk by Ruben Casas
At a glance
Ideas worth remembering
Distinguish where an interface runs from what the model generates; deployment inside a super app and the degree of UI generation are separate architectural choices. 3:57
Static component systems let agents provide data and properties to developer-built interfaces, as illustrated by the AG UI protocol and Goose auto visualizer. 6:17
Declarative UI uses descriptors such as JSON, YAML, or Python to assemble approved components, balancing personalization with design-system consistency, predictability, and potentially lower token costs. 7:29
Generative components can create HTML, CSS, and JavaScript at runtime, but their flexibility introduces the same fundamental trust concerns associated with executing unfamiliar code. 9:35
MCP apps provide a delivery boundary with sandboxing, authentication, tool calling, and interface-agent messaging for both third-party and first-party generated UI. 11:41
The Skeletro MCP app demonstrates a possible direction beyond visualization: shared artifacts that humans and agents can edit together, while the ultimate interface model remains unresolved. 14:28
The interface has not caught up with the model

Ruben Casas traces a shift from early workflows in which developers prompted ChatGPT for component code, copied the result, corrected it, and repeated the process. He identifies GPT-5.2 and Opus 4.5 as models that demonstrated stronger performance on long-horizon work and high-fidelity UI generation, producing functional interfaces quickly and sometimes with meaningful design judgment. 0:15
His personal example is a blog rewrite generated from a single prompt. The resulting interface included a search box, a blur animation, and accessibility features he had not explicitly requested. For Casas, the significance is not simply that models can emit more code: they can sometimes make frontend decisions that exceed what their human operator initially specified. 1:30
That capability creates a central tension. If models can generate sophisticated frontend code, why do agent products still rely so heavily on text conversations and largely static interfaces? Casas frames contemporary interaction as direct access to a powerful new computer whose mature graphical interface language has yet to emerge. 2:49
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Separate where the interface runs from what the model creates

Casas distinguishes two competing deployment patterns. One puts chat inside many existing applications; the other concentrates interaction in an agent-centered super app such as ChatGPT, Claude, or Gemini, with MCP apps rendering third-party interfaces inside that shared environment. He treats both as plausible transitional arrangements and explicitly declines to predict which consumers will ultimately prefer. 3:57
The more consequential architectural question is separate: what is the model actually generating? Whether an interface appears inside a standalone product or a super app does not determine whether the model supplies component properties, assembles a declarative layout, or writes executable frontend code. This distinction makes it possible to compare interface-generation strategies without confusing delivery location with generation capability. 5:05
In the static component pattern, developers build components in advance while the agent orchestrates a tool call and supplies data or properties. The client then renders the corresponding predefined component. Casas emphasizes that this resembles familiar client-rendered interfaces: the primary difference is that an agent produces or selects the inputs. 5:05
He offers two concrete implementations. The AG UI protocol provides an SDK that maps a registered client tool to a React component, passing tool-call properties into the component. Goose, an MCP client, includes Goose auto visualizer, which organizes incoming data and matches it to visualization components created beforehand by the Goose team. 6:17
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Declarative UI expands flexibility without abandoning constraints

Declarative UI retains developer-built components and the surrounding design system but changes what the agent produces. Instead of only providing properties for a predetermined component, the agent emits a descriptor, such as JSON, YAML, or a Python representation associated with FastMCP2. A translation or rendering engine interprets that descriptor and assembles the final interface from approved components. 7:29
The gain is more dynamic composition and personalization within established visual and functional boundaries. Casas compares this approach to Netflix-style server-driven personalization, where different people receive different homepage arrangements even though those arrangements still use the same underlying Netflix interface elements. 7:29
He points to JSON Render, built by Vercel, as an example of mapping components through JSON and YAML to produce dynamic interactions. The essential limitation remains deliberate: the language model generates the descriptor, not the components themselves. As a result, the interface can vary in arrangement and content without becoming unconstrained executable code. 8:35
Casas presents declarative generation as a strong practical balance for the current moment. It preserves design-system consistency and predictable output while offering more flexibility than direct component-property mapping. He also suggests that this approach can be faster and potentially cheaper because the system does not need to spend as many tokens generating an entire interface from scratch. 9:35
Generates interface descriptors
Model-generated descriptors become personalized interfaces through a rendering engine and predefined components.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Runtime-generated components introduce a new trust boundary

The next step in Casas’s progression is generative components: allowing a model to write frontend code on demand at runtime. Rather than constraining the output to a descriptor interpreted by a fixed rendering engine, an agent can invoke the same model through reverse sampling or call another model to generate HTML, CSS, and JavaScript for delivery to the client. 9:35
Casas describes a Postman experiment built around a weather agent. In a single tool call, the system accesses a weather API, creates a joke, and generates the HTML, CSS, and JavaScript for an imaginative interface. In his description, the result does not depend on a predefined component catalog or an intermediate component-translation layer. 10:34
The additional freedom comes with a serious security limitation. If application developers do not automatically trust third-party code, they should not automatically trust model-generated code presented directly to users either. Casas therefore argues that runtime-generated interfaces require a delivery architecture with an explicit boundary, containment, and sandboxing. 10:34
Initiates runtime generation
A tool call invokes a model to generate executable interface code, which must cross an explicit sandbox boundary before client delivery.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
