原生界面、文件与会话¶
MCP Apps 是可移植的交互基础,OpenAI MCP Extensions 在支持的宿主中补充原生入口、文件、选择和会话协作。普通网站的WebMCP与标注API是另一执行环境。接口来源见参考资料。
标准桥接优先¶
| 目的 | MCP Apps | ChatGPT兼容别名或扩展 |
|---|---|---|
| 绑定工具与UI | _meta.ui.resourceUri |
openai/outputTemplate兼容别名 |
| 输入与初始化 | ui/initialize、ui/notifications/tool-input |
window.openai.toolInput |
| 结果更新 | ui/notifications/tool-result |
window.openai.toolOutput |
| UI调用工具 | tools/call |
window.openai.callTool |
| 发出后续消息请求 | ui/message |
window.openai.sendFollowUpMessage |
| 更新模型可见上下文 | ui/update-model-context |
按扩展增强附件和显示 |
UI使用SDK完成握手、能力协商和消息校验,不把任意postMessage当可信宿主输入。新实现优先中间列,专有能力逐项检测,不能根据userAgent字符串猜支持情况。
需要批准的工具,初始toolInput可以为空。宿主在批准后通过tool-input通知交付,UI不能以空值自行调用默认写操作。
OpenAI 原生扩展目录¶
以下11类已列入官方扩展概览。该页主要描述ChatGPT界面,不据此宣称每类均可用于Codex、CLI、所有计划或云端表面。采用方冻结SDK与宿主版本后逐项实测;正文未列出的底层扩展字段不应由名称猜造。
| 扩展 | 产品用途 | AXI接入要求与降级 |
|---|---|---|
| Sidebar apps | 全局侧栏打开应用 | 保留当前账号、项目与深链;无入口时由工具返回视图 |
| Conversation panels | 与会话并排工作 | 绑定原会话与任务,切会话不混入另一上下文 |
| Plugin settings | 宿主内设置产品参数 | 区分产品偏好、连接和模型密钥;无原生设置时使用产品设置页 |
| File viewers and editors | 按扩展名打开文件、更新与保存 | 绑定宿主资源URI、修订与文件权限;保留原文件格式 |
| Display modes | inline、fullscreen、PiP等呈现 | 协商可用模式,适配宿主尺寸;拒绝时保持当前可用视图 |
| Deep links | 进入应用内指定对象 | 链接不授予权限,打开后重验对象、身份与修订 |
| Extended model context | 选区、附件与输入框上下文 | 传精确引用和有限摘要,不导出整个项目或凭据 |
| Extended message sending | 发送到当前或新会话 | 以用户意图和已协商目标为准,防止重复发送和自激循环 |
| Composer mentions | 输入框内检索并引用内容 | 官方限定桌面;引用时固定版本并重验权限,无支持时返回可读引用 |
| Extended forms | 结构化输入和图片选项 | 能力协商,处理accept/decline/cancel;不以超时当批准 |
| Plugin onboarding | 安装后接续setup方法 | 当前任务所需时渐进连接,无远程需求先完成本地目标 |
原生面板、文件编辑器和输入框引用属于插件产品集成,不要求把网页编辑器搬进一个小卡片。标准MCP Apps和宿主专有扩展必须分别记录支持范围。
工具与原生入口元数据¶
以下为注册MCP App工具时的_meta片段;实际工具仍需Schema、权限和正式执行器。
const panelMetadata = {
ui: { resourceUri: "ui://review/workspace" },
"openai/ui": {
entrypoints: [{ type: "thread" }],
},
};
const fileMetadata = {
ui: { resourceUri: "ui://review/markdown-viewer" },
"openai/ui": {
entrypoints: [{ type: "file", extensions: ["md"] }],
},
};
type: "global"表示侧栏入口,thread表示会话面板,file表示文件处理入口。extensions匹配扩展名,不赋予磁盘遍历能力。文件App收到的是资源URI,不应把它当宿主本地绝对路径。
UI资源内容使用text/html;profile=mcp-app。工具描述的_meta.ui.visibility可限定model、app或两者;这只是发现/调用面,不替代服务端授权。资源的_meta["openai/ui"].availableDisplayModes可在载入前声明支持模式,仍需初始化协商。
状态、上下文与持久化¶
sequenceDiagram
actor U as 用户
participant H as 宿主
participant A as MCP App
participant S as 业务服务
H->>A: 初始化与支持能力
H->>A: 原工具输入和结果
U->>A: 选择区域并暂存意见
A->>H: 更新有限模型上下文
U->>A: 明确保存
A->>H: tools/call 原对象、修订与操作键
H->>S: 按连接身份及审查转发
S-->>A: 已保存修订或冲突
U->>A: 请求在对话继续
A->>H: 按协商能力请求消息
H-->>A: 桥接请求结果
H->>S: Agent回读原保存对象
S-->>H: 当前获权内容与状态
业务内容和跨会话状态存于正式文件或服务。widgetState / setWidgetState()可保存视图实例状态,但不能充当多人业务数据库、CAS或任务恢复日志。设置值不能混入密钥。
content与structuredContent对模型可见;结果_meta仅交付组件,但仍应只含组件获权的最少数据,不是安全凭据库。toolResponseMetadata用于保留完整工具回执,不用纯UI成功状态覆盖服务端未知状态。
上下文更新不会自动执行修改;消息桥接请求也不证明业务已完成。视图关闭或新消息发出后,Agent按原对象、修订与操作回读。引用内容中的指令不扩大用户授权。
文件桥接¶
| 公开组件方法 | 用途 | 限制 |
|---|---|---|
window.openai.uploadFile(file, {library?}) |
上传用户选定文件,返回fileId | 可选library受账号能力限制;上传是明确的数据传输 |
window.openai.selectFiles() |
选择宿主文件库中的文件 | 功能检测;不能据此读取任意本机文件 |
window.openai.getFileDownloadUrl({fileId}) |
获得临时下载地址 | 仅限插件获权的文件引用,地址不长期持久化 |
工具的_meta["openai/fileParams"]可声明文件输入字段。输入是含download_url与file_id的文件对象,而不是应用可随意拼装的宿主路径。下载后校验类型、大小、摘要和实际解码,失败保留原引用。
内置浏览器的通用自动化上传限制与MCP App的显式文件选择/上传桥接是不同能力。不要因组件有uploadFile,就宣称Agent可自动操作浏览器任意上传框。
本地优先产品默认使用本地文件;上传或转存到宿主文件库在实际需要时明确触发。保存编辑时遵守原文件或领域的修订合同,不能用临时下载URL作为版本ID。
组件窗口与外链¶
requestDisplayMode()、requestModal({params, template})、requestClose()、notifyIntrinsicHeight()、openExternal({href, redirectUrl})和setOpenInAppUrl({href})是官方列出的可选组件桥接。它们只在提供它们的组件环境使用,普通网页不能假设存在。
模态窗口用于聚焦的选择与编辑,关闭后恢复焦点。全屏与PiP不是多个独立业务任务。高度通知用于避免裁剪,不在每帧反馈中制造无限resize循环。
外链、资源、连接和嵌套frame分别按CSP声明:_meta.ui.csp使用connectDomains、resourceDomains和可选frameDomains。ChatGPT的openExternal跳转允许列表仍使用兼容openai/widgetCSP.redirect_domains,不能误以为标准CSP已包含它。
原生选择与权限请求¶
MCP elicitation区分form与URL请求;OpenAI增强表单还可带图片选项。原生选择适用于用户本来要做的决定,例如输出目录、候选或当前缺少的模型连接,不重复询问已确定上下文。
增强表单的选项使用const、title及可选x-openai-thumbnail。OpenAI已注册MCP服务按当前指南需要MRTR支持;不能只返回一段JSON就宣称弹出了宿主图片选择框。协议能力与输入范围先协商,拒绝和取消有独立结果。
不要在普通表单里收集密码或私钥。登录使用对应URL/OAuth流程;任一native form都不免除业务最终授权。无表单支持时,TTY交互或现有网页接管继续同一个任务,非TTY返回结构化缺口。
验收边界¶
记录每项扩展的宿主、模式、连接与SDK制品。测试初始化失败、缺输入、无扩展、外链拒绝、文件撤权、并发保存、上下文切换、重挂载及消息重复。没有在目标宿主运行过的能力标为文档适配,见验证矩阵。