> 这是一篇迟到了大半年的分享。年初写到一半就扔进了抽屉,直到上个月 OpenAI 发布 Intelligent UI,才让我把它重新翻出来  ## 先看一眼"未来"长什么样 10 月 7 日,OpenAI 给 ChatGPT 全量推送了 GPT-6,这次更新引入了一个叫 Intelligent UI 的能力,让 ChatGPT 能用完全交互式的用户界面来回答问题,而不只是纯文本。  看到这里你大概率会「哦」一声——这不就是"AI 画个图给我看"吗?但真正值得玩味的,是这件事背后那套更底层、更早就存在、而且是开放标准的技术路线。它早于 Intelligent UI 出现,却一直不温不火。今天我们就把它和"动态生成 UI"这个终极形态一起捋清楚。 Intelligent UI的闭源能力,拆解开来其实是两个相对独立的问题: - **怎么让一个预先写好的 UI,出现在 Agent 的对话里,并且能跟 Agent 双向聊天?** - **这个 UI 能不能不是"预先写好的",而是模型现场生成的** 我们一步步拆。 ## 🛑 痛点溯源:被“锁死”的表达欲,AI 成了“瞎子导航员” 在 MCP Apps 出现之前,所有的 AI 工具都有一个令人窒息的局限:缺乏标准化的视觉展现通道。 换句话说,你让 AI “帮我分析一下第一季度的销售数据”,它脑子里其实已经建好了一个完美的数据模型,但它能做的,就是把一堆数字用干巴巴的文字吐给你: > “1月销售额 12,000 元,2月 9,800 元,3月 15,400 元……”  这就像什么? 就像你打电话给一个朋友,让他帮你看地图导航,他明明对着一个高清的卫星地图,却只能在电话里跟你念:“前方直行500米,过三个红绿灯,看到沙县小吃左转……” 他没法直接把地图屏幕投射到你眼前。 AI 的能力是通天的,但它的表达方式被文本框死死锁住了。 MCP Apps 诞生的使命,就是砸碎这把锁。 ## 🖼️ 破局直觉:在对话框里,硬生生砸出一扇窗 解法说出来其实特别朴素:在 AI 的回复里,直接嵌一个能跑真实网页的小窗口。 我最早的直觉是:iframe 内嵌一个网页不就完了?实际做下来才发现,这只解决了"用户能看"的问题,完全没解决"用户能做"的问题——用户在窗口里点一下按钮,这个动作要怎么传回 AI?所以这扇窗户,需要两把钥匙才能真正打开。 ### 🔑 钥匙一:工具身上多了一个"门牌号" 普通的 MCP 工具,就是一个服务器端能执行的函数——查数据库、发邮件、搜索网页。 MCP Apps 的工具,和普通工具**几乎完全一样**,唯一的区别是:它在自我介绍的时候,多带了一行地址: ```json { "name": "visualize_data", "description": "以交互式图表方式可视化数据", "_meta": { "ui": { "resourceUri": "ui://charts/interactive" } } } ```  这个地址指向MCP服务中一个打包好的UI资源,包括HTML网页和Javascript脚本等。当大模型调用这个工具时,客户端不仅执行了函数,还顺着这个地址把对应的 UI 界面给拉取了下来。比如在下一章我们准备介绍的PPTX-HTML编辑器的MCP中,它就是一个HTML编辑器。 有了这把钥匙,AI 调用 MCP 的整个流程就发生了质变,原本干瘪的文本瞬间拥有了血肉:  ### 🔑 钥匙二:如何让窗户里的网页"活"起来 “窗户”开好了,界面也有了。但真正的硬核问题来了:这个嵌进来的网页,怎么知道要显示什么数据?如果我在网页里点了一个“筛选”按钮,它怎么能让 AI 知道,并触发新的查询? 这就是 MCP Apps 最精妙的**双向通信机制**。 #### To UI:数据是怎么进去的 工具执行的结果,包含两部分数据 - **content**:给模型和用户读的文本摘要,当宿主不支持UI也能fallback到常规对话 - **structuredContent**:给 UI 渲染用的结构化 JSON 数据 **这一招“明修栈道,暗度陈仓”,让模型只看文字摘要保持专注,而图表吃到完整的 JSON 数据,两条路径互不干扰。** #### From UI:用户在 UI 里动了一下,然后呢?  从 View 可以发起三种截然不同的动作: 1. 🚄 **`callServerTool`:绕过 LLM,直达服务器** * **原理**:比如用户在图表里点击了"按华东区筛选",宿主会直接去 MCP 服务器重新查一次数据,把新数据渲染回来。 * **妙处**:中间**完全不经过大模型**!没有幻觉,100% 准确,毫秒级响应。最适合对数据准确性和速度要求极高的 BI 数据分析场景。 2. 🎭 **`sendMessage`:代替用户,向 AI 喊话** * **原理**:你在一个复杂的筛选 UI 里勾选了 10 个条件,点击"开始分析"。UI 会把这 10 个条件组装成一条标准的用户消息(User Message),直接发给 Agent。 * **妙处**:**大模型看到的,就是一条来自用户的文字指令。** 比如我做的PPTX编辑器,打开后用户可以框选ppt位置进行批注,点击发送就会直接向Agent发送一条包含位置和用户comment的消息让Agent定向优化对应位置。 3. **`updateModelContext`:最隐秘的上下文注入** * **原理**:这是三条路里最精妙的。它会把 App 的当前状态悄悄“塞”进模型的上下文记忆里,**不会触发任何即时回复**。 * **妙处**:想象一个大众点评的地图 UI,你用鼠标框选了“西直门”。然后你在对话框里随口问:“有什么好吃的?” AI 收到的其实是被 UI 重新组装过的话:`[系统备注:用户当前地图定位在西直门商圈] 有什么好吃的?` 体验极其丝滑自然! ## 🎨 “预制菜”迈向“现炒现卖”的实时 UI 看到这里,懂行的朋友会发现一个盲点:MCP App 解决的只是预设 UI 的双向交互问题。UI 本身还是程序员提前写好的“静态资产”。 **那如何利用大模型逆天的 Coding 能力,让它在聊天中“现场写一个 App”出来呢?**  这就不得不提 **lustereczko-mcp** 做出的一个精妙绝伦的**“黑客级”操作**: 它直接劫持了 MCP App 获取静态资源的流程!当宿主请求 `ui://` 资源时,它不返回提前写好的 HTML,而是返回一块**“空白画布”**。 紧接着,LLM 会调用一个名为 `display_ui_to_user` 的工具,把它刚刚现场手搓出来的 HTML/JS 代码作为参数传进去,**直接糊在这块空白画布上!** 对比 OpenAI 的 Intelligent UI(通常使用原生组件库 + 专用编译器来保证渲染流式体验和统一风格,类似谷歌年初的A2UI),`lustereczko-mcp` 的方案更加狂野和极客。考虑到当前AI写前端代码的能力,个人还是更看好这种方案,AI已经能飞了何必束手束脚。 当然自由生成就需要解决,比如生成HTML有问题如何排查,更复杂的数据如何交互等问题。例如可以为HTML配备测试环境和日志收集,或许还可以单独提供HTML测试修复的技能等等。 ## 🔮 理想丰满,现实骨感?未来的风向标 其实年初我就想写这篇内容,但当时发现 MCP Apps 并没有像预期那样火爆,于是决定让子弹飞一会儿。直到最近我在做纯个人的开源项目 `pptx-skill` 时,正好需要用 MCP-App 作为 HTML 层编辑的协议,才重新审视了这套设计。 **为什么它之前没火?** 仔细想想,由场景决定的。适合做成这种高度交互 App 形态的,要么是企业内部极其复杂的业务流,要么是重交互的 B2C 应用(电商、地图、外卖)。纯个人使用的场景相对较少,这和 SKILL 纯个人使用的轻量级定位截然不同。 **但现在,风向变了。** 随着 OpenAI 全面推出 Intelligent UI,这头行业大象正在强行重塑用户的习惯。对话框里全面接入各种模态的、可交互的、实时生成的 UI 展示,即将迎来一波彻底的爆发。 属于“图形化 AI 交互”的黄金时代,才刚刚开始。我们,拭目以待!