[{"data":1,"prerenderedAt":1497},["ShallowReactive",2],{"navigation_docs":3,"-apps-testing-publishing":282,"-apps-testing-publishing-surround":1492},[4,40,70,99,122,156,189,253],{"title":5,"path":6,"stem":7,"children":8,"page":39},"入门指南","\u002Fgetting-started","1.getting-started",[9,14,19,24,29,34],{"title":10,"path":11,"stem":12,"icon":13},"简介","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-book-open",{"title":15,"path":16,"stem":17,"icon":18},"安装","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"配置","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F3.configuration","i-lucide-settings",{"title":25,"path":26,"stem":27,"icon":28},"Inspector","\u002Fgetting-started\u002Finspector","1.getting-started\u002F4.inspector","i-lucide-circuit-board",{"title":30,"path":31,"stem":32,"icon":33},"Connection","\u002Fgetting-started\u002Fconnection","1.getting-started\u002F5.connection","i-lucide-plug",{"title":35,"path":36,"stem":37,"icon":38},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F6.agent-skills","i-lucide-sparkles",false,{"title":41,"path":42,"stem":43,"children":44,"page":39},"工具","\u002Ftools","2.tools",[45,50,55,60,65],{"title":46,"path":47,"stem":48,"icon":49},"概览","\u002Ftools\u002Foverview","2.tools\u002F0.overview","i-lucide-wrench",{"title":51,"path":52,"stem":53,"icon":54},"Schema, handler & returns","\u002Ftools\u002Fschema-handler","2.tools\u002F1.schema-handler","i-lucide-braces",{"title":56,"path":57,"stem":58,"icon":59},"注释与输入示例","\u002Ftools\u002Fannotations","2.tools\u002F2.annotations","i-lucide-badge-info",{"title":61,"path":62,"stem":63,"icon":64},"错误与缓存","\u002Ftools\u002Ferrors-caching","2.tools\u002F3.errors-caching","i-lucide-shield",{"title":66,"path":67,"stem":68,"icon":69},"分组、文件与动态注册","\u002Ftools\u002Fgroups-organization","2.tools\u002F4.groups-organization","i-lucide-tags",{"title":71,"path":72,"stem":73,"children":74,"page":39},"资源","\u002Fresources","3.resources",[75,79,84,89,94],{"title":46,"path":76,"stem":77,"icon":78},"\u002Fresources\u002Foverview","3.resources\u002F0.overview","i-lucide-package",{"title":80,"path":81,"stem":82,"icon":83},"静态资源与结构","\u002Fresources\u002Fstatic-and-structure","3.resources\u002F1.static-and-structure","i-lucide-file-stack",{"title":85,"path":86,"stem":87,"icon":88},"模板与处理程序","\u002Fresources\u002Ftemplates-and-handlers","3.resources\u002F2.templates-and-handlers","i-lucide-git-branch",{"title":90,"path":91,"stem":92,"icon":93},"元数据、内容与错误","\u002Fresources\u002Fcontent-metadata-errors","3.resources\u002F3.content-metadata-errors","i-lucide-layers",{"title":95,"path":96,"stem":97,"icon":98},"分组与组织","\u002Fresources\u002Forganization","3.resources\u002F4.organization","i-lucide-folder-tree",{"title":100,"path":101,"stem":102,"children":103,"page":39},"提示词","\u002Fprompts","4.prompts",[104,108,113,117],{"title":46,"path":105,"stem":106,"icon":107},"\u002Fprompts\u002Foverview","4.prompts\u002F0.overview","i-lucide-message-square",{"title":109,"path":110,"stem":111,"icon":112},"编写与结构","\u002Fprompts\u002Fauthoring","4.prompts\u002F1.authoring","i-lucide-pen-line",{"title":114,"path":115,"stem":116,"icon":93},"输入、处理器与消息","\u002Fprompts\u002Finput-handler-messages","4.prompts\u002F2.input-handler-messages",{"title":118,"path":119,"stem":120,"icon":121},"模式与高级用法","\u002Fprompts\u002Fpatterns-advanced","4.prompts\u002F3.patterns-advanced","i-lucide-line-chart",{"title":123,"path":124,"stem":125,"children":126,"page":39},"处理器","\u002Fhandlers","5.handlers",[127,131,136,141,146,151],{"title":46,"path":128,"stem":129,"icon":130},"\u002Fhandlers\u002Foverview","5.handlers\u002F0.overview","i-lucide-server",{"title":132,"path":133,"stem":134,"icon":135},"默认与自定义处理器","\u002Fhandlers\u002Fdefault-and-custom","5.handlers\u002F1.default-and-custom","i-lucide-toggle-left",{"title":137,"path":138,"stem":139,"icon":140},"结构与选项","\u002Fhandlers\u002Fstructure-and-options","5.handlers\u002F2.structure-and-options","i-lucide-sliders-horizontal",{"title":142,"path":143,"stem":144,"icon":145},"示例与路由","\u002Fhandlers\u002Fexamples-routing","5.handlers\u002F3.examples-routing","i-lucide-route",{"title":147,"path":148,"stem":149,"icon":150},"分享与实践","\u002Fhandlers\u002Fsharing-practices","5.handlers\u002F4.sharing-practices","i-lucide-share-2",{"title":152,"path":153,"stem":154,"icon":155},"多处理器组织","\u002Fhandlers\u002Forganization","5.handlers\u002F5.organization","i-lucide-network",{"title":157,"path":158,"stem":159,"children":160,"page":39},"应用","\u002Fapps","6.apps",[161,165,170,175,179,184],{"title":46,"path":162,"stem":163,"icon":164},"\u002Fapps\u002Foverview","6.apps\u002F0.overview","i-lucide-app-window",{"title":166,"path":167,"stem":168,"icon":169},"编写与 defineMcpApp","\u002Fapps\u002Fauthoring","6.apps\u002F1.authoring","i-lucide-code-2",{"title":171,"path":172,"stem":173,"icon":174},"useMcpApp() 桥接","\u002Fapps\u002Fuse-mcp-app","6.apps\u002F2.use-mcp-app","i-lucide-message-circle",{"title":176,"path":177,"stem":178,"icon":64},"CSP 与构建流水线","\u002Fapps\u002Fcsp-and-wiring","6.apps\u002F3.csp-and-wiring",{"title":180,"path":181,"stem":182,"icon":183},"测试与发布","\u002Fapps\u002Ftesting-publishing","6.apps\u002F4.testing-publishing","i-lucide-rocket",{"title":185,"path":186,"stem":187,"icon":188},"模式与限制","\u002Fapps\u002Fpatterns-reference","6.apps\u002F5.patterns-reference","i-lucide-book-marked",{"title":190,"path":191,"stem":192,"children":193,"page":39},"进阶主题","\u002Fadvanced","7.advanced",[194,199,204,209,214,218,223,228,233,238,243,248],{"title":195,"path":196,"stem":197,"icon":198},"自定义路径","\u002Fadvanced\u002Fcustom-paths","7.advanced\u002F1.custom-paths","i-lucide-folder",{"title":200,"path":201,"stem":202,"icon":203},"日志","\u002Fadvanced\u002Flogging","7.advanced\u002F10.logging","i-lucide-scroll-text",{"title":205,"path":206,"stem":207,"icon":208},"MCP Apps 内部机制","\u002Fadvanced\u002Fmcp-apps-internals","7.advanced\u002F11.mcp-apps-internals","i-lucide-cog",{"title":210,"path":211,"stem":212,"icon":213},"列出定义","\u002Fadvanced\u002Flisting-definitions","7.advanced\u002F12.listing-definitions","i-lucide-list",{"title":215,"path":216,"stem":217,"icon":64},"Middleware","\u002Fadvanced\u002Fmiddleware","7.advanced\u002F2.middleware",{"title":219,"path":220,"stem":221,"icon":222},"TypeScript","\u002Fadvanced\u002Ftypescript","7.advanced\u002F3.typescript","i-lucide-type",{"title":224,"path":225,"stem":226,"icon":227},"Hooks","\u002Fadvanced\u002Fhooks","7.advanced\u002F4.hooks","i-lucide-webhook",{"title":229,"path":230,"stem":231,"icon":232},"MCP 评估","\u002Fadvanced\u002Fevals","7.advanced\u002F5.evals","i-lucide-flask-conical",{"title":234,"path":235,"stem":236,"icon":237},"会话","\u002Fadvanced\u002Fsessions","7.advanced\u002F6.sessions","i-lucide-database",{"title":239,"path":240,"stem":241,"icon":242},"动态定义","\u002Fadvanced\u002Fdynamic-definitions","7.advanced\u002F7.dynamic-definitions","i-lucide-toggle-right",{"title":244,"path":245,"stem":246,"icon":247},"代码模式 (Code Mode)","\u002Fadvanced\u002Fcode-mode","7.advanced\u002F8.code-mode","i-lucide-code",{"title":249,"path":250,"stem":251,"icon":252},"启发式询问","\u002Fadvanced\u002Felicitation","7.advanced\u002F9.elicitation","i-lucide-message-square-quote",{"title":254,"path":255,"stem":256,"children":257,"page":39},"示例","\u002Fexamples","8.examples",[258,263,268,273,278],{"title":259,"path":260,"stem":261,"icon":262},"身份验证","\u002Fexamples\u002Fauthentication","8.examples\u002F1.authentication","i-lucide-shield-check",{"title":264,"path":265,"stem":266,"icon":267},"API 集成","\u002Fexamples\u002Fapi-integration","8.examples\u002F2.api-integration","i-lucide-globe",{"title":269,"path":270,"stem":271,"icon":272},"常见模式","\u002Fexamples\u002Fcommon-patterns","8.examples\u002F3.common-patterns","i-lucide-lightbulb",{"title":274,"path":275,"stem":276,"icon":277},"文件操作","\u002Fexamples\u002Ffile-operations","8.examples\u002F4.file-operations","i-lucide-file",{"title":279,"path":280,"stem":281,"icon":107},"提示词示例","\u002Fexamples\u002Fprompt-examples","8.examples\u002F5.prompt-examples",{"id":283,"title":180,"body":284,"description":1483,"extension":1484,"links":1485,"meta":1486,"navigation":1487,"path":181,"seo":1488,"stem":182,"__hash__":1491},"docs\u002F6.apps\u002F4.testing-publishing.md",{"type":285,"value":286,"toc":1462},"minimark",[287,291,396,407,410,424,427,491,494,505,525,559,562,566,569,586,589,598,604,613,616,660,667,676,679,706,709,818,821,886,893,897,904,913,920,962,965,1069,1076,1080,1083,1136,1165,1168,1179,1182,1206,1209,1212,1228,1236,1239,1250,1254,1257,1329,1336,1340,1347,1357,1360,1364,1367,1370,1389,1392,1395,1398,1458],[288,289,290],"h2",{"id":290},"宿主兼容性",[292,293,294,326],"table",{},[295,296,297],"thead",{},[298,299,300,304,307,313,318,323],"tr",{},[301,302,303],"th",{},"宿主",[301,305,306],{},"渲染",[301,308,309],{},[310,311,312],"code",{},"sendPrompt",[301,314,315],{},[310,316,317],{},"callTool",[301,319,320],{},[310,321,322],{},"openLink",[301,324,325],{},"说明",[327,328,329,350,373],"tbody",{},[298,330,331,338,341,343,345,347],{},[332,333,334],"td",{},[335,336,337],"strong",{},"Cursor",[332,339,340],{},"✅",[332,342,340],{},[332,344,340],{},[332,346,340],{},[332,348,349],{},"使用 JSON-RPC bridge 和旧版 ready\u002Fresize 消息进行了测试。",[298,351,352,357,359,362,364,366],{},[332,353,354],{},[335,355,356],{},"ChatGPT (Apps SDK)",[332,358,340],{},[332,360,361],{},"⚠️",[332,363,340],{},[332,365,340],{},[332,367,368,369,372],{},"可用时使用 ",[310,370,371],{},"window.openai","。后续消息会发送，但下一次工具结果并不总是以内联方式渲染。",[298,374,375,380,382,385,387,389],{},[332,376,377],{},[335,378,379],{},"MCP UI \u002F Inspector 风格宿主",[332,381,340],{},[332,383,384],{},"varies",[332,386,384],{},[332,388,384],{},[332,390,391,392,395],{},"bridge 会发出规范的 JSON-RPC 消息，并在有用时发出旧版 ",[310,393,394],{},"mcp-ui"," 封装。请在记录支持情况前逐个宿主验证。",[397,398,399,400,402,403,406],"p",{},"bridge 会在握手时自动检测宿主，并适配其协议——对于 MCP UI 宿主使用现代 JSON-RPC，对于旧客户端使用旧版 ",[310,401,394],{}," 封装，在存在 ChatGPT Apps SDK 全局对象时则使用它们。你的代码只需要调用 ",[310,404,405],{},"useMcpApp()","。",[288,408,409],{"id":409},"本地测试循环",[397,411,412,413,416,417,420,421,406],{},"MCP Apps 使用与工具、资源和提示词相同的可流式传输 HTTP 端点。默认路由是 ",[310,414,415],{},"\u002Fmcp","，除非你在 ",[310,418,419],{},"nuxt.config"," 中设置了 ",[310,422,423],{},"mcp.route",[397,425,426],{},"启动你的 Nuxt 应用：",[428,429,430,452,467,479],"code-group",{},[431,432,438],"pre",{"className":433,"code":434,"filename":435,"language":436,"meta":437,"style":437},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm dev\n","pnpm","bash","",[310,439,440],{"__ignoreMap":437},[441,442,445,448],"span",{"class":443,"line":444},"line",1,[441,446,435],{"class":447},"sBMFI",[441,449,451],{"class":450},"sfazB"," dev\n",[431,453,456],{"className":433,"code":454,"filename":455,"language":436,"meta":437,"style":437},"npm run dev\n","npm",[310,457,458],{"__ignoreMap":437},[441,459,460,462,465],{"class":443,"line":444},[441,461,455],{"class":447},[441,463,464],{"class":450}," run",[441,466,451],{"class":450},[431,468,471],{"className":433,"code":469,"filename":470,"language":436,"meta":437,"style":437},"yarn dev\n","yarn",[310,472,473],{"__ignoreMap":437},[441,474,475,477],{"class":443,"line":444},[441,476,470],{"class":447},[441,478,451],{"class":450},[431,480,483],{"className":433,"code":481,"filename":482,"language":436,"meta":437,"style":437},"bun dev\n","bun",[310,484,485],{"__ignoreMap":437},[441,486,487,489],{"class":443,"line":444},[441,488,482],{"class":447},[441,490,451],{"class":450},[397,492,493],{},"你的本地 MCP URL 是：",[431,495,499],{"className":496,"code":497,"language":498,"meta":437,"style":437},"language-txt shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","http:\u002F\u002Flocalhost:3000\u002Fmcp\n","txt",[310,500,501],{"__ignoreMap":437},[441,502,503],{"class":443,"line":444},[441,504,497],{},[397,506,507,508,512,513,516,517,520,521,524],{},"先使用 ",[509,510,511],"a",{"href":26},"MCP Inspector","、",[310,514,515],{},"npx @modelcontextprotocol\u002Finspector@latest","，或 ",[335,518,519],{},"Nuxt DevTools"," 中的 ",[335,522,523],{},"MCP"," 面板。确认：",[526,527,528,540,546,553],"ul",{},[529,530,531,532,535,536,539],"li",{},"应用 SFC 显示为一个工具，例如 ",[310,533,534],{},"color-picker"," 或 ",[310,537,538],{},"release-control","；",[529,541,542,543,539],{},"调用该工具会返回 ",[310,544,545],{},"structuredContent",[529,547,548,549,552],{},"工具结果包含一个 ",[310,550,551],{},"text\u002Fhtml;profile=mcp-app"," 资源；",[529,554,555,556,406],{},"资源 URI 看起来像 ",[310,557,558],{},"ui:\u002F\u002Fmcp-app\u002F\u003Cname>",[397,560,561],{},"有些客户端可以调用工具，但无法渲染 iframe。验证 UI 本身时，请使用支持 MCP Apps 的宿主。",[288,563,565],{"id":564},"使用-ngrok-在-chatgpt-中测试","使用 ngrok 在 ChatGPT 中测试",[397,567,568],{},"ChatGPT 需要一个公开的 HTTPS 端点，即使在本地开发时也是如此。将你的本地 Nuxt 服务器隧道出去：",[431,570,572],{"className":433,"code":571,"language":436,"meta":437,"style":437},"ngrok http 3000\n",[310,573,574],{"__ignoreMap":437},[441,575,576,579,582],{"class":443,"line":444},[441,577,578],{"class":447},"ngrok",[441,580,581],{"class":450}," http",[441,583,585],{"class":584},"sbssI"," 3000\n",[397,587,588],{},"ngrok 会打印一个转发 URL：",[431,590,592],{"className":496,"code":591,"language":498,"meta":437,"style":437},"Forwarding https:\u002F\u002Fyour-subdomain.ngrok-free.dev -> http:\u002F\u002Flocalhost:3000\n",[310,593,594],{"__ignoreMap":437},[441,595,596],{"class":443,"line":444},[441,597,591],{},[397,599,600,601,603],{},"在该来源上使用 ",[310,602,415],{}," 路由：",[431,605,607],{"className":496,"code":606,"language":498,"meta":437,"style":437},"https:\u002F\u002Fyour-subdomain.ngrok-free.dev\u002Fmcp\n",[310,608,609],{"__ignoreMap":437},[441,610,611],{"class":443,"line":444},[441,612,606],{},[397,614,615],{},"在 ChatGPT 中：",[617,618,619,636,643,649,654,657],"ol",{},[529,620,621,622,625,626,625,629,632,633,406],{},"在 ",[335,623,624],{},"Settings"," → ",[335,627,628],{},"Apps",[335,630,631],{},"Advanced settings"," 中启用 ",[335,634,635],{},"Developer Mode",[529,637,638,639,625,641,406],{},"打开 ",[335,640,624],{},[335,642,628],{},[529,644,645,646,406],{},"点击 ",[335,647,648],{},"Create app",[529,650,651,652,406],{},"输入你的公开 MCP URL，包括 ",[310,653,415],{},[529,655,656],{},"启用该应用并开始新的聊天。",[529,658,659],{},"在输入提示之前，从 composer 中选择你的应用。",[397,661,662,663,666],{},"使用 ",[310,664,665],{},"@"," 提及该应用，这样 ChatGPT 就会通过你的连接器路由提示词：",[431,668,670],{"className":496,"code":669,"language":498,"meta":437,"style":437},"@Weather App London 的天气怎么样？\n",[310,671,672],{"__ignoreMap":437},[441,673,674],{"class":443,"line":444},[441,675,669],{},[397,677,678],{},"然后测试 iframe 行为：",[526,680,681,688,694,700],{},[529,682,683,684,687],{},"点击调用 ",[310,685,686],{},"callTool()"," 的按钮，并确认小组件在没有新的聊天轮次的情况下更新；",[529,689,683,690,693],{},[310,691,692],{},"sendPrompt()"," 的按钮，并确认对话中出现后续消息；",[529,695,683,696,699],{},[310,697,698],{},"openLink()"," 的按钮，并确认 ChatGPT 打开或提示外部 URL；",[529,701,702,703,705],{},"观察你的 Nuxt 终端和 ngrok 仪表盘中针对 ",[310,704,415],{}," 的 POST 请求。",[397,707,708],{},"如果你通过 ngrok 暴露本地开发环境，请在 Vite 中允许隧道主机：",[431,710,715],{"className":711,"code":712,"filename":713,"language":714,"meta":437,"style":437},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  vite: {\n    server: {\n      allowedHosts: ['.ngrok-free.dev', '.ngrok.app'],\n    },\n  },\n})\n","nuxt.config.ts","ts",[310,716,717,738,751,761,797,803,809],{"__ignoreMap":437},[441,718,719,723,726,730,734],{"class":443,"line":444},[441,720,722],{"class":721},"s7zQu","export",[441,724,725],{"class":721}," default",[441,727,729],{"class":728},"s2Zo4"," defineNuxtConfig",[441,731,733],{"class":732},"sTEyZ","(",[441,735,737],{"class":736},"sMK4o","{\n",[441,739,741,745,748],{"class":443,"line":740},2,[441,742,744],{"class":743},"swJcz","  vite",[441,746,747],{"class":736},":",[441,749,750],{"class":736}," {\n",[441,752,754,757,759],{"class":443,"line":753},3,[441,755,756],{"class":743},"    server",[441,758,747],{"class":736},[441,760,750],{"class":736},[441,762,764,767,769,772,775,778,780,783,786,789,791,794],{"class":443,"line":763},4,[441,765,766],{"class":743},"      allowedHosts",[441,768,747],{"class":736},[441,770,771],{"class":732}," [",[441,773,774],{"class":736},"'",[441,776,777],{"class":450},".ngrok-free.dev",[441,779,774],{"class":736},[441,781,782],{"class":736},",",[441,784,785],{"class":736}," '",[441,787,788],{"class":450},".ngrok.app",[441,790,774],{"class":736},[441,792,793],{"class":732},"]",[441,795,796],{"class":736},",\n",[441,798,800],{"class":443,"line":799},5,[441,801,802],{"class":736},"    },\n",[441,804,806],{"class":443,"line":805},6,[441,807,808],{"class":736},"  },\n",[441,810,812,815],{"class":443,"line":811},7,[441,813,814],{"class":736},"}",[441,816,817],{"class":732},")\n",[397,819,820],{},"对于 ChatGPT 之类的跨域宿主，请有意地配置 MCP origin 检查：",[431,822,824],{"className":711,"code":823,"filename":713,"language":714,"meta":437,"style":437},"export default defineNuxtConfig({\n  mcp: {\n    security: {\n      allowedOrigins: '*',\n    },\n  },\n})\n",[310,825,826,838,847,856,872,876,880],{"__ignoreMap":437},[441,827,828,830,832,834,836],{"class":443,"line":444},[441,829,722],{"class":721},[441,831,725],{"class":721},[441,833,729],{"class":728},[441,835,733],{"class":732},[441,837,737],{"class":736},[441,839,840,843,845],{"class":443,"line":740},[441,841,842],{"class":743},"  mcp",[441,844,747],{"class":736},[441,846,750],{"class":736},[441,848,849,852,854],{"class":443,"line":753},[441,850,851],{"class":743},"    security",[441,853,747],{"class":736},[441,855,750],{"class":736},[441,857,858,861,863,865,868,870],{"class":443,"line":763},[441,859,860],{"class":743},"      allowedOrigins",[441,862,747],{"class":736},[441,864,785],{"class":736},[441,866,867],{"class":450},"*",[441,869,774],{"class":736},[441,871,796],{"class":736},[441,873,874],{"class":443,"line":799},[441,875,802],{"class":736},[441,877,878],{"class":443,"line":805},[441,879,808],{"class":736},[441,881,882,884],{"class":443,"line":811},[441,883,814],{"class":736},[441,885,817],{"class":732},[397,887,888,889,892],{},"仅在演示或公开只读界面中使用 ",[310,890,891],{},"'*'","。对于包含私有数据或真实副作用的生产应用，请使用受信任来源列表。",[288,894,896],{"id":895},"部署到-vercel-或其他云平台","部署到 Vercel 或其他云平台",[397,898,899,900,903],{},"MCP Apps ",[335,901,902],{},"不"," 使用第二个 URL。部署 Nuxt 应用，并将 ChatGPT 连接到同一个 MCP 路由：",[431,905,907],{"className":496,"code":906,"language":498,"meta":437,"style":437},"https:\u002F\u002Fyour-project.vercel.app\u002Fmcp\n",[310,908,909],{"__ignoreMap":437},[441,910,911],{"class":443,"line":444},[441,912,906],{},[397,914,915,916,919],{},"工具包会从常见托管变量中自动检测 ",[310,917,918],{},"_meta.ui.domain","：",[526,921,922,928,938,944,950,956],{},[529,923,924,927],{},[310,925,926],{},"NUXT_PUBLIC_APP_URL",";",[529,929,930,931,934,935,927],{},"Vercel: ",[310,932,933],{},"VERCEL_PROJECT_PRODUCTION_URL",", ",[310,936,937],{},"VERCEL_URL",[529,939,940,941,927],{},"Netlify: ",[310,942,943],{},"URL",[529,945,946,947,927],{},"Render: ",[310,948,949],{},"RENDER_EXTERNAL_URL",[529,951,952,953,927],{},"Railway: ",[310,954,955],{},"RAILWAY_PUBLIC_DOMAIN",[529,957,958,959,406],{},"Fly: ",[310,960,961],{},"FLY_APP_NAME",[397,963,964],{},"如果你需要覆盖检测到的值，请显式设置它：",[431,966,971],{"className":967,"code":968,"filename":969,"language":970,"meta":437,"style":437},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\ndefineMcpApp({\n  _meta: {\n    ui: {\n      domain: 'https:\u002F\u002Fmy-app.example.com',\n    },\n  },\n})\n\u003C\u002Fscript>\n","app\u002Fmcp\u002Fmy-app.vue","vue",[310,972,973,1001,1010,1019,1028,1044,1048,1052,1059],{"__ignoreMap":437},[441,974,975,978,981,985,988,991,994,996,998],{"class":443,"line":444},[441,976,977],{"class":736},"\u003C",[441,979,980],{"class":743},"script",[441,982,984],{"class":983},"spNyl"," setup",[441,986,987],{"class":983}," lang",[441,989,990],{"class":736},"=",[441,992,993],{"class":736},"\"",[441,995,714],{"class":450},[441,997,993],{"class":736},[441,999,1000],{"class":736},">\n",[441,1002,1003,1006,1008],{"class":443,"line":740},[441,1004,1005],{"class":728},"defineMcpApp",[441,1007,733],{"class":732},[441,1009,737],{"class":736},[441,1011,1012,1015,1017],{"class":443,"line":753},[441,1013,1014],{"class":743},"  _meta",[441,1016,747],{"class":736},[441,1018,750],{"class":736},[441,1020,1021,1024,1026],{"class":443,"line":763},[441,1022,1023],{"class":743},"    ui",[441,1025,747],{"class":736},[441,1027,750],{"class":736},[441,1029,1030,1033,1035,1037,1040,1042],{"class":443,"line":799},[441,1031,1032],{"class":743},"      domain",[441,1034,747],{"class":736},[441,1036,785],{"class":736},[441,1038,1039],{"class":450},"https:\u002F\u002Fmy-app.example.com",[441,1041,774],{"class":736},[441,1043,796],{"class":736},[441,1045,1046],{"class":443,"line":805},[441,1047,802],{"class":736},[441,1049,1050],{"class":443,"line":811},[441,1051,808],{"class":736},[441,1053,1055,1057],{"class":443,"line":1054},8,[441,1056,814],{"class":736},[441,1058,817],{"class":732},[441,1060,1062,1065,1067],{"class":443,"line":1061},9,[441,1063,1064],{"class":736},"\u003C\u002F",[441,1066,980],{"class":743},[441,1068,1000],{"class":736},[397,1070,1071,1072,1075],{},"对于 Vercel，请确保你的构建包含你所部署工具包版本中的 MCP Apps 打包依赖。如果你测试的是一个未发布包，请使用新的 ",[310,1073,1074],{},"pkg.pr.new"," 构建，或在应用中安装所需的构建依赖，直到该包发布为止。",[288,1077,1079],{"id":1078},"为-chatgpt-提交做准备","为 ChatGPT 提交做准备",[397,1081,1082],{},"OpenAI 会在广泛分发前审核应用。在提交之前，请检查：",[526,1084,1085,1088,1093,1103,1110,1115,1118,1123,1133],{},[529,1086,1087],{},"你的 MCP 服务器可通过 HTTPS 公开访问；",[529,1089,1090,1091,539],{},"每个应用资源都返回 ",[310,1092,551],{},[529,1094,1095,1096,512,1099,1102],{},"每个应用工具都具有清晰的 ",[310,1097,1098],{},"description",[310,1100,1101],{},"inputSchema"," 和行为注解；",[529,1104,1105,1106,1109],{},"已存在 ",[310,1107,1108],{},"_meta.ui.resourceUri","（工具包会生成它）；",[529,1111,1112,1114],{},[310,1113,918],{}," 已设置或被自动检测；",[529,1116,1117],{},"对外部图片、脚本、字体、API 或 iframe 的 CSP 是显式配置的；",[529,1119,1120,1122],{},[310,1121,545],{}," 简洁且对模型来说是安全可读的；",[529,1124,1125,1126,1129,1130,1132],{},"大型或仅供小组件使用的数据放在 ",[310,1127,1128],{},"_meta"," 中，而不是 ",[310,1131,545],{}," 中；",[529,1134,1135],{},"如果你的应用需要公开分发，OAuth、隐私政策、应用名称、截图和测试提示词都已准备就绪。",[397,1137,1138,1139,1142,1143,1145,1146,1149,1150,1155,1156,1161,1162,1164],{},"当宿主暴露 ",[335,1140,1141],{},"Apps SDK","（",[310,1144,371],{},"）或强制执行小组件 CSP 时，工具包会将你的 ",[310,1147,1148],{},"csp"," 镜像到 ",[335,1151,1152],{},[310,1153,1154],{},"_meta.ui.csp"," 和 ",[335,1157,1158],{},[310,1159,1160],{},"openai\u002FwidgetCSP","。行为，尤其是 ",[310,1163,312],{}," 和后续重新渲染，可能会在 ChatGPT 不同版本之间发生变化。在提交或宣布支持之前，请重新测试你的应用。",[288,1166,1167],{"id":1167},"故障排查",[1169,1170,1172,1173,1175,1176],"h3",{"id":1171},"来自-mcp-的-403-forbidden","来自 ",[310,1174,415],{}," 的 ",[310,1177,1178],{},"403 Forbidden",[397,1180,1181],{},"请求已到达你的服务器，但未通过 origin 或 host 检查。",[526,1183,1184,1194,1200],{},[529,1185,1186,1187,1190,1191,1193],{},"对于 ChatGPT\u002Fngrok 演示，将 ",[310,1188,1189],{},"mcp.security.allowedOrigins"," 设置为 ",[310,1192,891],{}," 或受信任的来源列表。",[529,1195,1196,1197,406],{},"对于 Vite 开发服务器隧道，将隧道域名添加到 ",[310,1198,1199],{},"vite.server.allowedHosts",[529,1201,1202,1203,1205],{},"修改 ",[310,1204,713],{}," 后，重启 Nuxt 开发服务器。",[1169,1207,1208],{"id":1208},"小组件未渲染",[397,1210,1211],{},"检查工具结果：",[526,1213,1214,1219,1225],{},[529,1215,1216,1217,406],{},"资源 MIME 类型必须是 ",[310,1218,551],{},[529,1220,1221,1222,1224],{},"资源 URI 应与 ",[310,1223,1108],{}," 匹配。",[529,1226,1227],{},"宿主必须支持 MCP Apps。有些 MCP 客户端可以调用工具，但只显示文本。",[1169,1229,1231,1232,1235],{"id":1230},"没有收到-ui-消息","没有收到 ",[310,1233,1234],{},"ui\u002F*"," 消息",[397,1237,1238],{},"iframe 已加载，但宿主未启用 MCP Apps bridge。",[526,1240,1241,1244,1247],{},[529,1242,1243],{},"确认宿主将 HTML 作为 MCP App 资源渲染，而不是作为普通文件。",[529,1245,1246],{},"在宿主开发者工具中检查浏览器控制台是否有 CSP 或 sandbox 错误。",[529,1248,1249],{},"在 Cursor 或 ChatGPT 中测试以比较宿主行为。",[1169,1251,1253],{"id":1252},"csp-阻止了图片或-fetch-调用","CSP 阻止了图片或 fetch 调用",[397,1255,1256],{},"添加显式允许列表：",[431,1258,1260],{"className":711,"code":1259,"language":714,"meta":437,"style":437},"defineMcpApp({\n  csp: {\n    resourceDomains: ['https:\u002F\u002Fimages.example.com'],\n    connectDomains: ['https:\u002F\u002Fapi.example.com'],\n  },\n})\n",[310,1261,1262,1270,1279,1299,1319,1323],{"__ignoreMap":437},[441,1263,1264,1266,1268],{"class":443,"line":444},[441,1265,1005],{"class":728},[441,1267,733],{"class":732},[441,1269,737],{"class":736},[441,1271,1272,1275,1277],{"class":443,"line":740},[441,1273,1274],{"class":743},"  csp",[441,1276,747],{"class":736},[441,1278,750],{"class":736},[441,1280,1281,1284,1286,1288,1290,1293,1295,1297],{"class":443,"line":753},[441,1282,1283],{"class":743},"    resourceDomains",[441,1285,747],{"class":736},[441,1287,771],{"class":732},[441,1289,774],{"class":736},[441,1291,1292],{"class":450},"https:\u002F\u002Fimages.example.com",[441,1294,774],{"class":736},[441,1296,793],{"class":732},[441,1298,796],{"class":736},[441,1300,1301,1304,1306,1308,1310,1313,1315,1317],{"class":443,"line":763},[441,1302,1303],{"class":743},"    connectDomains",[441,1305,747],{"class":736},[441,1307,771],{"class":732},[441,1309,774],{"class":736},[441,1311,1312],{"class":450},"https:\u002F\u002Fapi.example.com",[441,1314,774],{"class":736},[441,1316,793],{"class":732},[441,1318,796],{"class":736},[441,1320,1321],{"class":443,"line":799},[441,1322,808],{"class":736},[441,1324,1325,1327],{"class":443,"line":805},[441,1326,814],{"class":736},[441,1328,817],{"class":732},[397,1330,1331,1332,1155,1334,406],{},"对于强制执行小组件 CSP 的宿主，工具包会将这些镜像到 ",[310,1333,1154],{},[310,1335,1160],{},[1169,1337,1339],{"id":1338},"vercel-找不到生成的-mcp-app-文件","Vercel 找不到生成的 MCP App 文件",[397,1341,1342,1343,1346],{},"请使用包含 MCP Apps 构建修复的工具包版本。旧的未发布构建可能会在运行时导入 ",[310,1344,1345],{},".nuxt\u002Fmcp-apps\u002Fgen\u002F*.ts","，而该文件在已部署的 Vercel function 中并不存在。",[1169,1348,1350,1351,535,1354],{"id":1349},"缺少-vite-plugin-singlefile-或-vitejsplugin-vue","缺少 ",[310,1352,1353],{},"vite-plugin-singlefile",[310,1355,1356],{},"@vitejs\u002Fplugin-vue",[397,1358,1359],{},"请使用提供 MCP Apps 打包依赖的工具包版本，或者在测试未发布构建时将它们安装到应用中。",[1169,1361,1363],{"id":1362},"chatgpt-一直显示旧的小组件","ChatGPT 一直显示旧的小组件",[397,1365,1366],{},"ChatGPT 可能会按 URI 缓存小组件模板。如果你进行了会破坏兼容性的 UI 更改，请更改资源 URI 或文件名，以便宿主加载新的模板。",[288,1368,1369],{"id":1369},"其他客户端",[397,1371,1372,512,1375,1378,1379,512,1381,1384,1385,1388],{},[335,1373,1374],{},"Claude Code",[335,1376,1377],{},"Claude Desktop","（启用远程 MCP 的情况下）、",[335,1380,337],{},[335,1382,1383],{},"VS Code"," 和类似 ",[335,1386,1387],{},"Codex"," 风格的客户端，会使用你用于工具的相同 MCP URL 连接到你的服务器。不存在单独的“仅应用”端点。",[397,1390,1391],{},"Web 和移动端的 ChatGPT\u002FClaude 应用可能不会在每个发布渠道都渲染 MCP UI 小组件。请始终在你支持的产品版本上验证内联 iframe。",[397,1393,1394],{},"在调试 JSON-RPC UI bridge 时，优先将 Cursor 作为主要开发工具；它是本模块测试套件中使用最充分的环境。",[288,1396,1397],{"id":1397},"相关内容",[526,1399,1400,1408,1413,1422,1430,1437,1444,1451],{},[529,1401,1402,1404,1405,1407],{},[509,1403,176],{"href":177}," — HTML 和 ",[310,1406,1128],{}," 是如何生成的。",[529,1409,1410,1412],{},[509,1411,185],{"href":186}," — iframe 约束和 API 速查表。",[529,1414,1415,1417,1418,1421],{},[509,1416,123],{"href":128}," — 如果你将应用与其他工具分开，可选的 ",[310,1419,1420],{},"https:\u002F\u002F…\u002Fmcp\u002Fapps"," 界面。",[529,1423,1424],{},[509,1425,1429],{"href":1426,"rel":1427},"https:\u002F\u002Fdevelopers.openai.com\u002Fapps-sdk\u002Fbuild\u002Fmcp-server",[1428],"nofollow","OpenAI：构建你的 MCP 服务器",[529,1431,1432],{},[509,1433,1436],{"href":1434,"rel":1435},"https:\u002F\u002Fdevelopers.openai.com\u002Fapps-sdk\u002Fdeploy\u002Fconnect-chatgpt",[1428],"OpenAI：从 ChatGPT 连接",[529,1438,1439],{},[509,1440,1443],{"href":1441,"rel":1442},"https:\u002F\u002Fdevelopers.openai.com\u002Fapps-sdk\u002Fdeploy\u002Ftesting",[1428],"OpenAI：测试你的集成",[529,1445,1446],{},[509,1447,1450],{"href":1448,"rel":1449},"https:\u002F\u002Fdevelopers.openai.com\u002Fapps-sdk\u002Fdeploy\u002Fsubmission",[1428],"OpenAI：提交并维护你的应用",[529,1452,1453],{},[509,1454,1457],{"href":1455,"rel":1456},"https:\u002F\u002Fdevelopers.openai.com\u002Fapps-sdk\u002Fapp-submission-guidelines",[1428],"OpenAI：应用提交指南",[1459,1460,1461],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":437,"searchDepth":740,"depth":740,"links":1463},[1464,1465,1466,1467,1468,1469,1481,1482],{"id":290,"depth":740,"text":290},{"id":409,"depth":740,"text":409},{"id":564,"depth":740,"text":565},{"id":895,"depth":740,"text":896},{"id":1078,"depth":740,"text":1079},{"id":1167,"depth":740,"text":1167,"children":1470},[1471,1473,1474,1476,1477,1478,1480],{"id":1171,"depth":753,"text":1472},"来自 \u002Fmcp 的 403 Forbidden",{"id":1208,"depth":753,"text":1208},{"id":1230,"depth":753,"text":1475},"没有收到 ui\u002F* 消息",{"id":1252,"depth":753,"text":1253},{"id":1338,"depth":753,"text":1339},{"id":1349,"depth":753,"text":1479},"缺少 vite-plugin-singlefile 或 @vitejs\u002Fplugin-vue",{"id":1362,"depth":753,"text":1363},{"id":1369,"depth":740,"text":1369},{"id":1397,"depth":740,"text":1397},"在本地测试 MCP Apps，选择兼容的宿主，并为 ChatGPT、Claude 和 IDE 客户端部署 HTTPS 端点。","md",null,{},{"icon":183},{"title":1489,"description":1490},"MCP Apps — 测试与发布","如何在本地测试 MCP UI，并为 ChatGPT、Claude、Cursor 和 VS Code 发布可流式传输的 HTTP MCP 服务器。","DcbZshBfaUe5rbpgjOAbo8hGQuSwoHLQaly3TsH7s5s",[1493,1495],{"title":176,"path":177,"stem":178,"description":1494,"icon":64,"children":-1},"内容安全策略、允许列表域名，以及 HTML bundle 的生成方式。",{"title":185,"path":186,"stem":187,"description":1496,"icon":188,"children":-1},"UI 模式、iframe 中不受支持的 Nuxt 功能，以及 API 参考。",1778659578959]