---
schema: 1
type: video
title: 'Generative UI... in Python? — Jeremiah Lowin, Prefect'
description: >-
  Because only the agent can reach an MCP server, a naive file upload tool makes
  the agent retype the file into the server character by character. Jeremiah
  Lowin calls it the world's most expensive copy paste operation, and it is the
  problem MCP apps exist to remove. Lowin is founder and CEO of Prefect and the
  author of FastMCP. MCP apps, a protocol extension added this year, let a tool
  result skip the agent and arrive at the user as HTML, CSS, and JavaScript: a
  real interface a person can click. That solves one problem and creates
  another, because FastMCP's users are overwhelmingly Python engineers inside
  enterprises, and shipping React from Python is not something he would pretend
  to do. The way out was constraining the problem. His users are not building
  consumer facing branded products; they share and collect information, which
  means tables, forms, and charts. Prefab is the result, a Python DSL where
  nesting context managers builds the interface structure and every component is
  a class that renders as a polished one. Reactive variables give client side
  interactivity with no JavaScript. The pipeline runs Python to a declarative
  representation to a JSON protocol to a React app, and Lowin is blunt that the
  JSON is the actual point: a serializable UI is one an agent can generate,
  receive, or edit. The Python DSL, he says, was an accident he noticed later.
  Two details land. The Prefab documentation is rendered entirely in Prefab,
  editable in place. And a UI streamed as Python turned out roughly seventy
  percent smaller than the same UI as JSON, so they now send Python over the
  wire and convert it in a sandbox. Speaker info: - https://x.com/jlowin -
  https://www.linkedin.com/in/jlowin/ - https://jlowin.dev Timestamps: 0:00 -
  MCP apps, and bypassing the agent 3:20 - Shipping UIs to an audience of Python
  engineers 4:45 - Constraining the problem to tables, forms, charts 5:43 -
  Composing a front end rather than building one 6:37 - The DSL, and the JSON in
  the middle 8:54 - Docs rendered in the thing they document 10:13 - Interactive
  tools, and a chart beside a table 12:56 - Full apps and the expensive copy
  paste problem 15:15 - Generative UI, and Python beating JSON on the wire ---
  Watch along with the corrected transcript, summary, timestamps and resources
  on this talk's official AIE page:
  https://ai.engineer/talks/Krzs8GeiWTc-youtube-1adaa0e5b93ef60154ca Join our
  upcoming AI Engineer conferences (see https://ai.engineer landing page): -
  AIEi Shanghai, November 5–6 — the first for meeting top Chinese labs and
  engineers - AIE CODE in SF, November 10–12 — the top AI Coding conference
  returns - AIEi Sydney, December 7–8 — the first AIEi run alongside NeurIPS
  2026 in Sydney ---
canonical: 'https://liquidgold.cc/watch/Krzs8GeiWTc'
markdown: 'https://liquidgold.cc/watch/Krzs8GeiWTc.md'
llms: 'https://liquidgold.cc/watch/Krzs8GeiWTc/llms.txt'
parent: 'https://liquidgold.cc/channel/aidotengineer.md'
channel: aidotengineer
updated: '2026-10-24T03:48:32.822Z'
language: null
children: []
videoId: Krzs8GeiWTc
durationSeconds: 1058
publishedAt: '2026-09-10T16:30:07.000Z'
searchChunks:
  - ordinal: 0
    text: null
    startSeconds: 23
    endSeconds: 206
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=23'
    heldReason: rights
  - ordinal: 1
    text: null
    startSeconds: 23
    endSeconds: 206
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=23'
    heldReason: rights
  - ordinal: 2
    text: null
    startSeconds: 23
    endSeconds: 206
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=23'
    heldReason: rights
  - ordinal: 3
    text: null
    startSeconds: 219
    endSeconds: 287
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=219'
    heldReason: rights
  - ordinal: 4
    text: null
    startSeconds: 287
    endSeconds: 297
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=287'
    heldReason: rights
  - ordinal: 5
    text: null
    startSeconds: 355
    endSeconds: 399
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=355'
    heldReason: rights
  - ordinal: 6
    text: null
    startSeconds: 399
    endSeconds: 410
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=399'
    heldReason: rights
  - ordinal: 7
    text: null
    startSeconds: 410
    endSeconds: 538
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=410'
    heldReason: rights
  - ordinal: 8
    text: null
    startSeconds: 410
    endSeconds: 538
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=410'
    heldReason: rights
  - ordinal: 9
    text: null
    startSeconds: 410
    endSeconds: 538
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=410'
    heldReason: rights
  - ordinal: 10
    text: null
    startSeconds: 538
    endSeconds: 549
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=538'
    heldReason: rights
  - ordinal: 11
    text: null
    startSeconds: 627
    endSeconds: 778
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=627'
    heldReason: rights
  - ordinal: 12
    text: null
    startSeconds: 627
    endSeconds: 778
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=627'
    heldReason: rights
  - ordinal: 13
    text: null
    startSeconds: 789
    endSeconds: 925
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=789'
    heldReason: rights
  - ordinal: 14
    text: null
    startSeconds: 789
    endSeconds: 925
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=789'
    heldReason: rights
  - ordinal: 15
    text: null
    startSeconds: 925
    endSeconds: 936
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=925'
    heldReason: rights
  - ordinal: 16
    text: null
    startSeconds: 936
    endSeconds: 1058
    watch: 'https://liquidgold.cc/watch/Krzs8GeiWTc?t=936'
    heldReason: rights
---


# Generative UI... in Python? — Jeremiah Lowin, Prefect

Because only the agent can reach an MCP server, a naive file upload tool makes the agent retype the file into the server character by character. Jeremiah Lowin calls it the world's most expensive copy paste operation, and it is the problem MCP apps exist to remove. Lowin is founder and CEO of Prefect and the author of FastMCP. MCP apps, a protocol extension added this year, let a tool result skip the agent and arrive at the user as HTML, CSS, and JavaScript: a real interface a person can click. That solves one problem and creates another, because FastMCP's users are overwhelmingly Python engineers inside enterprises, and shipping React from Python is not something he would pretend to do. The way out was constraining the problem. His users are not building consumer facing branded products; they share and collect information, which means tables, forms, and charts. Prefab is the result, a Python DSL where nesting context managers builds the interface structure and every component is a class that renders as a polished one. Reactive variables give client side interactivity with no JavaScript. The pipeline runs Python to a declarative representation to a JSON protocol to a React app, and Lowin is blunt that the JSON is the actual point: a serializable UI is one an agent can generate, receive, or edit. The Python DSL, he says, was an accident he noticed later. Two details land. The Prefab documentation is rendered entirely in Prefab, editable in place. And a UI streamed as Python turned out roughly seventy percent smaller than the same UI as JSON, so they now send Python over the wire and convert it in a sandbox. Speaker info: - https://x.com/jlowin - https://www.linkedin.com/in/jlowin/ - https://jlowin.dev Timestamps: 0:00 - MCP apps, and bypassing the agent 3:20 - Shipping UIs to an audience of Python engineers 4:45 - Constraining the problem to tables, forms, charts 5:43 - Composing a front end rather than building one 6:37 - The DSL, and the JSON in the middle 8:54 - Docs rendered in the thing they document 10:13 - Interactive tools, and a chart beside a table 12:56 - Full apps and the expensive copy paste problem 15:15 - Generative UI, and Python beating JSON on the wire --- Watch along with the corrected transcript, summary, timestamps and resources on this talk's official AIE page: https://ai.engineer/talks/Krzs8GeiWTc-youtube-1adaa0e5b93ef60154ca Join our upcoming AI Engineer conferences (see https://ai.engineer landing page): - AIEi Shanghai, November 5–6 — the first for meeting top Chinese labs and engineers - AIE CODE in SF, November 10–12 — the top AI Coding conference returns - AIEi Sydney, December 7–8 — the first AIEi run alongside NeurIPS 2026 in Sydney ---

Canonical: https://liquidgold.cc/watch/Krzs8GeiWTc · Channel: [AI Engineer](https://liquidgold.cc/channel/aidotengineer.md)

> Search chunk text is held until public-source provenance is verified.

## Document chunks

> Missing: no stored document chunks are available.
