[{"data":1,"prerenderedAt":2224},["ShallowReactive",2],{"navigation_docs":3,"-apps-authoring":282,"-apps-authoring-surround":2219},[4,40,70,99,122,156,189,253],{"title":5,"path":6,"stem":7,"children":8,"page":39},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24,29,34],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-book-open",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Configuration","\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},"Tools","\u002Ftools","2.tools",[45,50,55,60,65],{"title":46,"path":47,"stem":48,"icon":49},"Overview","\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},"Annotations & input examples","\u002Ftools\u002Fannotations","2.tools\u002F2.annotations","i-lucide-badge-info",{"title":61,"path":62,"stem":63,"icon":64},"Errors & caching","\u002Ftools\u002Ferrors-caching","2.tools\u002F3.errors-caching","i-lucide-shield",{"title":66,"path":67,"stem":68,"icon":69},"Groups, files & dynamic registration","\u002Ftools\u002Fgroups-organization","2.tools\u002F4.groups-organization","i-lucide-tags",{"title":71,"path":72,"stem":73,"children":74,"page":39},"Resources","\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},"Static resources & structure","\u002Fresources\u002Fstatic-and-structure","3.resources\u002F1.static-and-structure","i-lucide-file-stack",{"title":85,"path":86,"stem":87,"icon":88},"Templates & handlers","\u002Fresources\u002Ftemplates-and-handlers","3.resources\u002F2.templates-and-handlers","i-lucide-git-branch",{"title":90,"path":91,"stem":92,"icon":93},"Metadata, content & errors","\u002Fresources\u002Fcontent-metadata-errors","3.resources\u002F3.content-metadata-errors","i-lucide-layers",{"title":95,"path":96,"stem":97,"icon":98},"Groups & organization","\u002Fresources\u002Forganization","3.resources\u002F4.organization","i-lucide-folder-tree",{"title":100,"path":101,"stem":102,"children":103,"page":39},"Prompts","\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},"Authoring & structure","\u002Fprompts\u002Fauthoring","4.prompts\u002F1.authoring","i-lucide-pen-line",{"title":114,"path":115,"stem":116,"icon":93},"Input, handler & messages","\u002Fprompts\u002Finput-handler-messages","4.prompts\u002F2.input-handler-messages",{"title":118,"path":119,"stem":120,"icon":121},"Patterns & advanced","\u002Fprompts\u002Fpatterns-advanced","4.prompts\u002F3.patterns-advanced","i-lucide-line-chart",{"title":123,"path":124,"stem":125,"children":126,"page":39},"Handlers","\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},"Default & custom handlers","\u002Fhandlers\u002Fdefault-and-custom","5.handlers\u002F1.default-and-custom","i-lucide-toggle-left",{"title":137,"path":138,"stem":139,"icon":140},"Structure & options","\u002Fhandlers\u002Fstructure-and-options","5.handlers\u002F2.structure-and-options","i-lucide-sliders-horizontal",{"title":142,"path":143,"stem":144,"icon":145},"Examples & routing","\u002Fhandlers\u002Fexamples-routing","5.handlers\u002F3.examples-routing","i-lucide-route",{"title":147,"path":148,"stem":149,"icon":150},"Sharing & practices","\u002Fhandlers\u002Fsharing-practices","5.handlers\u002F4.sharing-practices","i-lucide-share-2",{"title":152,"path":153,"stem":154,"icon":155},"Multi-handler organization","\u002Fhandlers\u002Forganization","5.handlers\u002F5.organization","i-lucide-network",{"title":157,"path":158,"stem":159,"children":160,"page":39},"Apps","\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},"Authoring & defineMcpApp","\u002Fapps\u002Fauthoring","6.apps\u002F1.authoring","i-lucide-code-2",{"title":171,"path":172,"stem":173,"icon":174},"useMcpApp() bridge","\u002Fapps\u002Fuse-mcp-app","6.apps\u002F2.use-mcp-app","i-lucide-message-circle",{"title":176,"path":177,"stem":178,"icon":64},"CSP & build pipeline","\u002Fapps\u002Fcsp-and-wiring","6.apps\u002F3.csp-and-wiring",{"title":180,"path":181,"stem":182,"icon":183},"Testing & publishing","\u002Fapps\u002Ftesting-publishing","6.apps\u002F4.testing-publishing","i-lucide-rocket",{"title":185,"path":186,"stem":187,"icon":188},"Patterns & limits","\u002Fapps\u002Fpatterns-reference","6.apps\u002F5.patterns-reference","i-lucide-book-marked",{"title":190,"path":191,"stem":192,"children":193,"page":39},"Advanced Topics","\u002Fadvanced","7.advanced",[194,199,204,209,214,218,223,228,233,238,243,248],{"title":195,"path":196,"stem":197,"icon":198},"Custom Paths","\u002Fadvanced\u002Fcustom-paths","7.advanced\u002F1.custom-paths","i-lucide-folder",{"title":200,"path":201,"stem":202,"icon":203},"Logging","\u002Fadvanced\u002Flogging","7.advanced\u002F10.logging","i-lucide-scroll-text",{"title":205,"path":206,"stem":207,"icon":208},"MCP Apps Internals","\u002Fadvanced\u002Fmcp-apps-internals","7.advanced\u002F11.mcp-apps-internals","i-lucide-cog",{"title":210,"path":211,"stem":212,"icon":213},"Listing Definitions","\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 Evals","\u002Fadvanced\u002Fevals","7.advanced\u002F5.evals","i-lucide-flask-conical",{"title":234,"path":235,"stem":236,"icon":237},"Sessions","\u002Fadvanced\u002Fsessions","7.advanced\u002F6.sessions","i-lucide-database",{"title":239,"path":240,"stem":241,"icon":242},"Dynamic Definitions","\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},"Elicitation","\u002Fadvanced\u002Felicitation","7.advanced\u002F9.elicitation","i-lucide-message-square-quote",{"title":254,"path":255,"stem":256,"children":257,"page":39},"Examples","\u002Fexamples","8.examples",[258,263,268,273,278],{"title":259,"path":260,"stem":261,"icon":262},"Authentication","\u002Fexamples\u002Fauthentication","8.examples\u002F1.authentication","i-lucide-shield-check",{"title":264,"path":265,"stem":266,"icon":267},"API Integration","\u002Fexamples\u002Fapi-integration","8.examples\u002F2.api-integration","i-lucide-globe",{"title":269,"path":270,"stem":271,"icon":272},"Common Patterns","\u002Fexamples\u002Fcommon-patterns","8.examples\u002F3.common-patterns","i-lucide-lightbulb",{"title":274,"path":275,"stem":276,"icon":277},"File Operations","\u002Fexamples\u002Ffile-operations","8.examples\u002F4.file-operations","i-lucide-file",{"title":279,"path":280,"stem":281,"icon":107},"Prompt Examples","\u002Fexamples\u002Fprompt-examples","8.examples\u002F5.prompt-examples",{"id":283,"title":166,"body":284,"description":2210,"extension":2211,"links":2212,"meta":2213,"navigation":2214,"path":167,"seo":2215,"stem":168,"__hash__":2218},"docs\u002F6.apps\u002F1.authoring.md",{"type":285,"value":286,"toc":2200},"minimark",[287,292,296,1203,1206,1264,1268,1292,1343,1361,1366,1376,1449,1460,1465,1476,1616,1620,1635,1794,1810,1820,1824,1838,1902,2015,2194,2197],[288,289,291],"h2",{"id":290},"quick-start","Quick Start",[293,294,295],"p",{},"A complete app — schema, server handler, UI — in one file:",[297,298,304],"pre",{"className":299,"code":300,"filename":301,"language":302,"meta":303,"style":303},"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: 'Pick a colour and preview a 5-tone palette.',\n  inputSchema: {\n    base: z.string().describe('Hex colour to anchor the palette, e.g. #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      Mixing colours…\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(`Use ${s.name} (${s.hex}) as the primary colour.`)\"\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","",[305,306,307,342,371,378,391,403,436,442,447,460,479,489,527,533,575,630,645,654,679,684,692,697,735,745,750,760,783,805,811,821,854,889,898,914,929,944,950,956,966,976,985,995,1004,1009,1022,1061,1132,1194],"code",{"__ignoreMap":303},[308,309,312,316,320,324,327,330,333,337,339],"span",{"class":310,"line":311},"line",1,[308,313,315],{"class":314},"sMK4o","\u003C",[308,317,319],{"class":318},"swJcz","script",[308,321,323],{"class":322},"spNyl"," setup",[308,325,326],{"class":322}," lang",[308,328,329],{"class":314},"=",[308,331,332],{"class":314},"\"",[308,334,336],{"class":335},"sfazB","ts",[308,338,332],{"class":314},[308,340,341],{"class":314},">\n",[308,343,345,349,352,356,359,362,365,368],{"class":310,"line":344},2,[308,346,348],{"class":347},"s7zQu","import",[308,350,351],{"class":314}," {",[308,353,355],{"class":354},"sTEyZ"," z",[308,357,358],{"class":314}," }",[308,360,361],{"class":347}," from",[308,363,364],{"class":314}," '",[308,366,367],{"class":335},"zod",[308,369,370],{"class":314},"'\n",[308,372,374],{"class":310,"line":373},3,[308,375,377],{"emptyLinePlaceholder":376},true,"\n",[308,379,381,384,388],{"class":310,"line":380},4,[308,382,383],{"class":322},"interface",[308,385,387],{"class":386},"sBMFI"," PalettePayload",[308,389,390],{"class":314}," {\n",[308,392,394,397,400],{"class":310,"line":393},5,[308,395,396],{"class":318},"  base",[308,398,399],{"class":314},":",[308,401,402],{"class":386}," string\n",[308,404,406,409,411,413,416,418,421,424,427,429,431,433],{"class":310,"line":405},6,[308,407,408],{"class":318},"  swatches",[308,410,399],{"class":314},[308,412,351],{"class":314},[308,414,415],{"class":318}," name",[308,417,399],{"class":314},[308,419,420],{"class":386}," string",[308,422,423],{"class":314},",",[308,425,426],{"class":318}," hex",[308,428,399],{"class":314},[308,430,420],{"class":386},[308,432,358],{"class":314},[308,434,435],{"class":354},"[]\n",[308,437,439],{"class":310,"line":438},7,[308,440,441],{"class":314},"}\n",[308,443,445],{"class":310,"line":444},8,[308,446,377],{"emptyLinePlaceholder":376},[308,448,450,454,457],{"class":310,"line":449},9,[308,451,453],{"class":452},"s2Zo4","defineMcpApp",[308,455,456],{"class":354},"(",[308,458,459],{"class":314},"{\n",[308,461,463,466,468,470,473,476],{"class":310,"line":462},10,[308,464,465],{"class":318},"  description",[308,467,399],{"class":314},[308,469,364],{"class":314},[308,471,472],{"class":335},"Pick a colour and preview a 5-tone palette.",[308,474,475],{"class":314},"'",[308,477,478],{"class":314},",\n",[308,480,482,485,487],{"class":310,"line":481},11,[308,483,484],{"class":318},"  inputSchema",[308,486,399],{"class":314},[308,488,390],{"class":314},[308,490,492,495,497,499,502,505,508,510,513,515,517,520,522,525],{"class":310,"line":491},12,[308,493,494],{"class":318},"    base",[308,496,399],{"class":314},[308,498,355],{"class":354},[308,500,501],{"class":314},".",[308,503,504],{"class":452},"string",[308,506,507],{"class":354},"()",[308,509,501],{"class":314},[308,511,512],{"class":452},"describe",[308,514,456],{"class":354},[308,516,475],{"class":314},[308,518,519],{"class":335},"Hex colour to anchor the palette, e.g. #2563eb",[308,521,475],{"class":314},[308,523,524],{"class":354},")",[308,526,478],{"class":314},[308,528,530],{"class":310,"line":529},13,[308,531,532],{"class":314},"  },\n",[308,534,536,539,541,544,547,551,554,557,560,563,565,567,570,573],{"class":310,"line":535},14,[308,537,538],{"class":452},"  handler",[308,540,399],{"class":314},[308,542,543],{"class":322}," async",[308,545,546],{"class":314}," ({",[308,548,550],{"class":549},"sHdIc"," base",[308,552,553],{"class":314}," }):",[308,555,556],{"class":386}," Promise",[308,558,559],{"class":314},"\u003C{",[308,561,562],{"class":318}," structuredContent",[308,564,399],{"class":314},[308,566,387],{"class":386},[308,568,569],{"class":314}," }>",[308,571,572],{"class":322}," =>",[308,574,390],{"class":314},[308,576,578,581,584,587,590,593,595,597,599,601,603,605,607,609,611,614,617,619,621,624,626,628],{"class":310,"line":577},15,[308,579,580],{"class":322},"    const",[308,582,583],{"class":354}," swatches",[308,585,586],{"class":314}," =",[308,588,589],{"class":347}," await",[308,591,592],{"class":452}," $fetch",[308,594,559],{"class":314},[308,596,415],{"class":318},[308,598,399],{"class":314},[308,600,420],{"class":386},[308,602,423],{"class":314},[308,604,426],{"class":318},[308,606,399],{"class":314},[308,608,420],{"class":386},[308,610,358],{"class":314},[308,612,613],{"class":318},"[]",[308,615,616],{"class":314},">",[308,618,456],{"class":318},[308,620,475],{"class":314},[308,622,623],{"class":335},"\u002Fapi\u002Fpalette",[308,625,475],{"class":314},[308,627,423],{"class":314},[308,629,390],{"class":314},[308,631,633,636,638,640,642],{"class":310,"line":632},16,[308,634,635],{"class":318},"      query",[308,637,399],{"class":314},[308,639,351],{"class":314},[308,641,550],{"class":354},[308,643,644],{"class":314}," },\n",[308,646,648,651],{"class":310,"line":647},17,[308,649,650],{"class":314},"    }",[308,652,653],{"class":318},")\n",[308,655,657,660,662,664,666,668,670,672,674,676],{"class":310,"line":656},18,[308,658,659],{"class":347},"    return",[308,661,351],{"class":314},[308,663,562],{"class":318},[308,665,399],{"class":314},[308,667,351],{"class":314},[308,669,550],{"class":354},[308,671,423],{"class":314},[308,673,583],{"class":354},[308,675,358],{"class":314},[308,677,678],{"class":314}," }\n",[308,680,682],{"class":310,"line":681},19,[308,683,532],{"class":314},[308,685,687,690],{"class":310,"line":686},20,[308,688,689],{"class":314},"}",[308,691,653],{"class":354},[308,693,695],{"class":310,"line":694},21,[308,696,377],{"emptyLinePlaceholder":376},[308,698,700,703,705,708,710,713,715,718,720,722,725,727,730,732],{"class":310,"line":699},22,[308,701,702],{"class":322},"const",[308,704,351],{"class":314},[308,706,707],{"class":354}," data",[308,709,423],{"class":314},[308,711,712],{"class":354}," loading",[308,714,423],{"class":314},[308,716,717],{"class":354}," sendPrompt ",[308,719,689],{"class":314},[308,721,586],{"class":314},[308,723,724],{"class":452}," useMcpApp",[308,726,315],{"class":314},[308,728,729],{"class":386},"PalettePayload",[308,731,616],{"class":314},[308,733,734],{"class":354},"()\n",[308,736,738,741,743],{"class":310,"line":737},23,[308,739,740],{"class":314},"\u003C\u002F",[308,742,319],{"class":318},[308,744,341],{"class":314},[308,746,748],{"class":310,"line":747},24,[308,749,377],{"emptyLinePlaceholder":376},[308,751,753,755,758],{"class":310,"line":752},25,[308,754,315],{"class":314},[308,756,757],{"class":318},"template",[308,759,341],{"class":314},[308,761,763,766,769,772,774,776,779,781],{"class":310,"line":762},26,[308,764,765],{"class":314},"  \u003C",[308,767,768],{"class":318},"main",[308,770,771],{"class":322}," class",[308,773,329],{"class":314},[308,775,332],{"class":314},[308,777,778],{"class":335},"picker",[308,780,332],{"class":314},[308,782,341],{"class":314},[308,784,786,789,791,794,796,798,801,803],{"class":310,"line":785},27,[308,787,788],{"class":314},"    \u003C",[308,790,293],{"class":318},[308,792,793],{"class":322}," v-if",[308,795,329],{"class":314},[308,797,332],{"class":314},[308,799,800],{"class":335},"loading",[308,802,332],{"class":314},[308,804,341],{"class":314},[308,806,808],{"class":310,"line":807},28,[308,809,810],{"class":354},"      Mixing colours…\n",[308,812,814,817,819],{"class":310,"line":813},29,[308,815,816],{"class":314},"    \u003C\u002F",[308,818,293],{"class":318},[308,820,341],{"class":314},[308,822,824,826,829,832,834,836,839,841,843,845,847,850,852],{"class":310,"line":823},30,[308,825,788],{"class":314},[308,827,828],{"class":318},"ul",[308,830,831],{"class":322}," v-else-if",[308,833,329],{"class":314},[308,835,332],{"class":314},[308,837,838],{"class":335},"data",[308,840,332],{"class":314},[308,842,771],{"class":322},[308,844,329],{"class":314},[308,846,332],{"class":314},[308,848,849],{"class":335},"swatches",[308,851,332],{"class":314},[308,853,341],{"class":314},[308,855,857,860,863,866,868,870,873,875,878,880,882,885,887],{"class":310,"line":856},31,[308,858,859],{"class":314},"      \u003C",[308,861,862],{"class":318},"li",[308,864,865],{"class":322}," v-for",[308,867,329],{"class":314},[308,869,332],{"class":314},[308,871,872],{"class":335},"s in data.swatches",[308,874,332],{"class":314},[308,876,877],{"class":322}," :key",[308,879,329],{"class":314},[308,881,332],{"class":314},[308,883,884],{"class":335},"s.hex",[308,886,332],{"class":314},[308,888,341],{"class":314},[308,890,892,895],{"class":310,"line":891},32,[308,893,894],{"class":314},"        \u003C",[308,896,897],{"class":318},"button\n",[308,899,901,904,906,908,911],{"class":310,"line":900},33,[308,902,903],{"class":322},"          type",[308,905,329],{"class":314},[308,907,332],{"class":314},[308,909,910],{"class":335},"button",[308,912,913],{"class":314},"\"\n",[308,915,917,920,922,924,927],{"class":310,"line":916},34,[308,918,919],{"class":322},"          :style",[308,921,329],{"class":314},[308,923,332],{"class":314},[308,925,926],{"class":335},"{ background: s.hex }",[308,928,913],{"class":314},[308,930,932,935,937,939,942],{"class":310,"line":931},35,[308,933,934],{"class":322},"          @click",[308,936,329],{"class":314},[308,938,332],{"class":314},[308,940,941],{"class":335},"sendPrompt(`Use ${s.name} (${s.hex}) as the primary colour.`)",[308,943,913],{"class":314},[308,945,947],{"class":310,"line":946},36,[308,948,949],{"class":314},"        >\n",[308,951,953],{"class":310,"line":952},37,[308,954,955],{"class":354},"          {{ s.name }}\n",[308,957,959,962,964],{"class":310,"line":958},38,[308,960,961],{"class":314},"        \u003C\u002F",[308,963,910],{"class":318},[308,965,341],{"class":314},[308,967,969,972,974],{"class":310,"line":968},39,[308,970,971],{"class":314},"      \u003C\u002F",[308,973,862],{"class":318},[308,975,341],{"class":314},[308,977,979,981,983],{"class":310,"line":978},40,[308,980,816],{"class":314},[308,982,828],{"class":318},[308,984,341],{"class":314},[308,986,988,991,993],{"class":310,"line":987},41,[308,989,990],{"class":314},"  \u003C\u002F",[308,992,768],{"class":318},[308,994,341],{"class":314},[308,996,998,1000,1002],{"class":310,"line":997},42,[308,999,740],{"class":314},[308,1001,757],{"class":318},[308,1003,341],{"class":314},[308,1005,1007],{"class":310,"line":1006},43,[308,1008,377],{"emptyLinePlaceholder":376},[308,1010,1012,1014,1017,1020],{"class":310,"line":1011},44,[308,1013,315],{"class":314},[308,1015,1016],{"class":318},"style",[308,1018,1019],{"class":322}," scoped",[308,1021,341],{"class":314},[308,1023,1025,1027,1029,1031,1035,1037,1041,1044,1047,1049,1052,1054,1057,1059],{"class":310,"line":1024},45,[308,1026,501],{"class":314},[308,1028,778],{"class":386},[308,1030,351],{"class":314},[308,1032,1034],{"class":1033},"sqsOY"," padding",[308,1036,399],{"class":314},[308,1038,1040],{"class":1039},"sbssI"," 16px",[308,1042,1043],{"class":314},";",[308,1045,1046],{"class":1033}," font-family",[308,1048,399],{"class":314},[308,1050,1051],{"class":354}," system-ui",[308,1053,423],{"class":314},[308,1055,1056],{"class":354}," sans-serif",[308,1058,1043],{"class":314},[308,1060,678],{"class":314},[308,1062,1064,1066,1068,1070,1073,1075,1078,1080,1083,1085,1088,1090,1093,1095,1098,1101,1104,1106,1109,1111,1113,1115,1118,1120,1123,1125,1128,1130],{"class":310,"line":1063},46,[308,1065,501],{"class":314},[308,1067,849],{"class":386},[308,1069,351],{"class":314},[308,1071,1072],{"class":1033}," display",[308,1074,399],{"class":314},[308,1076,1077],{"class":354}," grid",[308,1079,1043],{"class":314},[308,1081,1082],{"class":1033}," grid-template-columns",[308,1084,399],{"class":314},[308,1086,1087],{"class":452}," repeat",[308,1089,456],{"class":314},[308,1091,1092],{"class":1039},"5",[308,1094,423],{"class":314},[308,1096,1097],{"class":1039}," 1fr",[308,1099,1100],{"class":314},");",[308,1102,1103],{"class":1033}," gap",[308,1105,399],{"class":314},[308,1107,1108],{"class":1039}," 8px",[308,1110,1043],{"class":314},[308,1112,1034],{"class":1033},[308,1114,399],{"class":314},[308,1116,1117],{"class":1039}," 0",[308,1119,1043],{"class":314},[308,1121,1122],{"class":1033}," list-style",[308,1124,399],{"class":314},[308,1126,1127],{"class":354}," none",[308,1129,1043],{"class":314},[308,1131,678],{"class":314},[308,1133,1135,1137,1139,1142,1144,1147,1149,1152,1154,1157,1159,1162,1164,1167,1169,1171,1173,1176,1178,1180,1182,1185,1187,1190,1192],{"class":310,"line":1134},47,[308,1136,501],{"class":314},[308,1138,849],{"class":386},[308,1140,1141],{"class":386}," button",[308,1143,351],{"class":314},[308,1145,1146],{"class":1033}," width",[308,1148,399],{"class":314},[308,1150,1151],{"class":1039}," 100%",[308,1153,1043],{"class":314},[308,1155,1156],{"class":1033}," aspect-ratio",[308,1158,399],{"class":314},[308,1160,1161],{"class":1039}," 1",[308,1163,1043],{"class":314},[308,1165,1166],{"class":1033}," border-radius",[308,1168,399],{"class":314},[308,1170,1108],{"class":1039},[308,1172,1043],{"class":314},[308,1174,1175],{"class":1033}," border",[308,1177,399],{"class":314},[308,1179,1117],{"class":1039},[308,1181,1043],{"class":314},[308,1183,1184],{"class":1033}," cursor",[308,1186,399],{"class":314},[308,1188,1189],{"class":354}," pointer",[308,1191,1043],{"class":314},[308,1193,678],{"class":314},[308,1195,1197,1199,1201],{"class":310,"line":1196},48,[308,1198,740],{"class":314},[308,1200,1016],{"class":318},[308,1202,341],{"class":314},[293,1204,1205],{},"That's it. The toolkit:",[1207,1208,1209,1224,1238,1250],"ol",{},[862,1210,1211,1212,1214,1215,1219,1220,1223],{},"Detects ",[305,1213,453],{}," and ",[1216,1217,1218],"strong",{},"registers an MCP tool"," named ",[305,1221,1222],{},"color-picker"," (from the filename).",[862,1225,1226,1227,1230,1231,1234,1235,501],{},"Generates a ",[1216,1228,1229],{},"UI resource"," at ",[305,1232,1233],{},"ui:\u002F\u002Fmcp-app\u002Fcolor-picker"," exposing ",[305,1236,1237],{},"text\u002Fhtml;profile=mcp-app",[862,1239,1240,1241,501],{},"Bundles the SFC + assets into a single HTML file with ",[1242,1243,1247],"a",{"href":1244,"rel":1245},"https:\u002F\u002Fgithub.com\u002Frichardtallent\u002Fvite-plugin-singlefile",[1246],"nofollow",[305,1248,1249],{},"vite-plugin-singlefile",[862,1251,1252,1253,1256,1257,1260,1261,501],{},"Wires the ",[305,1254,1255],{},"handler","'s ",[305,1258,1259],{},"structuredContent"," into the iframe so the UI hydrates ",[1216,1262,1263],{},"without a second round-trip",[288,1265,1267],{"id":1266},"file-convention","File Convention",[293,1269,1270,1271,1276,1277,1280,1281,1284,1285,1288,1289,1291],{},"MCP Apps live in ",[1216,1272,1273],{},[305,1274,1275],{},"app\u002Fmcp\u002F"," by default (not ",[305,1278,1279],{},"server\u002Fmcp\u002F","). Change the app-side directory with ",[305,1282,1283],{},"mcp.appsDir"," in ",[305,1286,1287],{},"nuxt.config.ts",". They sit on the client side of Nuxt because they author Vue components — but the ",[305,1290,1255],{}," you declare runs server-side, just like a tool.",[297,1293,1297],{"className":1294,"code":1295,"language":1296,"meta":303,"style":303},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","app\u002F\n└── mcp\u002F\n    ├── color-picker.vue    # → tool: color-picker, resource: ui:\u002F\u002Fmcp-app\u002Fcolor-picker\n    └── admin\u002F\n        └── audit-log.vue   # → tool: audit-log\n","bash",[305,1298,1299,1304,1312,1324,1332],{"__ignoreMap":303},[308,1300,1301],{"class":310,"line":311},[308,1302,1303],{"class":386},"app\u002F\n",[308,1305,1306,1309],{"class":310,"line":344},[308,1307,1308],{"class":386},"└──",[308,1310,1311],{"class":335}," mcp\u002F\n",[308,1313,1314,1317,1320],{"class":310,"line":373},[308,1315,1316],{"class":386},"    ├──",[308,1318,1319],{"class":335}," color-picker.vue",[308,1321,1323],{"class":1322},"sHwdD","    # → tool: color-picker, resource: ui:\u002F\u002Fmcp-app\u002Fcolor-picker\n",[308,1325,1326,1329],{"class":310,"line":380},[308,1327,1328],{"class":386},"    └──",[308,1330,1331],{"class":335}," admin\u002F\n",[308,1333,1334,1337,1340],{"class":310,"line":393},[308,1335,1336],{"class":386},"        └──",[308,1338,1339],{"class":335}," audit-log.vue",[308,1341,1342],{"class":1322},"   # → tool: audit-log\n",[1344,1345,1348,1349,1352,1353,1356,1357,1360],"callout",{"color":1346,"icon":1347},"info","i-lucide-info","Co-locate helpers next to the SFC (e.g. ",[305,1350,1351],{},"format.ts",") — the bundler inlines them. Keep data generation in ",[305,1354,1355],{},"server\u002Fapi\u002F"," and call it via ",[305,1358,1359],{},"$fetch"," from the handler.",[1362,1363,1365],"h3",{"id":1364},"auto-generated-name-title","Auto-Generated Name & Title",[293,1367,1368,1369,1214,1372,1375],{},"Like tools and resources, ",[305,1370,1371],{},"name",[305,1373,1374],{},"title"," are inferred from the filename:",[1377,1378,1379,1395],"table",{},[1380,1381,1382],"thead",{},[1383,1384,1385,1389,1392],"tr",{},[1386,1387,1388],"th",{},"File",[1386,1390,1391],{},"Name",[1386,1393,1394],{},"Title",[1396,1397,1398,1415,1432],"tbody",{},[1383,1399,1400,1406,1410],{},[1401,1402,1403],"td",{},[305,1404,1405],{},"color-picker.vue",[1401,1407,1408],{},[305,1409,1222],{},[1401,1411,1412],{},[305,1413,1414],{},"Color Picker",[1383,1416,1417,1422,1427],{},[1401,1418,1419],{},[305,1420,1421],{},"weather-card.vue",[1401,1423,1424],{},[305,1425,1426],{},"weather-card",[1401,1428,1429],{},[305,1430,1431],{},"Weather Card",[1383,1433,1434,1439,1444],{},[1401,1435,1436],{},[305,1437,1438],{},"admin\u002Faudit-log.vue",[1401,1440,1441],{},[305,1442,1443],{},"audit-log",[1401,1445,1446],{},[305,1447,1448],{},"Audit Log",[293,1450,1451,1452,1454,1455,1457,1458,501],{},"Override either by passing ",[305,1453,1371],{}," \u002F ",[305,1456,1374],{}," to ",[305,1459,453],{},[288,1461,1463],{"id":1462},"definemcpapp",[305,1464,453],{},[293,1466,1467,1468,1471,1472,1475],{},"A macro — like ",[305,1469,1470],{},"definePageMeta"," — extracted at build time and ",[1216,1473,1474],{},"stripped from the browser bundle",". The fields it accepts:",[297,1477,1480],{"className":1478,"code":1479,"language":336,"meta":303,"style":303},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","defineMcpApp({\n  name?: string                          \u002F\u002F Override auto-derived name\n  title?: string                         \u002F\u002F Override auto-derived title\n  description?: string                   \u002F\u002F Shown to the LLM to help it pick this app\n  inputSchema?: ZodRawShape              \u002F\u002F Validates tool input on the server\n  handler?: (args, extra) => Result      \u002F\u002F Runs server-side; defaults to (args) => ({ structuredContent: args })\n  csp?: McpAppCsp | false                \u002F\u002F Tighten or disable iframe CSP\n  _meta?: Record\u003Cstring, unknown>        \u002F\u002F Extra _meta fields surfaced to the host\n})\n",[305,1481,1482,1490,1503,1517,1529,1541,1568,1588,1610],{"__ignoreMap":303},[308,1483,1484,1486,1488],{"class":310,"line":311},[308,1485,453],{"class":452},[308,1487,456],{"class":354},[308,1489,459],{"class":314},[308,1491,1492,1495,1497,1500],{"class":310,"line":344},[308,1493,1494],{"class":354},"  name?",[308,1496,399],{"class":314},[308,1498,1499],{"class":354}," string                          ",[308,1501,1502],{"class":1322},"\u002F\u002F Override auto-derived name\n",[308,1504,1505,1508,1511,1514],{"class":310,"line":373},[308,1506,1507],{"class":354},"  title",[308,1509,1510],{"class":314},"?:",[308,1512,1513],{"class":354}," string                         ",[308,1515,1516],{"class":1322},"\u002F\u002F Override auto-derived title\n",[308,1518,1519,1521,1523,1526],{"class":310,"line":380},[308,1520,465],{"class":354},[308,1522,1510],{"class":314},[308,1524,1525],{"class":354}," string                   ",[308,1527,1528],{"class":1322},"\u002F\u002F Shown to the LLM to help it pick this app\n",[308,1530,1531,1533,1535,1538],{"class":310,"line":393},[308,1532,484],{"class":354},[308,1534,1510],{"class":314},[308,1536,1537],{"class":354}," ZodRawShape              ",[308,1539,1540],{"class":1322},"\u002F\u002F Validates tool input on the server\n",[308,1542,1543,1545,1547,1550,1553,1555,1558,1560,1562,1565],{"class":310,"line":405},[308,1544,538],{"class":354},[308,1546,1510],{"class":314},[308,1548,1549],{"class":314}," (",[308,1551,1552],{"class":549},"args",[308,1554,423],{"class":314},[308,1556,1557],{"class":549}," extra",[308,1559,524],{"class":314},[308,1561,572],{"class":322},[308,1563,1564],{"class":354}," Result      ",[308,1566,1567],{"class":1322},"\u002F\u002F Runs server-side; defaults to (args) => ({ structuredContent: args })\n",[308,1569,1570,1573,1575,1578,1581,1585],{"class":310,"line":438},[308,1571,1572],{"class":354},"  csp",[308,1574,1510],{"class":314},[308,1576,1577],{"class":354}," McpAppCsp ",[308,1579,1580],{"class":314},"|",[308,1582,1584],{"class":1583},"sfNiH"," false",[308,1586,1587],{"class":1322},"                \u002F\u002F Tighten or disable iframe CSP\n",[308,1589,1590,1593,1595,1598,1600,1602,1604,1607],{"class":310,"line":444},[308,1591,1592],{"class":354},"  _meta",[308,1594,1510],{"class":314},[308,1596,1597],{"class":354}," Record",[308,1599,315],{"class":314},[308,1601,504],{"class":354},[308,1603,423],{"class":314},[308,1605,1606],{"class":354}," unknown>        ",[308,1608,1609],{"class":1322},"\u002F\u002F Extra _meta fields surfaced to the host\n",[308,1611,1612,1614],{"class":310,"line":449},[308,1613,689],{"class":314},[308,1615,653],{"class":354},[1362,1617,1619],{"id":1618},"server-handler","Server Handler",[293,1621,1622,1623,1625,1626,1628,1629,1632,1633,399],{},"The ",[305,1624,1255],{}," runs in your Nitro server, not in the iframe. It receives validated input and returns ",[305,1627,1259],{}," that the UI hydrates from. ",[1216,1630,1631],{},"Treat it like a tool handler"," — call APIs, query a database, hit ",[305,1634,1359],{},[297,1636,1638],{"className":1478,"code":1637,"language":336,"meta":303,"style":303},"defineMcpApp({\n  description: 'Pick a colour and preview a 5-tone palette.',\n  inputSchema: {\n    base: z.string().describe('Hex colour to anchor the palette, e.g. #2563eb'),\n  },\n  handler: async ({ base }) => {\n    const swatches = await $fetch('\u002Fapi\u002Fpalette', { query: { base } })\n    return { structuredContent: { base, swatches } }\n  },\n})\n",[305,1639,1640,1648,1662,1670,1700,1704,1723,1762,1784,1788],{"__ignoreMap":303},[308,1641,1642,1644,1646],{"class":310,"line":311},[308,1643,453],{"class":452},[308,1645,456],{"class":354},[308,1647,459],{"class":314},[308,1649,1650,1652,1654,1656,1658,1660],{"class":310,"line":344},[308,1651,465],{"class":318},[308,1653,399],{"class":314},[308,1655,364],{"class":314},[308,1657,472],{"class":335},[308,1659,475],{"class":314},[308,1661,478],{"class":314},[308,1663,1664,1666,1668],{"class":310,"line":373},[308,1665,484],{"class":318},[308,1667,399],{"class":314},[308,1669,390],{"class":314},[308,1671,1672,1674,1676,1678,1680,1682,1684,1686,1688,1690,1692,1694,1696,1698],{"class":310,"line":380},[308,1673,494],{"class":318},[308,1675,399],{"class":314},[308,1677,355],{"class":354},[308,1679,501],{"class":314},[308,1681,504],{"class":452},[308,1683,507],{"class":354},[308,1685,501],{"class":314},[308,1687,512],{"class":452},[308,1689,456],{"class":354},[308,1691,475],{"class":314},[308,1693,519],{"class":335},[308,1695,475],{"class":314},[308,1697,524],{"class":354},[308,1699,478],{"class":314},[308,1701,1702],{"class":310,"line":393},[308,1703,532],{"class":314},[308,1705,1706,1708,1710,1712,1714,1716,1719,1721],{"class":310,"line":405},[308,1707,538],{"class":452},[308,1709,399],{"class":314},[308,1711,543],{"class":322},[308,1713,546],{"class":314},[308,1715,550],{"class":549},[308,1717,1718],{"class":314}," })",[308,1720,572],{"class":322},[308,1722,390],{"class":314},[308,1724,1725,1727,1729,1731,1733,1735,1737,1739,1741,1743,1745,1747,1750,1752,1754,1756,1758,1760],{"class":310,"line":438},[308,1726,580],{"class":322},[308,1728,583],{"class":354},[308,1730,586],{"class":314},[308,1732,589],{"class":347},[308,1734,592],{"class":452},[308,1736,456],{"class":318},[308,1738,475],{"class":314},[308,1740,623],{"class":335},[308,1742,475],{"class":314},[308,1744,423],{"class":314},[308,1746,351],{"class":314},[308,1748,1749],{"class":318}," query",[308,1751,399],{"class":314},[308,1753,351],{"class":314},[308,1755,550],{"class":354},[308,1757,358],{"class":314},[308,1759,358],{"class":314},[308,1761,653],{"class":318},[308,1763,1764,1766,1768,1770,1772,1774,1776,1778,1780,1782],{"class":310,"line":444},[308,1765,659],{"class":347},[308,1767,351],{"class":314},[308,1769,562],{"class":318},[308,1771,399],{"class":314},[308,1773,351],{"class":314},[308,1775,550],{"class":354},[308,1777,423],{"class":314},[308,1779,583],{"class":354},[308,1781,358],{"class":314},[308,1783,678],{"class":314},[308,1785,1786],{"class":310,"line":449},[308,1787,532],{"class":314},[308,1789,1790,1792],{"class":310,"line":462},[308,1791,689],{"class":314},[308,1793,653],{"class":354},[1344,1795,1798,1799,1801,1802,1805,1806,1809],{"color":1796,"icon":1797},"primary","i-lucide-zap","Returning ",[305,1800,1259],{}," from the handler ",[1216,1803,1804],{},"inlines the data into the HTML"," as a ",[305,1807,1808],{},"\u003Cscript type=\"application\u002Fjson\">",". The iframe boots with full data already present — no extra fetch, no flicker.",[293,1811,1812,1813,1815,1816,1819],{},"If you omit ",[305,1814,1255],{},", the toolkit defaults to ",[305,1817,1818],{},"(args) => ({ structuredContent: args })",". Useful for stateless apps that only need the input echoed back.",[1362,1821,1823],{"id":1822},"sharing-types-between-server-ui","Sharing Types Between Server & UI",[293,1825,1826,1827,1830,1831,1834,1835,1837],{},"Place shared types in Nuxt's ",[305,1828,1829],{},"shared\u002Ftypes\u002F"," directory — they're ",[1216,1832,1833],{},"auto-imported globally"," in both the SFC and your API endpoints, no ",[305,1836,348],{}," statement required:",[297,1839,1842],{"className":1478,"code":1840,"filename":1841,"language":336,"meta":303,"style":303},"export interface Swatch { name: string, hex: string }\nexport interface PalettePayload { base: string, swatches: Swatch[] }\n","shared\u002Ftypes\u002Fpalette.ts",[305,1843,1844,1873],{"__ignoreMap":303},[308,1845,1846,1849,1852,1855,1857,1859,1861,1863,1865,1867,1869,1871],{"class":310,"line":311},[308,1847,1848],{"class":347},"export",[308,1850,1851],{"class":322}," interface",[308,1853,1854],{"class":386}," Swatch",[308,1856,351],{"class":314},[308,1858,415],{"class":318},[308,1860,399],{"class":314},[308,1862,420],{"class":386},[308,1864,423],{"class":314},[308,1866,426],{"class":318},[308,1868,399],{"class":314},[308,1870,420],{"class":386},[308,1872,678],{"class":314},[308,1874,1875,1877,1879,1881,1883,1885,1887,1889,1891,1893,1895,1897,1900],{"class":310,"line":344},[308,1876,1848],{"class":347},[308,1878,1851],{"class":322},[308,1880,387],{"class":386},[308,1882,351],{"class":314},[308,1884,550],{"class":318},[308,1886,399],{"class":314},[308,1888,420],{"class":386},[308,1890,423],{"class":314},[308,1892,583],{"class":318},[308,1894,399],{"class":314},[308,1896,1854],{"class":386},[308,1898,1899],{"class":354},"[] ",[308,1901,441],{"class":314},[297,1903,1906],{"className":1478,"code":1904,"filename":1905,"language":336,"meta":303,"style":303},"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",[305,1907,1908,1943,1965,2009],{"__ignoreMap":303},[308,1909,1910,1912,1915,1918,1920,1923,1925,1928,1931,1933,1935,1937,1939,1941],{"class":310,"line":311},[308,1911,1848],{"class":347},[308,1913,1914],{"class":347}," default",[308,1916,1917],{"class":452}," defineEventHandler",[308,1919,456],{"class":354},[308,1921,1922],{"class":322},"async",[308,1924,1549],{"class":314},[308,1926,1927],{"class":549},"event",[308,1929,1930],{"class":314},"):",[308,1932,556],{"class":386},[308,1934,315],{"class":314},[308,1936,729],{"class":386},[308,1938,616],{"class":314},[308,1940,572],{"class":322},[308,1942,390],{"class":314},[308,1944,1945,1948,1950,1952,1954,1956,1959,1961,1963],{"class":310,"line":344},[308,1946,1947],{"class":322},"  const",[308,1949,351],{"class":314},[308,1951,550],{"class":354},[308,1953,358],{"class":314},[308,1955,586],{"class":314},[308,1957,1958],{"class":452}," getQuery",[308,1960,456],{"class":318},[308,1962,1927],{"class":354},[308,1964,653],{"class":318},[308,1966,1967,1970,1972,1974,1976,1979,1981,1984,1986,1988,1990,1992,1995,1997,2000,2002,2004,2007],{"class":310,"line":373},[308,1968,1969],{"class":347},"  return",[308,1971,351],{"class":314},[308,1973,550],{"class":318},[308,1975,399],{"class":314},[308,1977,1978],{"class":452}," String",[308,1980,456],{"class":318},[308,1982,1983],{"class":354},"base",[308,1985,524],{"class":318},[308,1987,423],{"class":314},[308,1989,583],{"class":318},[308,1991,399],{"class":314},[308,1993,1994],{"class":452}," buildPalette",[308,1996,456],{"class":318},[308,1998,1999],{"class":452},"String",[308,2001,456],{"class":318},[308,2003,1983],{"class":354},[308,2005,2006],{"class":318},")) ",[308,2008,441],{"class":314},[308,2010,2011,2013],{"class":310,"line":380},[308,2012,689],{"class":314},[308,2014,653],{"class":354},[297,2016,2018],{"className":299,"code":2017,"filename":301,"language":302,"meta":303,"style":303},"\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",[305,2019,2020,2040,2048,2072,2104,2144,2153,2159,2163,2186],{"__ignoreMap":303},[308,2021,2022,2024,2026,2028,2030,2032,2034,2036,2038],{"class":310,"line":311},[308,2023,315],{"class":314},[308,2025,319],{"class":318},[308,2027,323],{"class":322},[308,2029,326],{"class":322},[308,2031,329],{"class":314},[308,2033,332],{"class":314},[308,2035,336],{"class":335},[308,2037,332],{"class":314},[308,2039,341],{"class":314},[308,2041,2042,2044,2046],{"class":310,"line":344},[308,2043,453],{"class":452},[308,2045,456],{"class":354},[308,2047,459],{"class":314},[308,2049,2050,2052,2054,2056,2058,2060,2062,2064,2066,2069],{"class":310,"line":373},[308,2051,484],{"class":318},[308,2053,399],{"class":314},[308,2055,351],{"class":314},[308,2057,550],{"class":318},[308,2059,399],{"class":314},[308,2061,355],{"class":354},[308,2063,501],{"class":314},[308,2065,504],{"class":452},[308,2067,2068],{"class":354},"() ",[308,2070,2071],{"class":314},"},\n",[308,2073,2074,2076,2078,2080,2082,2084,2086,2088,2090,2092,2094,2096,2098,2100,2102],{"class":310,"line":380},[308,2075,538],{"class":452},[308,2077,399],{"class":314},[308,2079,543],{"class":322},[308,2081,546],{"class":314},[308,2083,550],{"class":549},[308,2085,553],{"class":314},[308,2087,556],{"class":386},[308,2089,559],{"class":314},[308,2091,562],{"class":318},[308,2093,399],{"class":314},[308,2095,387],{"class":386},[308,2097,569],{"class":314},[308,2099,572],{"class":322},[308,2101,1549],{"class":354},[308,2103,459],{"class":314},[308,2105,2106,2109,2111,2113,2115,2117,2119,2121,2123,2125,2127,2129,2131,2133,2136,2138,2140,2142],{"class":310,"line":393},[308,2107,2108],{"class":318},"    structuredContent",[308,2110,399],{"class":314},[308,2112,589],{"class":347},[308,2114,592],{"class":452},[308,2116,456],{"class":354},[308,2118,475],{"class":314},[308,2120,623],{"class":335},[308,2122,475],{"class":314},[308,2124,423],{"class":314},[308,2126,351],{"class":314},[308,2128,1749],{"class":318},[308,2130,399],{"class":314},[308,2132,351],{"class":314},[308,2134,2135],{"class":354}," base ",[308,2137,689],{"class":314},[308,2139,358],{"class":314},[308,2141,524],{"class":354},[308,2143,478],{"class":314},[308,2145,2146,2149,2151],{"class":310,"line":405},[308,2147,2148],{"class":314},"  }",[308,2150,524],{"class":354},[308,2152,478],{"class":314},[308,2154,2155,2157],{"class":310,"line":438},[308,2156,689],{"class":314},[308,2158,653],{"class":354},[308,2160,2161],{"class":310,"line":444},[308,2162,377],{"emptyLinePlaceholder":376},[308,2164,2165,2167,2169,2172,2174,2176,2178,2180,2182,2184],{"class":310,"line":449},[308,2166,702],{"class":322},[308,2168,351],{"class":314},[308,2170,2171],{"class":354}," data ",[308,2173,689],{"class":314},[308,2175,586],{"class":314},[308,2177,724],{"class":452},[308,2179,315],{"class":314},[308,2181,729],{"class":386},[308,2183,616],{"class":314},[308,2185,734],{"class":354},[308,2187,2188,2190,2192],{"class":310,"line":462},[308,2189,740],{"class":314},[308,2191,319],{"class":318},[308,2193,341],{"class":314},[293,2195,2196],{},"Type-only references are stripped from the browser bundle by esbuild — nothing has to resolve inside the iframe at runtime.",[1016,2198,2199],{},"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":303,"searchDepth":344,"depth":344,"links":2201},[2202,2203,2206],{"id":290,"depth":344,"text":291},{"id":1266,"depth":344,"text":1267,"children":2204},[2205],{"id":1364,"depth":373,"text":1365},{"id":1462,"depth":344,"text":453,"children":2207},[2208,2209],{"id":1618,"depth":373,"text":1619},{"id":1822,"depth":373,"text":1823},"SFC location, quick start, the defineMcpApp macro, server handler, and shared types.","md",null,{},{"icon":169},{"title":2216,"description":2217},"MCP Apps — Authoring","Quick start, file convention, defineMcpApp, and sharing types for MCP UI apps.","fv_Ymm5HmAxBeFyrNu76UwuEOy1bz_tTV8Kys1x447Q",[2220,2222],{"title":46,"path":162,"stem":163,"description":2221,"icon":164,"children":-1},"Build interactive UI widgets that AI hosts render alongside chat — written as Vue SFCs, served as MCP UI resources.",{"title":171,"path":172,"stem":173,"description":2223,"icon":174,"children":-1},"data, hostContext, sendPrompt, callTool, and openLink from inside the iframe.",1777888634508]