把互联网装进智能体:FastMCP 作者用 Python 造 UI 的古怪实验

Jeremiah Lowin · Prefect 创始人兼 CEO · 2026-09-12
听中文精华AI 合成朗读00:00
我们不是在试图从零开始构建一个前端。我们是在试图用一堆世界级的、设计精良的组件来组合出一个前端。
— Jeremiah Lowin

关联

人物 Jeremiah Lowin

公司 FastMCP · Prefab

概念 MCP Apps · MCP · 智能体 · 沙箱 · 生成式 UI

这一集讲的是智能体时代一个很新的玩法:让用户直接和工具的界面打交道,而这一切界面居然可以完全用 Python 写出来。演讲者是 FastMCP 的作者——FastMCP 是目前最流行的构建 MCP 服务器的 Python 框架之一,他所在的公司是 Prefect。他自称要分享的是「我写过的最古怪的软件之一」。

【背景】演讲者为 Jeremiah Lowin,Prefect 创始人兼 CEO、FastMCP 框架作者。此身份信息来自世界知识,转写稿中未出现其姓名。

先搞懂 MCP Apps:绕过智能体的直连界面

要理解他做的东西,得先知道 MCP Apps 是什么。MCP(智能体调用外部工具的协议)里,典型流程是:用户向智能体提请求,智能体调用托管在 MCP 服务器上的某个工具,结果返回智能体的上下文窗口,再由智能体组织一段回复给用户。也就是说,用户和 MCP 服务器之间从来没有直接连接,一切都要「经过智能体的大脑」。

MCP Apps 是今年一月推出的协议扩展,改变的就是这一点:智能体调用工具后,工具返回的不再是一段发给智能体的文本,而是一套完整的 HTML、CSS、JavaScript——一个真正的 UI,直接呈现给用户。用户可以在界面上订餐厅、换机票座位、浏览会议日程,智能体促成了这一切,但交互是人与界面直接完成的。用演讲者的话说,这相当于「把互联网装进你的智能体」。

痛点:Python 工程师不会写前端

MCP Apps 出现后,作为 FastMCP 作者,他的第一反应是:怎么把这个能力交付给用户?麻烦在于,FastMCP 用户主要是 Python 工程师,而且多在企业里工作。要给他们交付前端和 UI,总不能「假装我们要用 Python 发布 React——那是行不通的」。

他认真想了这些用户到底需要什么,答案改变了整个方案的性质:他们不需要完全品牌化的消费级自定义 UI,他们的职责是在组织内共享和收集信息——做表格、收表单、分享图表。这个约束反而成了突破口。

于是有了开源项目 Prefab:一个「限定范围的 UI 构建框架」,专门用于通过智能体交付上述这类界面。它的核心思路是:不是从零构建前端,而是用一堆世界级的、设计精良的组件组合出前端——护栏就来自这里,用户不是在做任意的事情,而是把一个结构良好的前端交到他人面前。

Prefab 怎么用 Python 写 UI

具体做法上,Prefab 主要靠 Python 的上下文管理器(一种用缩进块组织代码的语法结构):把组件作为上下文管理器层层嵌套,UI 的结构就在代码里自然呈现出来。他做了一个有趣的类比:FastMCP 的核心创新可以简化为「用一个装饰器构建了整个 MCP 服务器」,那么对 Prefab 就可以说「用一个上下文管理器构建了整个 UI」。每个 UI 组件是一个可实例化、可参数化的类,渲染出来就是漂亮的现代风格组件;再配合响应式变量(Rx 类),可以在代码任意位置引用数据并在组件间绑定,自动编译成对应的 JavaScript 实现——客户端交互性全程不用手写一行 JS。

底层管道是:Python DSL 构建 UI 的声明式表示 → 序列化为 JSON 协议 → 由一个 React 应用渲染为真正的 MCP 应用。关键在中间那个 JSON:因为 UI 有了可序列化的表示,它可以由智能体生成、发给智能体、由人生成再让智能体修改——这一中间表示解锁了一切。Python DSL 反而是事后自然长出来的产物。

一个能说明成熟度的细节:Prefab 发布了约 130 到 140 个组件,而它的文档 100% 用 Prefab 自己渲染——文档里每个示例的 Python 代码都在被实时渲染,点击就能进 playground 改代码、实时看到 UI 更新。

在 MCP 服务器里的三种用法(由浅入深)

第一种:交互式工具。 通常 MCP 工具返回的结果只给智能体,用户完全摸不着。

用 Prefab 只需改一行:工具函数结尾不返回 Python 字典,而是返回一个 Prefab 组件(比如数据表)。FastMCP 会自动检测到、自动推断你要返回 MCP 应用,把 HTML/CSS/渲染器全套备好。

用户问「给我看看团队名录」,弹出的就是一个支持搜索、筛选、排序、分页的完整交互表格。旁边想再加个饼图?导入网格和饼图、用上下文管理器组合进去即可——「一行代码,一个显著的大变化」,复杂性保持增量式。

第二种:带后端的完整应用。 写一个类作为 FastMCP 应用,用 app.ui 装饰入口函数返回基础 UI,再用 app.tools 装饰后端方法——UI 里就能直接引用它们,比如一个按钮把表单数据写进数据库。

他特别点名了上传场景:因为只有智能体有权访问 MCP 服务器,很多人在服务器上建了上传工具,却忘了必须由智能体实际调用,结果干的活是「世界上最昂贵的复制粘贴」——你给智能体一兆字节的文本,它一个字符一个字符地重新打字进 MCP。MCP 应用让文件绕过智能体直接进服务器,Prefab 把它做成了一行代码的上传组件。

第三种:完全生成式 UI 他向 Claude 说「开始流式输出你能想到的最有趣的 UI」,智能体把 UI 的协议表示流式传过来,系统实时修复、渲染已到达的部分——你甚至不需要自己定义 UI,只要把官方提供的能力共享给智能体,它就能给你造任何东西。

意外发现:流 Python 比流 JSON 省 70%

生成式 UI 跑起来后,他们发现原方案(智能体流式传 JSON)可以优化:UI 的 Python 表示比 JSON 表示小约 70%。于是现在改为直接把 Python 代码流式传输,在沙箱中执行、在服务器端转成 JSON 再渲染——在 token 效率、成本和延迟上都带来巨大收益。

Prefab 已完全内置进 FastMCP:装上可选组件、导入、返回,当天下午就能在自己的服务器上玩起来。文档在 prefab.prefect.io,完整库开源于 GitHub。

本集带走

  • MCP Apps 改变了交互模型:工具结果不再进智能体上下文,而是以完整 HTML/CSS/JS 的形式直达用户,用户直接与界面交互;七月版协议还会让智能体也能操作这个界面(比如和它下棋)。
  • 约束越窄,方案越美:不做通用前端框架、不做品牌化消费级 UI,只做表格/表单/图表这类组织内信息工具,Python 写 UI 才变得可行——「组合前端」而非「构建前端」。
  • 可序列化的 UI 表示是一切的钥匙:UI 有了 JSON 中间表示,人和智能体就能互相生成、修改界面;生成式 UI 由此而来。
  • 让智能体搬文件是最贵的复制粘贴:大文件上传应走 MCP 应用直连,别让智能体逐字符转述。
  • 一个反直觉的工程发现:流式传输 Python 代码、在沙箱执行再转 JSON,比直接流 JSON 小约 70%,省 token 也降延迟。
全部金句 5 条

我们不是在试图从零开始构建一个前端。我们是在试图用一堆世界级的、设计精良的组件来组合出一个前端。
We are not trying to build a frontend from scratch. We are trying to compose a frontend from a bunch of world-class, well-designed components.
—— Jeremiah Lowin · [06:10]

当我们约束这个问题,并记住我们是在组合一个 UI 而不是构建一个 UI 时,它就合理多了。
It makes a lot more sense when we constrain the problem and remember that we’re composing a UI rather than building it.
—— Jeremiah Lowin · [09:20]

这遵循了我们 Prefect 的很多软件都努力坚持的一个原则,那就是一行代码,一个显著的大变化。
So this follows a principle that we really try to hold in a lot of our software at Prefect, which is one line of code, one big noticeable change.
—— Jeremiah Lowin · [11:49]

却忘了智能体必须实际调用它,而最终你做的事情就是世界上最昂贵的复制粘贴操作。
Forget that the agent has to actually call it, and what you end up doing is the world’s most expensive copy-paste operation.
—— Jeremiah Lowin · [13:57]

我们最终发现,UI 的 Python 表示比 JSON 表示小大约 70%。
What we ended up discovering is that the Python representation of a UI is about 70% smaller than the JSON representation.
—— Jeremiah Lowin · [16:12]

接着看

顺着「智能体」挖下去

换个口味