[{"data":1,"prerenderedAt":2559},["ShallowReactive",2],{"navigation_docs":3,"-apps-authoring":282,"-apps-authoring-surround":2554},[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":166,"body":284,"description":2545,"extension":2546,"links":2547,"meta":2548,"navigation":2549,"path":167,"seo":2550,"stem":168,"__hash__":2553},"docs\u002F6.apps\u002F1.authoring.md",{"type":285,"value":286,"toc":2534},"minimark",[287,291,295,1202,1205,1261,1264,1289,1340,1358,1362,1373,1446,1458,1461,1472,1481,1543,1550,1598,1608,1715,1738,1743,1754,1928,1954,1957,1971,2130,2146,2156,2160,2174,2237,2349,2528,2531],[288,289,290],"h2",{"id":290},"快速开始",[292,293,294],"p",{},"一个完整的应用——schema、服务器处理器、UI——全部写在一个文件里：",[296,297,303],"pre",{"className":298,"code":299,"filename":300,"language":301,"meta":302,"style":302},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { z } from 'zod'\n\ninterface PalettePayload {\n  base: string\n  swatches: { name: string, hex: string }[]\n}\n\ndefineMcpApp({\n  description: '选择一种颜色并预览一个 5 色调色板。',\n  inputSchema: {\n    base: z.string().describe('用于锚定调色板的十六进制颜色，例如 #2563eb'),\n  },\n  handler: async ({ base }): Promise\u003C{ structuredContent: PalettePayload }> => {\n    const swatches = await $fetch\u003C{ name: string, hex: string }[]>('\u002Fapi\u002Fpalette', {\n      query: { base },\n    })\n    return { structuredContent: { base, swatches } }\n  },\n})\n\nconst { data, loading, sendPrompt } = useMcpApp\u003CPalettePayload>()\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cmain class=\"picker\">\n    \u003Cp v-if=\"loading\">\n      正在混合颜色…\n    \u003C\u002Fp>\n    \u003Cul v-else-if=\"data\" class=\"swatches\">\n      \u003Cli v-for=\"s in data.swatches\" :key=\"s.hex\">\n        \u003Cbutton\n          type=\"button\"\n          :style=\"{ background: s.hex }\"\n          @click=\"sendPrompt(`将 ${s.name}（${s.hex}）用作主颜色。`)\"\n        >\n          {{ s.name }}\n        \u003C\u002Fbutton>\n      \u003C\u002Fli>\n    \u003C\u002Ful>\n  \u003C\u002Fmain>\n\u003C\u002Ftemplate>\n\n\u003Cstyle scoped>\n.picker { padding: 16px; font-family: system-ui, sans-serif; }\n.swatches { display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px; padding: 0; list-style: none; }\n.swatches button { width: 100%; aspect-ratio: 1; border-radius: 8px; border: 0; cursor: pointer; }\n\u003C\u002Fstyle>\n","app\u002Fmcp\u002Fcolor-picker.vue","vue","",[304,305,306,341,370,377,390,402,435,441,446,459,478,488,526,532,574,629,644,653,678,683,691,696,734,744,749,759,782,804,810,820,853,888,897,913,928,943,949,955,965,975,984,994,1003,1008,1021,1060,1131,1193],"code",{"__ignoreMap":302},[307,308,311,315,319,323,326,329,332,336,338],"span",{"class":309,"line":310},"line",1,[307,312,314],{"class":313},"sMK4o","\u003C",[307,316,318],{"class":317},"swJcz","script",[307,320,322],{"class":321},"spNyl"," setup",[307,324,325],{"class":321}," lang",[307,327,328],{"class":313},"=",[307,330,331],{"class":313},"\"",[307,333,335],{"class":334},"sfazB","ts",[307,337,331],{"class":313},[307,339,340],{"class":313},">\n",[307,342,344,348,351,355,358,361,364,367],{"class":309,"line":343},2,[307,345,347],{"class":346},"s7zQu","import",[307,349,350],{"class":313}," {",[307,352,354],{"class":353},"sTEyZ"," z",[307,356,357],{"class":313}," }",[307,359,360],{"class":346}," from",[307,362,363],{"class":313}," '",[307,365,366],{"class":334},"zod",[307,368,369],{"class":313},"'\n",[307,371,373],{"class":309,"line":372},3,[307,374,376],{"emptyLinePlaceholder":375},true,"\n",[307,378,380,383,387],{"class":309,"line":379},4,[307,381,382],{"class":321},"interface",[307,384,386],{"class":385},"sBMFI"," PalettePayload",[307,388,389],{"class":313}," {\n",[307,391,393,396,399],{"class":309,"line":392},5,[307,394,395],{"class":317},"  base",[307,397,398],{"class":313},":",[307,400,401],{"class":385}," string\n",[307,403,405,408,410,412,415,417,420,423,426,428,430,432],{"class":309,"line":404},6,[307,406,407],{"class":317},"  swatches",[307,409,398],{"class":313},[307,411,350],{"class":313},[307,413,414],{"class":317}," name",[307,416,398],{"class":313},[307,418,419],{"class":385}," string",[307,421,422],{"class":313},",",[307,424,425],{"class":317}," hex",[307,427,398],{"class":313},[307,429,419],{"class":385},[307,431,357],{"class":313},[307,433,434],{"class":353},"[]\n",[307,436,438],{"class":309,"line":437},7,[307,439,440],{"class":313},"}\n",[307,442,444],{"class":309,"line":443},8,[307,445,376],{"emptyLinePlaceholder":375},[307,447,449,453,456],{"class":309,"line":448},9,[307,450,452],{"class":451},"s2Zo4","defineMcpApp",[307,454,455],{"class":353},"(",[307,457,458],{"class":313},"{\n",[307,460,462,465,467,469,472,475],{"class":309,"line":461},10,[307,463,464],{"class":317},"  description",[307,466,398],{"class":313},[307,468,363],{"class":313},[307,470,471],{"class":334},"选择一种颜色并预览一个 5 色调色板。",[307,473,474],{"class":313},"'",[307,476,477],{"class":313},",\n",[307,479,481,484,486],{"class":309,"line":480},11,[307,482,483],{"class":317},"  inputSchema",[307,485,398],{"class":313},[307,487,389],{"class":313},[307,489,491,494,496,498,501,504,507,509,512,514,516,519,521,524],{"class":309,"line":490},12,[307,492,493],{"class":317},"    base",[307,495,398],{"class":313},[307,497,354],{"class":353},[307,499,500],{"class":313},".",[307,502,503],{"class":451},"string",[307,505,506],{"class":353},"()",[307,508,500],{"class":313},[307,510,511],{"class":451},"describe",[307,513,455],{"class":353},[307,515,474],{"class":313},[307,517,518],{"class":334},"用于锚定调色板的十六进制颜色，例如 #2563eb",[307,520,474],{"class":313},[307,522,523],{"class":353},")",[307,525,477],{"class":313},[307,527,529],{"class":309,"line":528},13,[307,530,531],{"class":313},"  },\n",[307,533,535,538,540,543,546,550,553,556,559,562,564,566,569,572],{"class":309,"line":534},14,[307,536,537],{"class":451},"  handler",[307,539,398],{"class":313},[307,541,542],{"class":321}," async",[307,544,545],{"class":313}," ({",[307,547,549],{"class":548},"sHdIc"," base",[307,551,552],{"class":313}," }):",[307,554,555],{"class":385}," Promise",[307,557,558],{"class":313},"\u003C{",[307,560,561],{"class":317}," structuredContent",[307,563,398],{"class":313},[307,565,386],{"class":385},[307,567,568],{"class":313}," }>",[307,570,571],{"class":321}," =>",[307,573,389],{"class":313},[307,575,577,580,583,586,589,592,594,596,598,600,602,604,606,608,610,613,616,618,620,623,625,627],{"class":309,"line":576},15,[307,578,579],{"class":321},"    const",[307,581,582],{"class":353}," swatches",[307,584,585],{"class":313}," =",[307,587,588],{"class":346}," await",[307,590,591],{"class":451}," $fetch",[307,593,558],{"class":313},[307,595,414],{"class":317},[307,597,398],{"class":313},[307,599,419],{"class":385},[307,601,422],{"class":313},[307,603,425],{"class":317},[307,605,398],{"class":313},[307,607,419],{"class":385},[307,609,357],{"class":313},[307,611,612],{"class":317},"[]",[307,614,615],{"class":313},">",[307,617,455],{"class":317},[307,619,474],{"class":313},[307,621,622],{"class":334},"\u002Fapi\u002Fpalette",[307,624,474],{"class":313},[307,626,422],{"class":313},[307,628,389],{"class":313},[307,630,632,635,637,639,641],{"class":309,"line":631},16,[307,633,634],{"class":317},"      query",[307,636,398],{"class":313},[307,638,350],{"class":313},[307,640,549],{"class":353},[307,642,643],{"class":313}," },\n",[307,645,647,650],{"class":309,"line":646},17,[307,648,649],{"class":313},"    }",[307,651,652],{"class":317},")\n",[307,654,656,659,661,663,665,667,669,671,673,675],{"class":309,"line":655},18,[307,657,658],{"class":346},"    return",[307,660,350],{"class":313},[307,662,561],{"class":317},[307,664,398],{"class":313},[307,666,350],{"class":313},[307,668,549],{"class":353},[307,670,422],{"class":313},[307,672,582],{"class":353},[307,674,357],{"class":313},[307,676,677],{"class":313}," }\n",[307,679,681],{"class":309,"line":680},19,[307,682,531],{"class":313},[307,684,686,689],{"class":309,"line":685},20,[307,687,688],{"class":313},"}",[307,690,652],{"class":353},[307,692,694],{"class":309,"line":693},21,[307,695,376],{"emptyLinePlaceholder":375},[307,697,699,702,704,707,709,712,714,717,719,721,724,726,729,731],{"class":309,"line":698},22,[307,700,701],{"class":321},"const",[307,703,350],{"class":313},[307,705,706],{"class":353}," data",[307,708,422],{"class":313},[307,710,711],{"class":353}," loading",[307,713,422],{"class":313},[307,715,716],{"class":353}," sendPrompt ",[307,718,688],{"class":313},[307,720,585],{"class":313},[307,722,723],{"class":451}," useMcpApp",[307,725,314],{"class":313},[307,727,728],{"class":385},"PalettePayload",[307,730,615],{"class":313},[307,732,733],{"class":353},"()\n",[307,735,737,740,742],{"class":309,"line":736},23,[307,738,739],{"class":313},"\u003C\u002F",[307,741,318],{"class":317},[307,743,340],{"class":313},[307,745,747],{"class":309,"line":746},24,[307,748,376],{"emptyLinePlaceholder":375},[307,750,752,754,757],{"class":309,"line":751},25,[307,753,314],{"class":313},[307,755,756],{"class":317},"template",[307,758,340],{"class":313},[307,760,762,765,768,771,773,775,778,780],{"class":309,"line":761},26,[307,763,764],{"class":313},"  \u003C",[307,766,767],{"class":317},"main",[307,769,770],{"class":321}," class",[307,772,328],{"class":313},[307,774,331],{"class":313},[307,776,777],{"class":334},"picker",[307,779,331],{"class":313},[307,781,340],{"class":313},[307,783,785,788,790,793,795,797,800,802],{"class":309,"line":784},27,[307,786,787],{"class":313},"    \u003C",[307,789,292],{"class":317},[307,791,792],{"class":321}," v-if",[307,794,328],{"class":313},[307,796,331],{"class":313},[307,798,799],{"class":334},"loading",[307,801,331],{"class":313},[307,803,340],{"class":313},[307,805,807],{"class":309,"line":806},28,[307,808,809],{"class":353},"      正在混合颜色…\n",[307,811,813,816,818],{"class":309,"line":812},29,[307,814,815],{"class":313},"    \u003C\u002F",[307,817,292],{"class":317},[307,819,340],{"class":313},[307,821,823,825,828,831,833,835,838,840,842,844,846,849,851],{"class":309,"line":822},30,[307,824,787],{"class":313},[307,826,827],{"class":317},"ul",[307,829,830],{"class":321}," v-else-if",[307,832,328],{"class":313},[307,834,331],{"class":313},[307,836,837],{"class":334},"data",[307,839,331],{"class":313},[307,841,770],{"class":321},[307,843,328],{"class":313},[307,845,331],{"class":313},[307,847,848],{"class":334},"swatches",[307,850,331],{"class":313},[307,852,340],{"class":313},[307,854,856,859,862,865,867,869,872,874,877,879,881,884,886],{"class":309,"line":855},31,[307,857,858],{"class":313},"      \u003C",[307,860,861],{"class":317},"li",[307,863,864],{"class":321}," v-for",[307,866,328],{"class":313},[307,868,331],{"class":313},[307,870,871],{"class":334},"s in data.swatches",[307,873,331],{"class":313},[307,875,876],{"class":321}," :key",[307,878,328],{"class":313},[307,880,331],{"class":313},[307,882,883],{"class":334},"s.hex",[307,885,331],{"class":313},[307,887,340],{"class":313},[307,889,891,894],{"class":309,"line":890},32,[307,892,893],{"class":313},"        \u003C",[307,895,896],{"class":317},"button\n",[307,898,900,903,905,907,910],{"class":309,"line":899},33,[307,901,902],{"class":321},"          type",[307,904,328],{"class":313},[307,906,331],{"class":313},[307,908,909],{"class":334},"button",[307,911,912],{"class":313},"\"\n",[307,914,916,919,921,923,926],{"class":309,"line":915},34,[307,917,918],{"class":321},"          :style",[307,920,328],{"class":313},[307,922,331],{"class":313},[307,924,925],{"class":334},"{ background: s.hex }",[307,927,912],{"class":313},[307,929,931,934,936,938,941],{"class":309,"line":930},35,[307,932,933],{"class":321},"          @click",[307,935,328],{"class":313},[307,937,331],{"class":313},[307,939,940],{"class":334},"sendPrompt(`将 ${s.name}（${s.hex}）用作主颜色。`)",[307,942,912],{"class":313},[307,944,946],{"class":309,"line":945},36,[307,947,948],{"class":313},"        >\n",[307,950,952],{"class":309,"line":951},37,[307,953,954],{"class":353},"          {{ s.name }}\n",[307,956,958,961,963],{"class":309,"line":957},38,[307,959,960],{"class":313},"        \u003C\u002F",[307,962,909],{"class":317},[307,964,340],{"class":313},[307,966,968,971,973],{"class":309,"line":967},39,[307,969,970],{"class":313},"      \u003C\u002F",[307,972,861],{"class":317},[307,974,340],{"class":313},[307,976,978,980,982],{"class":309,"line":977},40,[307,979,815],{"class":313},[307,981,827],{"class":317},[307,983,340],{"class":313},[307,985,987,990,992],{"class":309,"line":986},41,[307,988,989],{"class":313},"  \u003C\u002F",[307,991,767],{"class":317},[307,993,340],{"class":313},[307,995,997,999,1001],{"class":309,"line":996},42,[307,998,739],{"class":313},[307,1000,756],{"class":317},[307,1002,340],{"class":313},[307,1004,1006],{"class":309,"line":1005},43,[307,1007,376],{"emptyLinePlaceholder":375},[307,1009,1011,1013,1016,1019],{"class":309,"line":1010},44,[307,1012,314],{"class":313},[307,1014,1015],{"class":317},"style",[307,1017,1018],{"class":321}," scoped",[307,1020,340],{"class":313},[307,1022,1024,1026,1028,1030,1034,1036,1040,1043,1046,1048,1051,1053,1056,1058],{"class":309,"line":1023},45,[307,1025,500],{"class":313},[307,1027,777],{"class":385},[307,1029,350],{"class":313},[307,1031,1033],{"class":1032},"sqsOY"," padding",[307,1035,398],{"class":313},[307,1037,1039],{"class":1038},"sbssI"," 16px",[307,1041,1042],{"class":313},";",[307,1044,1045],{"class":1032}," font-family",[307,1047,398],{"class":313},[307,1049,1050],{"class":353}," system-ui",[307,1052,422],{"class":313},[307,1054,1055],{"class":353}," sans-serif",[307,1057,1042],{"class":313},[307,1059,677],{"class":313},[307,1061,1063,1065,1067,1069,1072,1074,1077,1079,1082,1084,1087,1089,1092,1094,1097,1100,1103,1105,1108,1110,1112,1114,1117,1119,1122,1124,1127,1129],{"class":309,"line":1062},46,[307,1064,500],{"class":313},[307,1066,848],{"class":385},[307,1068,350],{"class":313},[307,1070,1071],{"class":1032}," display",[307,1073,398],{"class":313},[307,1075,1076],{"class":353}," grid",[307,1078,1042],{"class":313},[307,1080,1081],{"class":1032}," grid-template-columns",[307,1083,398],{"class":313},[307,1085,1086],{"class":451}," repeat",[307,1088,455],{"class":313},[307,1090,1091],{"class":1038},"5",[307,1093,422],{"class":313},[307,1095,1096],{"class":1038}," 1fr",[307,1098,1099],{"class":313},");",[307,1101,1102],{"class":1032}," gap",[307,1104,398],{"class":313},[307,1106,1107],{"class":1038}," 8px",[307,1109,1042],{"class":313},[307,1111,1033],{"class":1032},[307,1113,398],{"class":313},[307,1115,1116],{"class":1038}," 0",[307,1118,1042],{"class":313},[307,1120,1121],{"class":1032}," list-style",[307,1123,398],{"class":313},[307,1125,1126],{"class":353}," none",[307,1128,1042],{"class":313},[307,1130,677],{"class":313},[307,1132,1134,1136,1138,1141,1143,1146,1148,1151,1153,1156,1158,1161,1163,1166,1168,1170,1172,1175,1177,1179,1181,1184,1186,1189,1191],{"class":309,"line":1133},47,[307,1135,500],{"class":313},[307,1137,848],{"class":385},[307,1139,1140],{"class":385}," button",[307,1142,350],{"class":313},[307,1144,1145],{"class":1032}," width",[307,1147,398],{"class":313},[307,1149,1150],{"class":1038}," 100%",[307,1152,1042],{"class":313},[307,1154,1155],{"class":1032}," aspect-ratio",[307,1157,398],{"class":313},[307,1159,1160],{"class":1038}," 1",[307,1162,1042],{"class":313},[307,1164,1165],{"class":1032}," border-radius",[307,1167,398],{"class":313},[307,1169,1107],{"class":1038},[307,1171,1042],{"class":313},[307,1173,1174],{"class":1032}," border",[307,1176,398],{"class":313},[307,1178,1116],{"class":1038},[307,1180,1042],{"class":313},[307,1182,1183],{"class":1032}," cursor",[307,1185,398],{"class":313},[307,1187,1188],{"class":353}," pointer",[307,1190,1042],{"class":313},[307,1192,677],{"class":313},[307,1194,1196,1198,1200],{"class":309,"line":1195},48,[307,1197,739],{"class":313},[307,1199,1015],{"class":317},[307,1201,340],{"class":313},[292,1203,1204],{},"就是这样。该工具包会：",[1206,1207,1208,1223,1237,1250],"ol",{},[861,1209,1210,1211,1213,1214,1218,1219,1222],{},"检测 ",[304,1212,452],{}," 并根据文件名",[1215,1216,1217],"strong",{},"注册一个 MCP 工具","，命名为 ",[304,1220,1221],{},"color-picker","。",[861,1224,1225,1226,1229,1230,1233,1234,1222],{},"生成一个 ",[1215,1227,1228],{},"UI 资源"," ",[304,1231,1232],{},"ui:\u002F\u002Fmcp-app\u002Fcolor-picker","，暴露 ",[304,1235,1236],{},"text\u002Fhtml;profile=mcp-app",[861,1238,1239,1240,1249],{},"使用 ",[1241,1242,1246],"a",{"href":1243,"rel":1244},"https:\u002F\u002Fgithub.com\u002Frichardtallent\u002Fvite-plugin-singlefile",[1245],"nofollow",[304,1247,1248],{},"vite-plugin-singlefile"," 将 SFC + 资源打包为一个 HTML 文件。",[861,1251,1252,1253,1256,1257,1260],{},"将处理器返回的 ",[304,1254,1255],{},"structuredContent"," 注入 iframe，从而使 UI ",[1215,1258,1259],{},"无需第二次往返请求","即可完成水合。",[288,1262,1263],{"id":1263},"文件约定",[292,1265,1266,1267,1272,1273,1276,1277,1280,1281,1284,1285,1288],{},"MCP Apps 默认位于 ",[1215,1268,1269],{},[304,1270,1271],{},"app\u002Fmcp\u002F","（而不是 ",[304,1274,1275],{},"server\u002Fmcp\u002F","）。你可以在 ",[304,1278,1279],{},"nuxt.config.ts"," 中通过 ",[304,1282,1283],{},"mcp.appsDir"," 更改应用侧目录。它们位于 Nuxt 的客户端侧，因为它们要编写 Vue 组件——但你声明的 ",[304,1286,1287],{},"handler"," 会像工具一样在服务端运行。",[296,1290,1294],{"className":1291,"code":1292,"language":1293,"meta":302,"style":302},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","app\u002F\n└── mcp\u002F\n    ├── color-picker.vue    # → 工具：color-picker，资源：ui:\u002F\u002Fmcp-app\u002Fcolor-picker\n    └── admin\u002F\n        └── audit-log.vue   # → 工具：audit-log\n","bash",[304,1295,1296,1301,1309,1321,1329],{"__ignoreMap":302},[307,1297,1298],{"class":309,"line":310},[307,1299,1300],{"class":385},"app\u002F\n",[307,1302,1303,1306],{"class":309,"line":343},[307,1304,1305],{"class":385},"└──",[307,1307,1308],{"class":334}," mcp\u002F\n",[307,1310,1311,1314,1317],{"class":309,"line":372},[307,1312,1313],{"class":385},"    ├──",[307,1315,1316],{"class":334}," color-picker.vue",[307,1318,1320],{"class":1319},"sHwdD","    # → 工具：color-picker，资源：ui:\u002F\u002Fmcp-app\u002Fcolor-picker\n",[307,1322,1323,1326],{"class":309,"line":379},[307,1324,1325],{"class":385},"    └──",[307,1327,1328],{"class":334}," admin\u002F\n",[307,1330,1331,1334,1337],{"class":309,"line":392},[307,1332,1333],{"class":385},"        └──",[307,1335,1336],{"class":334}," audit-log.vue",[307,1338,1339],{"class":1319},"   # → 工具：audit-log\n",[1341,1342,1345,1346,1349,1350,1353,1354,1357],"callout",{"color":1343,"icon":1344},"info","i-lucide-info","将辅助函数与 SFC 放在一起（例如 ",[304,1347,1348],{},"format.ts","）——打包器会将它们内联。把数据生成逻辑保留在 ",[304,1351,1352],{},"server\u002Fapi\u002F"," 中，并在处理器里通过 ",[304,1355,1356],{},"$fetch"," 调用它。",[1359,1360,1361],"h3",{"id":1361},"自动生成的名称与标题",[292,1363,1364,1365,1368,1369,1372],{},"和工具与资源一样，",[304,1366,1367],{},"name"," 和 ",[304,1370,1371],{},"title"," 会从文件名推断出来：",[1374,1375,1376,1392],"table",{},[1377,1378,1379],"thead",{},[1380,1381,1382,1386,1389],"tr",{},[1383,1384,1385],"th",{},"文件",[1383,1387,1388],{},"名称",[1383,1390,1391],{},"标题",[1393,1394,1395,1412,1429],"tbody",{},[1380,1396,1397,1403,1407],{},[1398,1399,1400],"td",{},[304,1401,1402],{},"color-picker.vue",[1398,1404,1405],{},[304,1406,1221],{},[1398,1408,1409],{},[304,1410,1411],{},"Color Picker",[1380,1413,1414,1419,1424],{},[1398,1415,1416],{},[304,1417,1418],{},"weather-card.vue",[1398,1420,1421],{},[304,1422,1423],{},"weather-card",[1398,1425,1426],{},[304,1427,1428],{},"Weather Card",[1380,1430,1431,1436,1441],{},[1398,1432,1433],{},[304,1434,1435],{},"admin\u002Faudit-log.vue",[1398,1437,1438],{},[304,1439,1440],{},"audit-log",[1398,1442,1443],{},[304,1444,1445],{},"Audit Log",[292,1447,1448,1449,1451,1452,1454,1455,1457],{},"你也可以通过向 ",[304,1450,452],{}," 传入 ",[304,1453,1367],{}," \u002F ",[304,1456,1371],{}," 来覆盖它们。",[1359,1459,1460],{"id":1460},"将应用路由到特定处理器",[292,1462,1463,1464,1467,1468,1471],{},"默认情况下，每个应用都会附加到隐式的 ",[304,1465,1466],{},"apps"," 处理器，并且只会在 ",[304,1469,1470],{},"\u002Fmcp\u002Fapps"," 上展示。将应用路由到其他命名处理器有两种方式：",[292,1473,1474,1477,1478,1480],{},[1215,1475,1476],{},"1. 子文件夹约定"," —— ",[304,1479,1271],{}," 下的第一级子目录会成为处理器归属：",[296,1482,1484],{"className":1291,"code":1483,"language":1293,"meta":302,"style":302},"app\u002F\n└── mcp\u002F\n    ├── color-picker.vue          # → \u002Fmcp\u002Fapps（默认）\n    ├── finder\u002F\n    │   └── stay-finder.vue       # → \u002Fmcp\u002Ffinder\n    └── checkout\u002F\n        └── stay-checkout.vue     # → \u002Fmcp\u002Fcheckout\n",[304,1485,1486,1490,1496,1505,1512,1526,1533],{"__ignoreMap":302},[307,1487,1488],{"class":309,"line":310},[307,1489,1300],{"class":385},[307,1491,1492,1494],{"class":309,"line":343},[307,1493,1305],{"class":385},[307,1495,1308],{"class":334},[307,1497,1498,1500,1502],{"class":309,"line":372},[307,1499,1313],{"class":385},[307,1501,1316],{"class":334},[307,1503,1504],{"class":1319},"          # → \u002Fmcp\u002Fapps（默认）\n",[307,1506,1507,1509],{"class":309,"line":379},[307,1508,1313],{"class":385},[307,1510,1511],{"class":334}," finder\u002F\n",[307,1513,1514,1517,1520,1523],{"class":309,"line":392},[307,1515,1516],{"class":385},"    │",[307,1518,1519],{"class":334},"   └──",[307,1521,1522],{"class":334}," stay-finder.vue",[307,1524,1525],{"class":1319},"       # → \u002Fmcp\u002Ffinder\n",[307,1527,1528,1530],{"class":309,"line":404},[307,1529,1325],{"class":385},[307,1531,1532],{"class":334}," checkout\u002F\n",[307,1534,1535,1537,1540],{"class":309,"line":437},[307,1536,1333],{"class":385},[307,1538,1539],{"class":334}," stay-checkout.vue",[307,1541,1542],{"class":1319},"     # → \u002Fmcp\u002Fcheckout\n",[292,1544,1545,1546,1549],{},"将每个处理器文件夹与 ",[304,1547,1548],{},"server\u002Fmcp\u002Fhandlers\u002F\u003Cname>\u002Findex.ts"," 配对：",[296,1551,1555],{"className":1552,"code":1553,"filename":1554,"language":335,"meta":302,"style":302},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineMcpHandler } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpHandler({})\n","server\u002Fmcp\u002Fhandlers\u002Ffinder\u002Findex.ts",[304,1556,1557,1577,1581],{"__ignoreMap":302},[307,1558,1559,1561,1563,1566,1568,1570,1572,1575],{"class":309,"line":310},[307,1560,347],{"class":346},[307,1562,350],{"class":313},[307,1564,1565],{"class":353}," defineMcpHandler",[307,1567,357],{"class":313},[307,1569,360],{"class":346},[307,1571,363],{"class":313},[307,1573,1574],{"class":334},"@nuxtjs\u002Fmcp-toolkit\u002Fserver",[307,1576,369],{"class":313},[307,1578,1579],{"class":309,"line":343},[307,1580,376],{"emptyLinePlaceholder":375},[307,1582,1583,1586,1589,1591,1593,1596],{"class":309,"line":372},[307,1584,1585],{"class":346},"export",[307,1587,1588],{"class":346}," default",[307,1590,1565],{"class":451},[307,1592,455],{"class":353},[307,1594,1595],{"class":313},"{}",[307,1597,652],{"class":353},[292,1599,1600,1607],{},[1215,1601,1602,1603,1606],{},"2. 显式 ",[304,1604,1605],{},"attachTo"," 覆盖"," —— 如果两者都存在，则会覆盖子文件夹默认值：",[296,1609,1612],{"className":298,"code":1610,"filename":1611,"language":301,"meta":302,"style":302},"\u003Cscript setup lang=\"ts\">\ndefineMcpApp({\n  attachTo: 'finder',\n  group: 'stays',\n  tags: ['searchable'],\n  \u002F\u002F ...\n})\n\u003C\u002Fscript>\n","app\u002Fmcp\u002Fstay-finder.vue",[304,1613,1614,1634,1642,1658,1674,1696,1701,1707],{"__ignoreMap":302},[307,1615,1616,1618,1620,1622,1624,1626,1628,1630,1632],{"class":309,"line":310},[307,1617,314],{"class":313},[307,1619,318],{"class":317},[307,1621,322],{"class":321},[307,1623,325],{"class":321},[307,1625,328],{"class":313},[307,1627,331],{"class":313},[307,1629,335],{"class":334},[307,1631,331],{"class":313},[307,1633,340],{"class":313},[307,1635,1636,1638,1640],{"class":309,"line":343},[307,1637,452],{"class":451},[307,1639,455],{"class":353},[307,1641,458],{"class":313},[307,1643,1644,1647,1649,1651,1654,1656],{"class":309,"line":372},[307,1645,1646],{"class":317},"  attachTo",[307,1648,398],{"class":313},[307,1650,363],{"class":313},[307,1652,1653],{"class":334},"finder",[307,1655,474],{"class":313},[307,1657,477],{"class":313},[307,1659,1660,1663,1665,1667,1670,1672],{"class":309,"line":379},[307,1661,1662],{"class":317},"  group",[307,1664,398],{"class":313},[307,1666,363],{"class":313},[307,1668,1669],{"class":334},"stays",[307,1671,474],{"class":313},[307,1673,477],{"class":313},[307,1675,1676,1679,1681,1684,1686,1689,1691,1694],{"class":309,"line":392},[307,1677,1678],{"class":317},"  tags",[307,1680,398],{"class":313},[307,1682,1683],{"class":353}," [",[307,1685,474],{"class":313},[307,1687,1688],{"class":334},"searchable",[307,1690,474],{"class":313},[307,1692,1693],{"class":353},"]",[307,1695,477],{"class":313},[307,1697,1698],{"class":309,"line":404},[307,1699,1700],{"class":1319},"  \u002F\u002F ...\n",[307,1702,1703,1705],{"class":309,"line":437},[307,1704,688],{"class":313},[307,1706,652],{"class":353},[307,1708,1709,1711,1713],{"class":309,"line":443},[307,1710,739],{"class":313},[307,1712,318],{"class":317},[307,1714,340],{"class":313},[292,1716,1717,1718,1721,1722,1725,1726,1729,1730,1733,1734,1737],{},"生成的工具和资源会携带 ",[304,1719,1720],{},"_meta.handler = 'finder'","、顶层 ",[304,1723,1724],{},"group = 'stays'","，以及 ",[304,1727,1728],{},"tags = ['searchable']","。你可以使用 ",[304,1731,1732],{},"getMcpTools({ handler: 'finder' })","、",[304,1735,1736],{},"getMcpTools({ tags: ['searchable'] })"," 等对它们进行过滤。",[288,1739,1741],{"id":1740},"definemcpapp",[304,1742,452],{},[292,1744,1745,1746,1749,1750,1753],{},"一个宏——类似 ",[304,1747,1748],{},"definePageMeta","——会在构建时提取，并且",[1215,1751,1752],{},"从浏览器打包产物中移除","。它接受的字段如下：",[296,1755,1757],{"className":1552,"code":1756,"language":335,"meta":302,"style":302},"defineMcpApp({\n  name?: string                          \u002F\u002F 覆盖自动推断的名称\n  title?: string                         \u002F\u002F 覆盖自动推断的标题\n  description?: string                   \u002F\u002F 显示给 LLM，以帮助它选择这个应用\n  inputSchema?: ZodRawShape              \u002F\u002F 在服务器上验证工具输入\n  handler?: (args, extra) => Result      \u002F\u002F 在服务端运行；默认是 (args) => ({ structuredContent: args })\n  csp?: McpAppCsp | false                \u002F\u002F 收紧或禁用 iframe CSP\n  attachTo?: string                      \u002F\u002F 该应用路由到的命名 MCP 处理器（默认：'apps' 或子文件夹）\n  group?: string                         \u002F\u002F 顶层分组标签（默认：与 attachTo 相同）\n  tags?: string[]                        \u002F\u002F 转发到生成工具的顶层标签\n  _meta?: Record\u003Cstring, unknown>        \u002F\u002F 额外的 _meta 字段，向宿主暴露\n})\n",[304,1758,1759,1767,1780,1794,1806,1818,1845,1865,1877,1888,1900,1922],{"__ignoreMap":302},[307,1760,1761,1763,1765],{"class":309,"line":310},[307,1762,452],{"class":451},[307,1764,455],{"class":353},[307,1766,458],{"class":313},[307,1768,1769,1772,1774,1777],{"class":309,"line":343},[307,1770,1771],{"class":353},"  name?",[307,1773,398],{"class":313},[307,1775,1776],{"class":353}," string                          ",[307,1778,1779],{"class":1319},"\u002F\u002F 覆盖自动推断的名称\n",[307,1781,1782,1785,1788,1791],{"class":309,"line":372},[307,1783,1784],{"class":353},"  title",[307,1786,1787],{"class":313},"?:",[307,1789,1790],{"class":353}," string                         ",[307,1792,1793],{"class":1319},"\u002F\u002F 覆盖自动推断的标题\n",[307,1795,1796,1798,1800,1803],{"class":309,"line":379},[307,1797,464],{"class":353},[307,1799,1787],{"class":313},[307,1801,1802],{"class":353}," string                   ",[307,1804,1805],{"class":1319},"\u002F\u002F 显示给 LLM，以帮助它选择这个应用\n",[307,1807,1808,1810,1812,1815],{"class":309,"line":392},[307,1809,483],{"class":353},[307,1811,1787],{"class":313},[307,1813,1814],{"class":353}," ZodRawShape              ",[307,1816,1817],{"class":1319},"\u002F\u002F 在服务器上验证工具输入\n",[307,1819,1820,1822,1824,1827,1830,1832,1835,1837,1839,1842],{"class":309,"line":404},[307,1821,537],{"class":353},[307,1823,1787],{"class":313},[307,1825,1826],{"class":313}," (",[307,1828,1829],{"class":548},"args",[307,1831,422],{"class":313},[307,1833,1834],{"class":548}," extra",[307,1836,523],{"class":313},[307,1838,571],{"class":321},[307,1840,1841],{"class":353}," Result      ",[307,1843,1844],{"class":1319},"\u002F\u002F 在服务端运行；默认是 (args) => ({ structuredContent: args })\n",[307,1846,1847,1850,1852,1855,1858,1862],{"class":309,"line":437},[307,1848,1849],{"class":353},"  csp",[307,1851,1787],{"class":313},[307,1853,1854],{"class":353}," McpAppCsp ",[307,1856,1857],{"class":313},"|",[307,1859,1861],{"class":1860},"sfNiH"," false",[307,1863,1864],{"class":1319},"                \u002F\u002F 收紧或禁用 iframe CSP\n",[307,1866,1867,1869,1871,1874],{"class":309,"line":443},[307,1868,1646],{"class":353},[307,1870,1787],{"class":313},[307,1872,1873],{"class":353}," string                      ",[307,1875,1876],{"class":1319},"\u002F\u002F 该应用路由到的命名 MCP 处理器（默认：'apps' 或子文件夹）\n",[307,1878,1879,1881,1883,1885],{"class":309,"line":448},[307,1880,1662],{"class":353},[307,1882,1787],{"class":313},[307,1884,1790],{"class":353},[307,1886,1887],{"class":1319},"\u002F\u002F 顶层分组标签（默认：与 attachTo 相同）\n",[307,1889,1890,1892,1894,1897],{"class":309,"line":461},[307,1891,1678],{"class":353},[307,1893,1787],{"class":313},[307,1895,1896],{"class":353}," string[]                        ",[307,1898,1899],{"class":1319},"\u002F\u002F 转发到生成工具的顶层标签\n",[307,1901,1902,1905,1907,1910,1912,1914,1916,1919],{"class":309,"line":480},[307,1903,1904],{"class":353},"  _meta",[307,1906,1787],{"class":313},[307,1908,1909],{"class":353}," Record",[307,1911,314],{"class":313},[307,1913,503],{"class":353},[307,1915,422],{"class":313},[307,1917,1918],{"class":353}," unknown>        ",[307,1920,1921],{"class":1319},"\u002F\u002F 额外的 _meta 字段，向宿主暴露\n",[307,1923,1924,1926],{"class":309,"line":490},[307,1925,688],{"class":313},[307,1927,652],{"class":353},[1341,1929,1930,1733,1932,1368,1935,1938,1939,1942,1943,1733,1946,1949,1950,1953],{"color":1343,"icon":1344},[304,1931,1605],{},[304,1933,1934],{},"group",[304,1936,1937],{},"tags"," 必须是",[1215,1940,1941],{},"字面量","（",[304,1944,1945],{},"'finder'",[304,1947,1948],{},"['a', 'b']","）——工具包会在构建时静态读取它们，以便路由生成的工具和资源。动态表达式（",[304,1951,1952],{},"attachTo: someVar","）会以清晰的错误使构建失败。",[1359,1955,1956],{"id":1956},"服务器处理器",[292,1958,1959,1961,1962,1222,1964,1967,1968,1970],{},[304,1960,1287],{}," 运行在你的 Nitro 服务器中，而不是在 iframe 里。它接收已验证的输入，并返回 UI 用于水合的 ",[304,1963,1255],{},[1215,1965,1966],{},"把它当作一个工具处理器来使用","——调用 API、查询数据库、使用 ",[304,1969,1356],{},"：",[296,1972,1974],{"className":1552,"code":1973,"language":335,"meta":302,"style":302},"defineMcpApp({\n  description: '选择一种颜色并预览一个 5 色调色板。',\n  inputSchema: {\n    base: z.string().describe('用于锚定调色板的十六进制颜色，例如 #2563eb'),\n  },\n  handler: async ({ base }) => {\n    const swatches = await $fetch('\u002Fapi\u002Fpalette', { query: { base } })\n    return { structuredContent: { base, swatches } }\n  },\n})\n",[304,1975,1976,1984,1998,2006,2036,2040,2059,2098,2120,2124],{"__ignoreMap":302},[307,1977,1978,1980,1982],{"class":309,"line":310},[307,1979,452],{"class":451},[307,1981,455],{"class":353},[307,1983,458],{"class":313},[307,1985,1986,1988,1990,1992,1994,1996],{"class":309,"line":343},[307,1987,464],{"class":317},[307,1989,398],{"class":313},[307,1991,363],{"class":313},[307,1993,471],{"class":334},[307,1995,474],{"class":313},[307,1997,477],{"class":313},[307,1999,2000,2002,2004],{"class":309,"line":372},[307,2001,483],{"class":317},[307,2003,398],{"class":313},[307,2005,389],{"class":313},[307,2007,2008,2010,2012,2014,2016,2018,2020,2022,2024,2026,2028,2030,2032,2034],{"class":309,"line":379},[307,2009,493],{"class":317},[307,2011,398],{"class":313},[307,2013,354],{"class":353},[307,2015,500],{"class":313},[307,2017,503],{"class":451},[307,2019,506],{"class":353},[307,2021,500],{"class":313},[307,2023,511],{"class":451},[307,2025,455],{"class":353},[307,2027,474],{"class":313},[307,2029,518],{"class":334},[307,2031,474],{"class":313},[307,2033,523],{"class":353},[307,2035,477],{"class":313},[307,2037,2038],{"class":309,"line":392},[307,2039,531],{"class":313},[307,2041,2042,2044,2046,2048,2050,2052,2055,2057],{"class":309,"line":404},[307,2043,537],{"class":451},[307,2045,398],{"class":313},[307,2047,542],{"class":321},[307,2049,545],{"class":313},[307,2051,549],{"class":548},[307,2053,2054],{"class":313}," })",[307,2056,571],{"class":321},[307,2058,389],{"class":313},[307,2060,2061,2063,2065,2067,2069,2071,2073,2075,2077,2079,2081,2083,2086,2088,2090,2092,2094,2096],{"class":309,"line":437},[307,2062,579],{"class":321},[307,2064,582],{"class":353},[307,2066,585],{"class":313},[307,2068,588],{"class":346},[307,2070,591],{"class":451},[307,2072,455],{"class":317},[307,2074,474],{"class":313},[307,2076,622],{"class":334},[307,2078,474],{"class":313},[307,2080,422],{"class":313},[307,2082,350],{"class":313},[307,2084,2085],{"class":317}," query",[307,2087,398],{"class":313},[307,2089,350],{"class":313},[307,2091,549],{"class":353},[307,2093,357],{"class":313},[307,2095,357],{"class":313},[307,2097,652],{"class":317},[307,2099,2100,2102,2104,2106,2108,2110,2112,2114,2116,2118],{"class":309,"line":443},[307,2101,658],{"class":346},[307,2103,350],{"class":313},[307,2105,561],{"class":317},[307,2107,398],{"class":313},[307,2109,350],{"class":313},[307,2111,549],{"class":353},[307,2113,422],{"class":313},[307,2115,582],{"class":353},[307,2117,357],{"class":313},[307,2119,677],{"class":313},[307,2121,2122],{"class":309,"line":448},[307,2123,531],{"class":313},[307,2125,2126,2128],{"class":309,"line":461},[307,2127,688],{"class":313},[307,2129,652],{"class":353},[1341,2131,2134,2135,2137,2138,2141,2142,2145],{"color":2132,"icon":2133},"primary","i-lucide-zap","从处理器返回 ",[304,2136,1255],{}," 会将数据",[1215,2139,2140],{},"以内联方式写入 HTML","，形式为 ",[304,2143,2144],{},"\u003Cscript type=\"application\u002Fjson\">","。iframe 启动时已经拥有完整数据——无需额外 fetch，也不会闪烁。",[292,2147,2148,2149,2151,2152,2155],{},"如果你省略 ",[304,2150,1287],{},"，工具包会默认使用 ",[304,2153,2154],{},"(args) => ({ structuredContent: args })","。这适用于只需要回显输入的无状态应用。",[1359,2157,2159],{"id":2158},"在服务器与-ui-之间共享类型","在服务器与 UI 之间共享类型",[292,2161,2162,2163,2166,2167,2170,2171,2173],{},"将共享类型放在 Nuxt 的 ",[304,2164,2165],{},"shared\u002Ftypes\u002F"," 目录中——它们会在 SFC 和 API 端点中",[1215,2168,2169],{},"自动全局导入","，无需 ",[304,2172,347],{}," 语句：",[296,2175,2178],{"className":1552,"code":2176,"filename":2177,"language":335,"meta":302,"style":302},"export interface Swatch { name: string, hex: string }\nexport interface PalettePayload { base: string, swatches: Swatch[] }\n","shared\u002Ftypes\u002Fpalette.ts",[304,2179,2180,2208],{"__ignoreMap":302},[307,2181,2182,2184,2187,2190,2192,2194,2196,2198,2200,2202,2204,2206],{"class":309,"line":310},[307,2183,1585],{"class":346},[307,2185,2186],{"class":321}," interface",[307,2188,2189],{"class":385}," Swatch",[307,2191,350],{"class":313},[307,2193,414],{"class":317},[307,2195,398],{"class":313},[307,2197,419],{"class":385},[307,2199,422],{"class":313},[307,2201,425],{"class":317},[307,2203,398],{"class":313},[307,2205,419],{"class":385},[307,2207,677],{"class":313},[307,2209,2210,2212,2214,2216,2218,2220,2222,2224,2226,2228,2230,2232,2235],{"class":309,"line":343},[307,2211,1585],{"class":346},[307,2213,2186],{"class":321},[307,2215,386],{"class":385},[307,2217,350],{"class":313},[307,2219,549],{"class":317},[307,2221,398],{"class":313},[307,2223,419],{"class":385},[307,2225,422],{"class":313},[307,2227,582],{"class":317},[307,2229,398],{"class":313},[307,2231,2189],{"class":385},[307,2233,2234],{"class":353},"[] ",[307,2236,440],{"class":313},[296,2238,2241],{"className":1552,"code":2239,"filename":2240,"language":335,"meta":302,"style":302},"export default defineEventHandler(async (event): Promise\u003CPalettePayload> => {\n  const { base } = getQuery(event)\n  return { base: String(base), swatches: buildPalette(String(base)) }\n})\n","server\u002Fapi\u002Fpalette.get.ts",[304,2242,2243,2277,2299,2343],{"__ignoreMap":302},[307,2244,2245,2247,2249,2252,2254,2257,2259,2262,2265,2267,2269,2271,2273,2275],{"class":309,"line":310},[307,2246,1585],{"class":346},[307,2248,1588],{"class":346},[307,2250,2251],{"class":451}," defineEventHandler",[307,2253,455],{"class":353},[307,2255,2256],{"class":321},"async",[307,2258,1826],{"class":313},[307,2260,2261],{"class":548},"event",[307,2263,2264],{"class":313},"):",[307,2266,555],{"class":385},[307,2268,314],{"class":313},[307,2270,728],{"class":385},[307,2272,615],{"class":313},[307,2274,571],{"class":321},[307,2276,389],{"class":313},[307,2278,2279,2282,2284,2286,2288,2290,2293,2295,2297],{"class":309,"line":343},[307,2280,2281],{"class":321},"  const",[307,2283,350],{"class":313},[307,2285,549],{"class":353},[307,2287,357],{"class":313},[307,2289,585],{"class":313},[307,2291,2292],{"class":451}," getQuery",[307,2294,455],{"class":317},[307,2296,2261],{"class":353},[307,2298,652],{"class":317},[307,2300,2301,2304,2306,2308,2310,2313,2315,2318,2320,2322,2324,2326,2329,2331,2334,2336,2338,2341],{"class":309,"line":372},[307,2302,2303],{"class":346},"  return",[307,2305,350],{"class":313},[307,2307,549],{"class":317},[307,2309,398],{"class":313},[307,2311,2312],{"class":451}," String",[307,2314,455],{"class":317},[307,2316,2317],{"class":353},"base",[307,2319,523],{"class":317},[307,2321,422],{"class":313},[307,2323,582],{"class":317},[307,2325,398],{"class":313},[307,2327,2328],{"class":451}," buildPalette",[307,2330,455],{"class":317},[307,2332,2333],{"class":451},"String",[307,2335,455],{"class":317},[307,2337,2317],{"class":353},[307,2339,2340],{"class":317},")) ",[307,2342,440],{"class":313},[307,2344,2345,2347],{"class":309,"line":379},[307,2346,688],{"class":313},[307,2348,652],{"class":353},[296,2350,2352],{"className":298,"code":2351,"filename":300,"language":301,"meta":302,"style":302},"\u003Cscript setup lang=\"ts\">\ndefineMcpApp({\n  inputSchema: { base: z.string() },\n  handler: async ({ base }): Promise\u003C{ structuredContent: PalettePayload }> => ({\n    structuredContent: await $fetch('\u002Fapi\u002Fpalette', { query: { base } }),\n  }),\n})\n\nconst { data } = useMcpApp\u003CPalettePayload>()\n\u003C\u002Fscript>\n",[304,2353,2354,2374,2382,2406,2438,2478,2487,2493,2497,2520],{"__ignoreMap":302},[307,2355,2356,2358,2360,2362,2364,2366,2368,2370,2372],{"class":309,"line":310},[307,2357,314],{"class":313},[307,2359,318],{"class":317},[307,2361,322],{"class":321},[307,2363,325],{"class":321},[307,2365,328],{"class":313},[307,2367,331],{"class":313},[307,2369,335],{"class":334},[307,2371,331],{"class":313},[307,2373,340],{"class":313},[307,2375,2376,2378,2380],{"class":309,"line":343},[307,2377,452],{"class":451},[307,2379,455],{"class":353},[307,2381,458],{"class":313},[307,2383,2384,2386,2388,2390,2392,2394,2396,2398,2400,2403],{"class":309,"line":372},[307,2385,483],{"class":317},[307,2387,398],{"class":313},[307,2389,350],{"class":313},[307,2391,549],{"class":317},[307,2393,398],{"class":313},[307,2395,354],{"class":353},[307,2397,500],{"class":313},[307,2399,503],{"class":451},[307,2401,2402],{"class":353},"() ",[307,2404,2405],{"class":313},"},\n",[307,2407,2408,2410,2412,2414,2416,2418,2420,2422,2424,2426,2428,2430,2432,2434,2436],{"class":309,"line":379},[307,2409,537],{"class":451},[307,2411,398],{"class":313},[307,2413,542],{"class":321},[307,2415,545],{"class":313},[307,2417,549],{"class":548},[307,2419,552],{"class":313},[307,2421,555],{"class":385},[307,2423,558],{"class":313},[307,2425,561],{"class":317},[307,2427,398],{"class":313},[307,2429,386],{"class":385},[307,2431,568],{"class":313},[307,2433,571],{"class":321},[307,2435,1826],{"class":353},[307,2437,458],{"class":313},[307,2439,2440,2443,2445,2447,2449,2451,2453,2455,2457,2459,2461,2463,2465,2467,2470,2472,2474,2476],{"class":309,"line":392},[307,2441,2442],{"class":317},"    structuredContent",[307,2444,398],{"class":313},[307,2446,588],{"class":346},[307,2448,591],{"class":451},[307,2450,455],{"class":353},[307,2452,474],{"class":313},[307,2454,622],{"class":334},[307,2456,474],{"class":313},[307,2458,422],{"class":313},[307,2460,350],{"class":313},[307,2462,2085],{"class":317},[307,2464,398],{"class":313},[307,2466,350],{"class":313},[307,2468,2469],{"class":353}," base ",[307,2471,688],{"class":313},[307,2473,357],{"class":313},[307,2475,523],{"class":353},[307,2477,477],{"class":313},[307,2479,2480,2483,2485],{"class":309,"line":404},[307,2481,2482],{"class":313},"  }",[307,2484,523],{"class":353},[307,2486,477],{"class":313},[307,2488,2489,2491],{"class":309,"line":437},[307,2490,688],{"class":313},[307,2492,652],{"class":353},[307,2494,2495],{"class":309,"line":443},[307,2496,376],{"emptyLinePlaceholder":375},[307,2498,2499,2501,2503,2506,2508,2510,2512,2514,2516,2518],{"class":309,"line":448},[307,2500,701],{"class":321},[307,2502,350],{"class":313},[307,2504,2505],{"class":353}," data ",[307,2507,688],{"class":313},[307,2509,585],{"class":313},[307,2511,723],{"class":451},[307,2513,314],{"class":313},[307,2515,728],{"class":385},[307,2517,615],{"class":313},[307,2519,733],{"class":353},[307,2521,2522,2524,2526],{"class":309,"line":461},[307,2523,739],{"class":313},[307,2525,318],{"class":317},[307,2527,340],{"class":313},[292,2529,2530],{},"仅类型引用会被 esbuild 从浏览器打包产物中移除——运行时无需在 iframe 内解析任何内容。",[1015,2532,2533],{},"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}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sqsOY, html code.shiki .sqsOY{--shiki-light:#8796B0;--shiki-default:#B2CCD6;--shiki-dark:#B2CCD6}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":302,"searchDepth":343,"depth":343,"links":2535},[2536,2537,2541],{"id":290,"depth":343,"text":290},{"id":1263,"depth":343,"text":1263,"children":2538},[2539,2540],{"id":1361,"depth":372,"text":1361},{"id":1460,"depth":372,"text":1460},{"id":1740,"depth":343,"text":452,"children":2542},[2543,2544],{"id":1956,"depth":372,"text":1956},{"id":2158,"depth":372,"text":2159},"SFC 位置、快速开始、defineMcpApp 宏、服务器处理器，以及共享类型。","md",null,{},{"icon":169},{"title":2551,"description":2552},"MCP Apps — 编写","MCP UI 应用的快速开始、文件约定、defineMcpApp，以及类型共享。","fuLlJ-Z9PMTp4CDX9QECfNmbBjsiTBdATEELYXEuuwY",[2555,2557],{"title":46,"path":162,"stem":163,"description":2556,"icon":164,"children":-1},"构建交互式 UI 小部件，让 AI 主机与聊天内容并排渲染——以 Vue SFC 编写，作为 MCP UI 资源提供。",{"title":171,"path":172,"stem":173,"description":2558,"icon":174,"children":-1},"来自 iframe 内部的 data、hostContext、sendPrompt、callTool 和 openLink。",1778659578906]