[{"data":1,"prerenderedAt":2567},["ShallowReactive",2],{"navigation_docs":3,"-apps-authoring":287,"-apps-authoring-surround":2562},[4,40,70,99,122,156,189,258],{"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,219,223,228,233,238,243,248,253],{"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":218},"llms.txt discovery","\u002Fadvanced\u002Fllms-txt","7.advanced\u002F13.llms-txt","i-lucide-file-text",{"title":220,"path":221,"stem":222,"icon":64},"Middleware","\u002Fadvanced\u002Fmiddleware","7.advanced\u002F2.middleware",{"title":224,"path":225,"stem":226,"icon":227},"TypeScript","\u002Fadvanced\u002Ftypescript","7.advanced\u002F3.typescript","i-lucide-type",{"title":229,"path":230,"stem":231,"icon":232},"Hooks","\u002Fadvanced\u002Fhooks","7.advanced\u002F4.hooks","i-lucide-webhook",{"title":234,"path":235,"stem":236,"icon":237},"MCP Evals","\u002Fadvanced\u002Fevals","7.advanced\u002F5.evals","i-lucide-flask-conical",{"title":239,"path":240,"stem":241,"icon":242},"Sessions","\u002Fadvanced\u002Fsessions","7.advanced\u002F6.sessions","i-lucide-database",{"title":244,"path":245,"stem":246,"icon":247},"Dynamic Definitions","\u002Fadvanced\u002Fdynamic-definitions","7.advanced\u002F7.dynamic-definitions","i-lucide-toggle-right",{"title":249,"path":250,"stem":251,"icon":252},"Code Mode","\u002Fadvanced\u002Fcode-mode","7.advanced\u002F8.code-mode","i-lucide-code",{"title":254,"path":255,"stem":256,"icon":257},"Elicitation","\u002Fadvanced\u002Felicitation","7.advanced\u002F9.elicitation","i-lucide-message-square-quote",{"title":259,"path":260,"stem":261,"children":262,"page":39},"Examples","\u002Fexamples","8.examples",[263,268,273,278,283],{"title":264,"path":265,"stem":266,"icon":267},"Authentication","\u002Fexamples\u002Fauthentication","8.examples\u002F1.authentication","i-lucide-shield-check",{"title":269,"path":270,"stem":271,"icon":272},"API Integration","\u002Fexamples\u002Fapi-integration","8.examples\u002F2.api-integration","i-lucide-globe",{"title":274,"path":275,"stem":276,"icon":277},"Common Patterns","\u002Fexamples\u002Fcommon-patterns","8.examples\u002F3.common-patterns","i-lucide-lightbulb",{"title":279,"path":280,"stem":281,"icon":282},"File Operations","\u002Fexamples\u002Ffile-operations","8.examples\u002F4.file-operations","i-lucide-file",{"title":284,"path":285,"stem":286,"icon":107},"Prompt Examples","\u002Fexamples\u002Fprompt-examples","8.examples\u002F5.prompt-examples",{"id":288,"title":166,"body":289,"description":2553,"extension":2554,"links":2555,"meta":2556,"navigation":2557,"path":167,"seo":2558,"stem":168,"__hash__":2561},"docs\u002F6.apps\u002F1.authoring.md",{"type":290,"value":291,"toc":2542},"minimark",[292,297,301,1208,1211,1269,1273,1297,1348,1366,1371,1381,1454,1465,1469,1480,1489,1551,1557,1605,1615,1722,1745,1750,1761,1935,1960,1964,1979,2138,2154,2164,2168,2182,2245,2357,2536,2539],[293,294,296],"h2",{"id":295},"quick-start","Quick Start",[298,299,300],"p",{},"A complete app — schema, server handler, UI — in one file:",[302,303,309],"pre",{"className":304,"code":305,"filename":306,"language":307,"meta":308,"style":308},"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","",[310,311,312,347,376,383,396,408,441,447,452,465,484,494,532,538,580,635,650,659,684,689,697,702,740,750,755,765,788,810,816,826,859,894,903,919,934,949,955,961,971,981,990,1000,1009,1014,1027,1066,1137,1199],"code",{"__ignoreMap":308},[313,314,317,321,325,329,332,335,338,342,344],"span",{"class":315,"line":316},"line",1,[313,318,320],{"class":319},"sMK4o","\u003C",[313,322,324],{"class":323},"swJcz","script",[313,326,328],{"class":327},"spNyl"," setup",[313,330,331],{"class":327}," lang",[313,333,334],{"class":319},"=",[313,336,337],{"class":319},"\"",[313,339,341],{"class":340},"sfazB","ts",[313,343,337],{"class":319},[313,345,346],{"class":319},">\n",[313,348,350,354,357,361,364,367,370,373],{"class":315,"line":349},2,[313,351,353],{"class":352},"s7zQu","import",[313,355,356],{"class":319}," {",[313,358,360],{"class":359},"sTEyZ"," z",[313,362,363],{"class":319}," }",[313,365,366],{"class":352}," from",[313,368,369],{"class":319}," '",[313,371,372],{"class":340},"zod",[313,374,375],{"class":319},"'\n",[313,377,379],{"class":315,"line":378},3,[313,380,382],{"emptyLinePlaceholder":381},true,"\n",[313,384,386,389,393],{"class":315,"line":385},4,[313,387,388],{"class":327},"interface",[313,390,392],{"class":391},"sBMFI"," PalettePayload",[313,394,395],{"class":319}," {\n",[313,397,399,402,405],{"class":315,"line":398},5,[313,400,401],{"class":323},"  base",[313,403,404],{"class":319},":",[313,406,407],{"class":391}," string\n",[313,409,411,414,416,418,421,423,426,429,432,434,436,438],{"class":315,"line":410},6,[313,412,413],{"class":323},"  swatches",[313,415,404],{"class":319},[313,417,356],{"class":319},[313,419,420],{"class":323}," name",[313,422,404],{"class":319},[313,424,425],{"class":391}," string",[313,427,428],{"class":319},",",[313,430,431],{"class":323}," hex",[313,433,404],{"class":319},[313,435,425],{"class":391},[313,437,363],{"class":319},[313,439,440],{"class":359},"[]\n",[313,442,444],{"class":315,"line":443},7,[313,445,446],{"class":319},"}\n",[313,448,450],{"class":315,"line":449},8,[313,451,382],{"emptyLinePlaceholder":381},[313,453,455,459,462],{"class":315,"line":454},9,[313,456,458],{"class":457},"s2Zo4","defineMcpApp",[313,460,461],{"class":359},"(",[313,463,464],{"class":319},"{\n",[313,466,468,471,473,475,478,481],{"class":315,"line":467},10,[313,469,470],{"class":323},"  description",[313,472,404],{"class":319},[313,474,369],{"class":319},[313,476,477],{"class":340},"Pick a colour and preview a 5-tone palette.",[313,479,480],{"class":319},"'",[313,482,483],{"class":319},",\n",[313,485,487,490,492],{"class":315,"line":486},11,[313,488,489],{"class":323},"  inputSchema",[313,491,404],{"class":319},[313,493,395],{"class":319},[313,495,497,500,502,504,507,510,513,515,518,520,522,525,527,530],{"class":315,"line":496},12,[313,498,499],{"class":323},"    base",[313,501,404],{"class":319},[313,503,360],{"class":359},[313,505,506],{"class":319},".",[313,508,509],{"class":457},"string",[313,511,512],{"class":359},"()",[313,514,506],{"class":319},[313,516,517],{"class":457},"describe",[313,519,461],{"class":359},[313,521,480],{"class":319},[313,523,524],{"class":340},"Hex colour to anchor the palette, e.g. #2563eb",[313,526,480],{"class":319},[313,528,529],{"class":359},")",[313,531,483],{"class":319},[313,533,535],{"class":315,"line":534},13,[313,536,537],{"class":319},"  },\n",[313,539,541,544,546,549,552,556,559,562,565,568,570,572,575,578],{"class":315,"line":540},14,[313,542,543],{"class":457},"  handler",[313,545,404],{"class":319},[313,547,548],{"class":327}," async",[313,550,551],{"class":319}," ({",[313,553,555],{"class":554},"sHdIc"," base",[313,557,558],{"class":319}," }):",[313,560,561],{"class":391}," Promise",[313,563,564],{"class":319},"\u003C{",[313,566,567],{"class":323}," structuredContent",[313,569,404],{"class":319},[313,571,392],{"class":391},[313,573,574],{"class":319}," }>",[313,576,577],{"class":327}," =>",[313,579,395],{"class":319},[313,581,583,586,589,592,595,598,600,602,604,606,608,610,612,614,616,619,622,624,626,629,631,633],{"class":315,"line":582},15,[313,584,585],{"class":327},"    const",[313,587,588],{"class":359}," swatches",[313,590,591],{"class":319}," =",[313,593,594],{"class":352}," await",[313,596,597],{"class":457}," $fetch",[313,599,564],{"class":319},[313,601,420],{"class":323},[313,603,404],{"class":319},[313,605,425],{"class":391},[313,607,428],{"class":319},[313,609,431],{"class":323},[313,611,404],{"class":319},[313,613,425],{"class":391},[313,615,363],{"class":319},[313,617,618],{"class":323},"[]",[313,620,621],{"class":319},">",[313,623,461],{"class":323},[313,625,480],{"class":319},[313,627,628],{"class":340},"\u002Fapi\u002Fpalette",[313,630,480],{"class":319},[313,632,428],{"class":319},[313,634,395],{"class":319},[313,636,638,641,643,645,647],{"class":315,"line":637},16,[313,639,640],{"class":323},"      query",[313,642,404],{"class":319},[313,644,356],{"class":319},[313,646,555],{"class":359},[313,648,649],{"class":319}," },\n",[313,651,653,656],{"class":315,"line":652},17,[313,654,655],{"class":319},"    }",[313,657,658],{"class":323},")\n",[313,660,662,665,667,669,671,673,675,677,679,681],{"class":315,"line":661},18,[313,663,664],{"class":352},"    return",[313,666,356],{"class":319},[313,668,567],{"class":323},[313,670,404],{"class":319},[313,672,356],{"class":319},[313,674,555],{"class":359},[313,676,428],{"class":319},[313,678,588],{"class":359},[313,680,363],{"class":319},[313,682,683],{"class":319}," }\n",[313,685,687],{"class":315,"line":686},19,[313,688,537],{"class":319},[313,690,692,695],{"class":315,"line":691},20,[313,693,694],{"class":319},"}",[313,696,658],{"class":359},[313,698,700],{"class":315,"line":699},21,[313,701,382],{"emptyLinePlaceholder":381},[313,703,705,708,710,713,715,718,720,723,725,727,730,732,735,737],{"class":315,"line":704},22,[313,706,707],{"class":327},"const",[313,709,356],{"class":319},[313,711,712],{"class":359}," data",[313,714,428],{"class":319},[313,716,717],{"class":359}," loading",[313,719,428],{"class":319},[313,721,722],{"class":359}," sendPrompt ",[313,724,694],{"class":319},[313,726,591],{"class":319},[313,728,729],{"class":457}," useMcpApp",[313,731,320],{"class":319},[313,733,734],{"class":391},"PalettePayload",[313,736,621],{"class":319},[313,738,739],{"class":359},"()\n",[313,741,743,746,748],{"class":315,"line":742},23,[313,744,745],{"class":319},"\u003C\u002F",[313,747,324],{"class":323},[313,749,346],{"class":319},[313,751,753],{"class":315,"line":752},24,[313,754,382],{"emptyLinePlaceholder":381},[313,756,758,760,763],{"class":315,"line":757},25,[313,759,320],{"class":319},[313,761,762],{"class":323},"template",[313,764,346],{"class":319},[313,766,768,771,774,777,779,781,784,786],{"class":315,"line":767},26,[313,769,770],{"class":319},"  \u003C",[313,772,773],{"class":323},"main",[313,775,776],{"class":327}," class",[313,778,334],{"class":319},[313,780,337],{"class":319},[313,782,783],{"class":340},"picker",[313,785,337],{"class":319},[313,787,346],{"class":319},[313,789,791,794,796,799,801,803,806,808],{"class":315,"line":790},27,[313,792,793],{"class":319},"    \u003C",[313,795,298],{"class":323},[313,797,798],{"class":327}," v-if",[313,800,334],{"class":319},[313,802,337],{"class":319},[313,804,805],{"class":340},"loading",[313,807,337],{"class":319},[313,809,346],{"class":319},[313,811,813],{"class":315,"line":812},28,[313,814,815],{"class":359},"      Mixing colours…\n",[313,817,819,822,824],{"class":315,"line":818},29,[313,820,821],{"class":319},"    \u003C\u002F",[313,823,298],{"class":323},[313,825,346],{"class":319},[313,827,829,831,834,837,839,841,844,846,848,850,852,855,857],{"class":315,"line":828},30,[313,830,793],{"class":319},[313,832,833],{"class":323},"ul",[313,835,836],{"class":327}," v-else-if",[313,838,334],{"class":319},[313,840,337],{"class":319},[313,842,843],{"class":340},"data",[313,845,337],{"class":319},[313,847,776],{"class":327},[313,849,334],{"class":319},[313,851,337],{"class":319},[313,853,854],{"class":340},"swatches",[313,856,337],{"class":319},[313,858,346],{"class":319},[313,860,862,865,868,871,873,875,878,880,883,885,887,890,892],{"class":315,"line":861},31,[313,863,864],{"class":319},"      \u003C",[313,866,867],{"class":323},"li",[313,869,870],{"class":327}," v-for",[313,872,334],{"class":319},[313,874,337],{"class":319},[313,876,877],{"class":340},"s in data.swatches",[313,879,337],{"class":319},[313,881,882],{"class":327}," :key",[313,884,334],{"class":319},[313,886,337],{"class":319},[313,888,889],{"class":340},"s.hex",[313,891,337],{"class":319},[313,893,346],{"class":319},[313,895,897,900],{"class":315,"line":896},32,[313,898,899],{"class":319},"        \u003C",[313,901,902],{"class":323},"button\n",[313,904,906,909,911,913,916],{"class":315,"line":905},33,[313,907,908],{"class":327},"          type",[313,910,334],{"class":319},[313,912,337],{"class":319},[313,914,915],{"class":340},"button",[313,917,918],{"class":319},"\"\n",[313,920,922,925,927,929,932],{"class":315,"line":921},34,[313,923,924],{"class":327},"          :style",[313,926,334],{"class":319},[313,928,337],{"class":319},[313,930,931],{"class":340},"{ background: s.hex }",[313,933,918],{"class":319},[313,935,937,940,942,944,947],{"class":315,"line":936},35,[313,938,939],{"class":327},"          @click",[313,941,334],{"class":319},[313,943,337],{"class":319},[313,945,946],{"class":340},"sendPrompt(`Use ${s.name} (${s.hex}) as the primary colour.`)",[313,948,918],{"class":319},[313,950,952],{"class":315,"line":951},36,[313,953,954],{"class":319},"        >\n",[313,956,958],{"class":315,"line":957},37,[313,959,960],{"class":359},"          {{ s.name }}\n",[313,962,964,967,969],{"class":315,"line":963},38,[313,965,966],{"class":319},"        \u003C\u002F",[313,968,915],{"class":323},[313,970,346],{"class":319},[313,972,974,977,979],{"class":315,"line":973},39,[313,975,976],{"class":319},"      \u003C\u002F",[313,978,867],{"class":323},[313,980,346],{"class":319},[313,982,984,986,988],{"class":315,"line":983},40,[313,985,821],{"class":319},[313,987,833],{"class":323},[313,989,346],{"class":319},[313,991,993,996,998],{"class":315,"line":992},41,[313,994,995],{"class":319},"  \u003C\u002F",[313,997,773],{"class":323},[313,999,346],{"class":319},[313,1001,1003,1005,1007],{"class":315,"line":1002},42,[313,1004,745],{"class":319},[313,1006,762],{"class":323},[313,1008,346],{"class":319},[313,1010,1012],{"class":315,"line":1011},43,[313,1013,382],{"emptyLinePlaceholder":381},[313,1015,1017,1019,1022,1025],{"class":315,"line":1016},44,[313,1018,320],{"class":319},[313,1020,1021],{"class":323},"style",[313,1023,1024],{"class":327}," scoped",[313,1026,346],{"class":319},[313,1028,1030,1032,1034,1036,1040,1042,1046,1049,1052,1054,1057,1059,1062,1064],{"class":315,"line":1029},45,[313,1031,506],{"class":319},[313,1033,783],{"class":391},[313,1035,356],{"class":319},[313,1037,1039],{"class":1038},"sqsOY"," padding",[313,1041,404],{"class":319},[313,1043,1045],{"class":1044},"sbssI"," 16px",[313,1047,1048],{"class":319},";",[313,1050,1051],{"class":1038}," font-family",[313,1053,404],{"class":319},[313,1055,1056],{"class":359}," system-ui",[313,1058,428],{"class":319},[313,1060,1061],{"class":359}," sans-serif",[313,1063,1048],{"class":319},[313,1065,683],{"class":319},[313,1067,1069,1071,1073,1075,1078,1080,1083,1085,1088,1090,1093,1095,1098,1100,1103,1106,1109,1111,1114,1116,1118,1120,1123,1125,1128,1130,1133,1135],{"class":315,"line":1068},46,[313,1070,506],{"class":319},[313,1072,854],{"class":391},[313,1074,356],{"class":319},[313,1076,1077],{"class":1038}," display",[313,1079,404],{"class":319},[313,1081,1082],{"class":359}," grid",[313,1084,1048],{"class":319},[313,1086,1087],{"class":1038}," grid-template-columns",[313,1089,404],{"class":319},[313,1091,1092],{"class":457}," repeat",[313,1094,461],{"class":319},[313,1096,1097],{"class":1044},"5",[313,1099,428],{"class":319},[313,1101,1102],{"class":1044}," 1fr",[313,1104,1105],{"class":319},");",[313,1107,1108],{"class":1038}," gap",[313,1110,404],{"class":319},[313,1112,1113],{"class":1044}," 8px",[313,1115,1048],{"class":319},[313,1117,1039],{"class":1038},[313,1119,404],{"class":319},[313,1121,1122],{"class":1044}," 0",[313,1124,1048],{"class":319},[313,1126,1127],{"class":1038}," list-style",[313,1129,404],{"class":319},[313,1131,1132],{"class":359}," none",[313,1134,1048],{"class":319},[313,1136,683],{"class":319},[313,1138,1140,1142,1144,1147,1149,1152,1154,1157,1159,1162,1164,1167,1169,1172,1174,1176,1178,1181,1183,1185,1187,1190,1192,1195,1197],{"class":315,"line":1139},47,[313,1141,506],{"class":319},[313,1143,854],{"class":391},[313,1145,1146],{"class":391}," button",[313,1148,356],{"class":319},[313,1150,1151],{"class":1038}," width",[313,1153,404],{"class":319},[313,1155,1156],{"class":1044}," 100%",[313,1158,1048],{"class":319},[313,1160,1161],{"class":1038}," aspect-ratio",[313,1163,404],{"class":319},[313,1165,1166],{"class":1044}," 1",[313,1168,1048],{"class":319},[313,1170,1171],{"class":1038}," border-radius",[313,1173,404],{"class":319},[313,1175,1113],{"class":1044},[313,1177,1048],{"class":319},[313,1179,1180],{"class":1038}," border",[313,1182,404],{"class":319},[313,1184,1122],{"class":1044},[313,1186,1048],{"class":319},[313,1188,1189],{"class":1038}," cursor",[313,1191,404],{"class":319},[313,1193,1194],{"class":359}," pointer",[313,1196,1048],{"class":319},[313,1198,683],{"class":319},[313,1200,1202,1204,1206],{"class":315,"line":1201},48,[313,1203,745],{"class":319},[313,1205,1021],{"class":323},[313,1207,346],{"class":319},[298,1209,1210],{},"That's it. The toolkit:",[1212,1213,1214,1229,1243,1255],"ol",{},[867,1215,1216,1217,1219,1220,1224,1225,1228],{},"Detects ",[310,1218,458],{}," and ",[1221,1222,1223],"strong",{},"registers an MCP tool"," named ",[310,1226,1227],{},"color-picker"," (from the filename).",[867,1230,1231,1232,1235,1236,1239,1240,506],{},"Generates a ",[1221,1233,1234],{},"UI resource"," at ",[310,1237,1238],{},"ui:\u002F\u002Fmcp-app\u002Fcolor-picker"," exposing ",[310,1241,1242],{},"text\u002Fhtml;profile=mcp-app",[867,1244,1245,1246,506],{},"Bundles the SFC + assets into a single HTML file with ",[1247,1248,1252],"a",{"href":1249,"rel":1250},"https:\u002F\u002Fgithub.com\u002Frichardtallent\u002Fvite-plugin-singlefile",[1251],"nofollow",[310,1253,1254],{},"vite-plugin-singlefile",[867,1256,1257,1258,1261,1262,1265,1266,506],{},"Wires the ",[310,1259,1260],{},"handler","'s ",[310,1263,1264],{},"structuredContent"," into the iframe so the UI hydrates ",[1221,1267,1268],{},"without a second round-trip",[293,1270,1272],{"id":1271},"file-convention","File Convention",[298,1274,1275,1276,1281,1282,1285,1286,1289,1290,1293,1294,1296],{},"MCP Apps live in ",[1221,1277,1278],{},[310,1279,1280],{},"app\u002Fmcp\u002F"," by default (not ",[310,1283,1284],{},"server\u002Fmcp\u002F","). Change the app-side directory with ",[310,1287,1288],{},"mcp.appsDir"," in ",[310,1291,1292],{},"nuxt.config.ts",". They sit on the client side of Nuxt because they author Vue components — but the ",[310,1295,1260],{}," you declare runs server-side, just like a tool.",[302,1298,1302],{"className":1299,"code":1300,"language":1301,"meta":308,"style":308},"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",[310,1303,1304,1309,1317,1329,1337],{"__ignoreMap":308},[313,1305,1306],{"class":315,"line":316},[313,1307,1308],{"class":391},"app\u002F\n",[313,1310,1311,1314],{"class":315,"line":349},[313,1312,1313],{"class":391},"└──",[313,1315,1316],{"class":340}," mcp\u002F\n",[313,1318,1319,1322,1325],{"class":315,"line":378},[313,1320,1321],{"class":391},"    ├──",[313,1323,1324],{"class":340}," color-picker.vue",[313,1326,1328],{"class":1327},"sHwdD","    # → tool: color-picker, resource: ui:\u002F\u002Fmcp-app\u002Fcolor-picker\n",[313,1330,1331,1334],{"class":315,"line":385},[313,1332,1333],{"class":391},"    └──",[313,1335,1336],{"class":340}," admin\u002F\n",[313,1338,1339,1342,1345],{"class":315,"line":398},[313,1340,1341],{"class":391},"        └──",[313,1343,1344],{"class":340}," audit-log.vue",[313,1346,1347],{"class":1327},"   # → tool: audit-log\n",[1349,1350,1353,1354,1357,1358,1361,1362,1365],"callout",{"color":1351,"icon":1352},"info","i-lucide-info","Co-locate helpers next to the SFC (e.g. ",[310,1355,1356],{},"format.ts",") — the bundler inlines them. Keep data generation in ",[310,1359,1360],{},"server\u002Fapi\u002F"," and call it via ",[310,1363,1364],{},"$fetch"," from the handler.",[1367,1368,1370],"h3",{"id":1369},"auto-generated-name-title","Auto-Generated Name & Title",[298,1372,1373,1374,1219,1377,1380],{},"Like tools and resources, ",[310,1375,1376],{},"name",[310,1378,1379],{},"title"," are inferred from the filename:",[1382,1383,1384,1400],"table",{},[1385,1386,1387],"thead",{},[1388,1389,1390,1394,1397],"tr",{},[1391,1392,1393],"th",{},"File",[1391,1395,1396],{},"Name",[1391,1398,1399],{},"Title",[1401,1402,1403,1420,1437],"tbody",{},[1388,1404,1405,1411,1415],{},[1406,1407,1408],"td",{},[310,1409,1410],{},"color-picker.vue",[1406,1412,1413],{},[310,1414,1227],{},[1406,1416,1417],{},[310,1418,1419],{},"Color Picker",[1388,1421,1422,1427,1432],{},[1406,1423,1424],{},[310,1425,1426],{},"weather-card.vue",[1406,1428,1429],{},[310,1430,1431],{},"weather-card",[1406,1433,1434],{},[310,1435,1436],{},"Weather Card",[1388,1438,1439,1444,1449],{},[1406,1440,1441],{},[310,1442,1443],{},"admin\u002Faudit-log.vue",[1406,1445,1446],{},[310,1447,1448],{},"audit-log",[1406,1450,1451],{},[310,1452,1453],{},"Audit Log",[298,1455,1456,1457,1459,1460,1462,1463,506],{},"Override either by passing ",[310,1458,1376],{}," \u002F ",[310,1461,1379],{}," to ",[310,1464,458],{},[1367,1466,1468],{"id":1467},"routing-apps-to-a-specific-handler","Routing Apps to a Specific Handler",[298,1470,1471,1472,1475,1476,1479],{},"By default, every app is attached to the implicit ",[310,1473,1474],{},"apps"," handler and only surfaces on ",[310,1477,1478],{},"\u002Fmcp\u002Fapps",". Two ways to route an app to a different named handler:",[298,1481,1482,1485,1486,1488],{},[1221,1483,1484],{},"1. Sub-folder convention"," — the first sub-directory under ",[310,1487,1280],{}," becomes the handler attribution:",[302,1490,1492],{"className":1299,"code":1491,"language":1301,"meta":308,"style":308},"app\u002F\n└── mcp\u002F\n    ├── color-picker.vue          # → \u002Fmcp\u002Fapps (default)\n    ├── finder\u002F\n    │   └── stay-finder.vue       # → \u002Fmcp\u002Ffinder\n    └── checkout\u002F\n        └── stay-checkout.vue     # → \u002Fmcp\u002Fcheckout\n",[310,1493,1494,1498,1504,1513,1520,1534,1541],{"__ignoreMap":308},[313,1495,1496],{"class":315,"line":316},[313,1497,1308],{"class":391},[313,1499,1500,1502],{"class":315,"line":349},[313,1501,1313],{"class":391},[313,1503,1316],{"class":340},[313,1505,1506,1508,1510],{"class":315,"line":378},[313,1507,1321],{"class":391},[313,1509,1324],{"class":340},[313,1511,1512],{"class":1327},"          # → \u002Fmcp\u002Fapps (default)\n",[313,1514,1515,1517],{"class":315,"line":385},[313,1516,1321],{"class":391},[313,1518,1519],{"class":340}," finder\u002F\n",[313,1521,1522,1525,1528,1531],{"class":315,"line":398},[313,1523,1524],{"class":391},"    │",[313,1526,1527],{"class":340},"   └──",[313,1529,1530],{"class":340}," stay-finder.vue",[313,1532,1533],{"class":1327},"       # → \u002Fmcp\u002Ffinder\n",[313,1535,1536,1538],{"class":315,"line":410},[313,1537,1333],{"class":391},[313,1539,1540],{"class":340}," checkout\u002F\n",[313,1542,1543,1545,1548],{"class":315,"line":443},[313,1544,1341],{"class":391},[313,1546,1547],{"class":340}," stay-checkout.vue",[313,1549,1550],{"class":1327},"     # → \u002Fmcp\u002Fcheckout\n",[298,1552,1553,1554,404],{},"Pair each handler folder with ",[310,1555,1556],{},"server\u002Fmcp\u002Fhandlers\u002F\u003Cname>\u002Findex.ts",[302,1558,1562],{"className":1559,"code":1560,"filename":1561,"language":341,"meta":308,"style":308},"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",[310,1563,1564,1584,1588],{"__ignoreMap":308},[313,1565,1566,1568,1570,1573,1575,1577,1579,1582],{"class":315,"line":316},[313,1567,353],{"class":352},[313,1569,356],{"class":319},[313,1571,1572],{"class":359}," defineMcpHandler",[313,1574,363],{"class":319},[313,1576,366],{"class":352},[313,1578,369],{"class":319},[313,1580,1581],{"class":340},"@nuxtjs\u002Fmcp-toolkit\u002Fserver",[313,1583,375],{"class":319},[313,1585,1586],{"class":315,"line":349},[313,1587,382],{"emptyLinePlaceholder":381},[313,1589,1590,1593,1596,1598,1600,1603],{"class":315,"line":378},[313,1591,1592],{"class":352},"export",[313,1594,1595],{"class":352}," default",[313,1597,1572],{"class":457},[313,1599,461],{"class":359},[313,1601,1602],{"class":319},"{}",[313,1604,658],{"class":359},[298,1606,1607,1614],{},[1221,1608,1609,1610,1613],{},"2. Explicit ",[310,1611,1612],{},"attachTo"," override"," — overrides the sub-folder default if both are present:",[302,1616,1619],{"className":304,"code":1617,"filename":1618,"language":307,"meta":308,"style":308},"\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",[310,1620,1621,1641,1649,1665,1681,1703,1708,1714],{"__ignoreMap":308},[313,1622,1623,1625,1627,1629,1631,1633,1635,1637,1639],{"class":315,"line":316},[313,1624,320],{"class":319},[313,1626,324],{"class":323},[313,1628,328],{"class":327},[313,1630,331],{"class":327},[313,1632,334],{"class":319},[313,1634,337],{"class":319},[313,1636,341],{"class":340},[313,1638,337],{"class":319},[313,1640,346],{"class":319},[313,1642,1643,1645,1647],{"class":315,"line":349},[313,1644,458],{"class":457},[313,1646,461],{"class":359},[313,1648,464],{"class":319},[313,1650,1651,1654,1656,1658,1661,1663],{"class":315,"line":378},[313,1652,1653],{"class":323},"  attachTo",[313,1655,404],{"class":319},[313,1657,369],{"class":319},[313,1659,1660],{"class":340},"finder",[313,1662,480],{"class":319},[313,1664,483],{"class":319},[313,1666,1667,1670,1672,1674,1677,1679],{"class":315,"line":385},[313,1668,1669],{"class":323},"  group",[313,1671,404],{"class":319},[313,1673,369],{"class":319},[313,1675,1676],{"class":340},"stays",[313,1678,480],{"class":319},[313,1680,483],{"class":319},[313,1682,1683,1686,1688,1691,1693,1696,1698,1701],{"class":315,"line":398},[313,1684,1685],{"class":323},"  tags",[313,1687,404],{"class":319},[313,1689,1690],{"class":359}," [",[313,1692,480],{"class":319},[313,1694,1695],{"class":340},"searchable",[313,1697,480],{"class":319},[313,1699,1700],{"class":359},"]",[313,1702,483],{"class":319},[313,1704,1705],{"class":315,"line":410},[313,1706,1707],{"class":1327},"  \u002F\u002F ...\n",[313,1709,1710,1712],{"class":315,"line":443},[313,1711,694],{"class":319},[313,1713,658],{"class":359},[313,1715,1716,1718,1720],{"class":315,"line":449},[313,1717,745],{"class":319},[313,1719,324],{"class":323},[313,1721,346],{"class":319},[298,1723,1724,1725,1728,1729,1732,1733,1736,1737,1740,1741,1744],{},"The generated tool and resource carry ",[310,1726,1727],{},"_meta.handler = 'finder'",", top-level ",[310,1730,1731],{},"group = 'stays'",", and ",[310,1734,1735],{},"tags = ['searchable']",". Filter on them with ",[310,1738,1739],{},"getMcpTools({ handler: 'finder' })",", ",[310,1742,1743],{},"getMcpTools({ tags: ['searchable'] })",", etc.",[293,1746,1748],{"id":1747},"definemcpapp",[310,1749,458],{},[298,1751,1752,1753,1756,1757,1760],{},"A macro — like ",[310,1754,1755],{},"definePageMeta"," — extracted at build time and ",[1221,1758,1759],{},"stripped from the browser bundle",". The fields it accepts:",[302,1762,1764],{"className":1559,"code":1763,"language":341,"meta":308,"style":308},"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  attachTo?: string                      \u002F\u002F Named MCP handler this app routes to (default: 'apps' or sub-folder)\n  group?: string                         \u002F\u002F Top-level group label (default: same as attachTo)\n  tags?: string[]                        \u002F\u002F Top-level tags forwarded to the generated tool\n  _meta?: Record\u003Cstring, unknown>        \u002F\u002F Extra _meta fields surfaced to the host\n})\n",[310,1765,1766,1774,1787,1801,1813,1825,1852,1872,1884,1895,1907,1929],{"__ignoreMap":308},[313,1767,1768,1770,1772],{"class":315,"line":316},[313,1769,458],{"class":457},[313,1771,461],{"class":359},[313,1773,464],{"class":319},[313,1775,1776,1779,1781,1784],{"class":315,"line":349},[313,1777,1778],{"class":359},"  name?",[313,1780,404],{"class":319},[313,1782,1783],{"class":359}," string                          ",[313,1785,1786],{"class":1327},"\u002F\u002F Override auto-derived name\n",[313,1788,1789,1792,1795,1798],{"class":315,"line":378},[313,1790,1791],{"class":359},"  title",[313,1793,1794],{"class":319},"?:",[313,1796,1797],{"class":359}," string                         ",[313,1799,1800],{"class":1327},"\u002F\u002F Override auto-derived title\n",[313,1802,1803,1805,1807,1810],{"class":315,"line":385},[313,1804,470],{"class":359},[313,1806,1794],{"class":319},[313,1808,1809],{"class":359}," string                   ",[313,1811,1812],{"class":1327},"\u002F\u002F Shown to the LLM to help it pick this app\n",[313,1814,1815,1817,1819,1822],{"class":315,"line":398},[313,1816,489],{"class":359},[313,1818,1794],{"class":319},[313,1820,1821],{"class":359}," ZodRawShape              ",[313,1823,1824],{"class":1327},"\u002F\u002F Validates tool input on the server\n",[313,1826,1827,1829,1831,1834,1837,1839,1842,1844,1846,1849],{"class":315,"line":410},[313,1828,543],{"class":359},[313,1830,1794],{"class":319},[313,1832,1833],{"class":319}," (",[313,1835,1836],{"class":554},"args",[313,1838,428],{"class":319},[313,1840,1841],{"class":554}," extra",[313,1843,529],{"class":319},[313,1845,577],{"class":327},[313,1847,1848],{"class":359}," Result      ",[313,1850,1851],{"class":1327},"\u002F\u002F Runs server-side; defaults to (args) => ({ structuredContent: args })\n",[313,1853,1854,1857,1859,1862,1865,1869],{"class":315,"line":443},[313,1855,1856],{"class":359},"  csp",[313,1858,1794],{"class":319},[313,1860,1861],{"class":359}," McpAppCsp ",[313,1863,1864],{"class":319},"|",[313,1866,1868],{"class":1867},"sfNiH"," false",[313,1870,1871],{"class":1327},"                \u002F\u002F Tighten or disable iframe CSP\n",[313,1873,1874,1876,1878,1881],{"class":315,"line":449},[313,1875,1653],{"class":359},[313,1877,1794],{"class":319},[313,1879,1880],{"class":359}," string                      ",[313,1882,1883],{"class":1327},"\u002F\u002F Named MCP handler this app routes to (default: 'apps' or sub-folder)\n",[313,1885,1886,1888,1890,1892],{"class":315,"line":454},[313,1887,1669],{"class":359},[313,1889,1794],{"class":319},[313,1891,1797],{"class":359},[313,1893,1894],{"class":1327},"\u002F\u002F Top-level group label (default: same as attachTo)\n",[313,1896,1897,1899,1901,1904],{"class":315,"line":467},[313,1898,1685],{"class":359},[313,1900,1794],{"class":319},[313,1902,1903],{"class":359}," string[]                        ",[313,1905,1906],{"class":1327},"\u002F\u002F Top-level tags forwarded to the generated tool\n",[313,1908,1909,1912,1914,1917,1919,1921,1923,1926],{"class":315,"line":486},[313,1910,1911],{"class":359},"  _meta",[313,1913,1794],{"class":319},[313,1915,1916],{"class":359}," Record",[313,1918,320],{"class":319},[313,1920,509],{"class":359},[313,1922,428],{"class":319},[313,1924,1925],{"class":359}," unknown>        ",[313,1927,1928],{"class":1327},"\u002F\u002F Extra _meta fields surfaced to the host\n",[313,1930,1931,1933],{"class":315,"line":496},[313,1932,694],{"class":319},[313,1934,658],{"class":359},[1349,1936,1937,1740,1939,1732,1942,1945,1946,1833,1949,1740,1952,1955,1956,1959],{"color":1351,"icon":1352},[310,1938,1612],{},[310,1940,1941],{},"group",[310,1943,1944],{},"tags"," must be ",[1221,1947,1948],{},"literals",[310,1950,1951],{},"'finder'",[310,1953,1954],{},"['a', 'b']",") — the toolkit reads them statically at build time to route the generated tool and resource. A dynamic expression (",[310,1957,1958],{},"attachTo: someVar",") fails the build with a clear error.",[1367,1961,1963],{"id":1962},"server-handler","Server Handler",[298,1965,1966,1967,1969,1970,1972,1973,1976,1977,404],{},"The ",[310,1968,1260],{}," runs in your Nitro server, not in the iframe. It receives validated input and returns ",[310,1971,1264],{}," that the UI hydrates from. ",[1221,1974,1975],{},"Treat it like a tool handler"," — call APIs, query a database, hit ",[310,1978,1364],{},[302,1980,1982],{"className":1559,"code":1981,"language":341,"meta":308,"style":308},"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",[310,1983,1984,1992,2006,2014,2044,2048,2067,2106,2128,2132],{"__ignoreMap":308},[313,1985,1986,1988,1990],{"class":315,"line":316},[313,1987,458],{"class":457},[313,1989,461],{"class":359},[313,1991,464],{"class":319},[313,1993,1994,1996,1998,2000,2002,2004],{"class":315,"line":349},[313,1995,470],{"class":323},[313,1997,404],{"class":319},[313,1999,369],{"class":319},[313,2001,477],{"class":340},[313,2003,480],{"class":319},[313,2005,483],{"class":319},[313,2007,2008,2010,2012],{"class":315,"line":378},[313,2009,489],{"class":323},[313,2011,404],{"class":319},[313,2013,395],{"class":319},[313,2015,2016,2018,2020,2022,2024,2026,2028,2030,2032,2034,2036,2038,2040,2042],{"class":315,"line":385},[313,2017,499],{"class":323},[313,2019,404],{"class":319},[313,2021,360],{"class":359},[313,2023,506],{"class":319},[313,2025,509],{"class":457},[313,2027,512],{"class":359},[313,2029,506],{"class":319},[313,2031,517],{"class":457},[313,2033,461],{"class":359},[313,2035,480],{"class":319},[313,2037,524],{"class":340},[313,2039,480],{"class":319},[313,2041,529],{"class":359},[313,2043,483],{"class":319},[313,2045,2046],{"class":315,"line":398},[313,2047,537],{"class":319},[313,2049,2050,2052,2054,2056,2058,2060,2063,2065],{"class":315,"line":410},[313,2051,543],{"class":457},[313,2053,404],{"class":319},[313,2055,548],{"class":327},[313,2057,551],{"class":319},[313,2059,555],{"class":554},[313,2061,2062],{"class":319}," })",[313,2064,577],{"class":327},[313,2066,395],{"class":319},[313,2068,2069,2071,2073,2075,2077,2079,2081,2083,2085,2087,2089,2091,2094,2096,2098,2100,2102,2104],{"class":315,"line":443},[313,2070,585],{"class":327},[313,2072,588],{"class":359},[313,2074,591],{"class":319},[313,2076,594],{"class":352},[313,2078,597],{"class":457},[313,2080,461],{"class":323},[313,2082,480],{"class":319},[313,2084,628],{"class":340},[313,2086,480],{"class":319},[313,2088,428],{"class":319},[313,2090,356],{"class":319},[313,2092,2093],{"class":323}," query",[313,2095,404],{"class":319},[313,2097,356],{"class":319},[313,2099,555],{"class":359},[313,2101,363],{"class":319},[313,2103,363],{"class":319},[313,2105,658],{"class":323},[313,2107,2108,2110,2112,2114,2116,2118,2120,2122,2124,2126],{"class":315,"line":449},[313,2109,664],{"class":352},[313,2111,356],{"class":319},[313,2113,567],{"class":323},[313,2115,404],{"class":319},[313,2117,356],{"class":319},[313,2119,555],{"class":359},[313,2121,428],{"class":319},[313,2123,588],{"class":359},[313,2125,363],{"class":319},[313,2127,683],{"class":319},[313,2129,2130],{"class":315,"line":454},[313,2131,537],{"class":319},[313,2133,2134,2136],{"class":315,"line":467},[313,2135,694],{"class":319},[313,2137,658],{"class":359},[1349,2139,2142,2143,2145,2146,2149,2150,2153],{"color":2140,"icon":2141},"primary","i-lucide-zap","Returning ",[310,2144,1264],{}," from the handler ",[1221,2147,2148],{},"inlines the data into the HTML"," as a ",[310,2151,2152],{},"\u003Cscript type=\"application\u002Fjson\">",". The iframe boots with full data already present — no extra fetch, no flicker.",[298,2155,2156,2157,2159,2160,2163],{},"If you omit ",[310,2158,1260],{},", the toolkit defaults to ",[310,2161,2162],{},"(args) => ({ structuredContent: args })",". Useful for stateless apps that only need the input echoed back.",[1367,2165,2167],{"id":2166},"sharing-types-between-server-ui","Sharing Types Between Server & UI",[298,2169,2170,2171,2174,2175,2178,2179,2181],{},"Place shared types in Nuxt's ",[310,2172,2173],{},"shared\u002Ftypes\u002F"," directory — they're ",[1221,2176,2177],{},"auto-imported globally"," in both the SFC and your API endpoints, no ",[310,2180,353],{}," statement required:",[302,2183,2186],{"className":1559,"code":2184,"filename":2185,"language":341,"meta":308,"style":308},"export interface Swatch { name: string, hex: string }\nexport interface PalettePayload { base: string, swatches: Swatch[] }\n","shared\u002Ftypes\u002Fpalette.ts",[310,2187,2188,2216],{"__ignoreMap":308},[313,2189,2190,2192,2195,2198,2200,2202,2204,2206,2208,2210,2212,2214],{"class":315,"line":316},[313,2191,1592],{"class":352},[313,2193,2194],{"class":327}," interface",[313,2196,2197],{"class":391}," Swatch",[313,2199,356],{"class":319},[313,2201,420],{"class":323},[313,2203,404],{"class":319},[313,2205,425],{"class":391},[313,2207,428],{"class":319},[313,2209,431],{"class":323},[313,2211,404],{"class":319},[313,2213,425],{"class":391},[313,2215,683],{"class":319},[313,2217,2218,2220,2222,2224,2226,2228,2230,2232,2234,2236,2238,2240,2243],{"class":315,"line":349},[313,2219,1592],{"class":352},[313,2221,2194],{"class":327},[313,2223,392],{"class":391},[313,2225,356],{"class":319},[313,2227,555],{"class":323},[313,2229,404],{"class":319},[313,2231,425],{"class":391},[313,2233,428],{"class":319},[313,2235,588],{"class":323},[313,2237,404],{"class":319},[313,2239,2197],{"class":391},[313,2241,2242],{"class":359},"[] ",[313,2244,446],{"class":319},[302,2246,2249],{"className":1559,"code":2247,"filename":2248,"language":341,"meta":308,"style":308},"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",[310,2250,2251,2285,2307,2351],{"__ignoreMap":308},[313,2252,2253,2255,2257,2260,2262,2265,2267,2270,2273,2275,2277,2279,2281,2283],{"class":315,"line":316},[313,2254,1592],{"class":352},[313,2256,1595],{"class":352},[313,2258,2259],{"class":457}," defineEventHandler",[313,2261,461],{"class":359},[313,2263,2264],{"class":327},"async",[313,2266,1833],{"class":319},[313,2268,2269],{"class":554},"event",[313,2271,2272],{"class":319},"):",[313,2274,561],{"class":391},[313,2276,320],{"class":319},[313,2278,734],{"class":391},[313,2280,621],{"class":319},[313,2282,577],{"class":327},[313,2284,395],{"class":319},[313,2286,2287,2290,2292,2294,2296,2298,2301,2303,2305],{"class":315,"line":349},[313,2288,2289],{"class":327},"  const",[313,2291,356],{"class":319},[313,2293,555],{"class":359},[313,2295,363],{"class":319},[313,2297,591],{"class":319},[313,2299,2300],{"class":457}," getQuery",[313,2302,461],{"class":323},[313,2304,2269],{"class":359},[313,2306,658],{"class":323},[313,2308,2309,2312,2314,2316,2318,2321,2323,2326,2328,2330,2332,2334,2337,2339,2342,2344,2346,2349],{"class":315,"line":378},[313,2310,2311],{"class":352},"  return",[313,2313,356],{"class":319},[313,2315,555],{"class":323},[313,2317,404],{"class":319},[313,2319,2320],{"class":457}," String",[313,2322,461],{"class":323},[313,2324,2325],{"class":359},"base",[313,2327,529],{"class":323},[313,2329,428],{"class":319},[313,2331,588],{"class":323},[313,2333,404],{"class":319},[313,2335,2336],{"class":457}," buildPalette",[313,2338,461],{"class":323},[313,2340,2341],{"class":457},"String",[313,2343,461],{"class":323},[313,2345,2325],{"class":359},[313,2347,2348],{"class":323},")) ",[313,2350,446],{"class":319},[313,2352,2353,2355],{"class":315,"line":385},[313,2354,694],{"class":319},[313,2356,658],{"class":359},[302,2358,2360],{"className":304,"code":2359,"filename":306,"language":307,"meta":308,"style":308},"\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",[310,2361,2362,2382,2390,2414,2446,2486,2495,2501,2505,2528],{"__ignoreMap":308},[313,2363,2364,2366,2368,2370,2372,2374,2376,2378,2380],{"class":315,"line":316},[313,2365,320],{"class":319},[313,2367,324],{"class":323},[313,2369,328],{"class":327},[313,2371,331],{"class":327},[313,2373,334],{"class":319},[313,2375,337],{"class":319},[313,2377,341],{"class":340},[313,2379,337],{"class":319},[313,2381,346],{"class":319},[313,2383,2384,2386,2388],{"class":315,"line":349},[313,2385,458],{"class":457},[313,2387,461],{"class":359},[313,2389,464],{"class":319},[313,2391,2392,2394,2396,2398,2400,2402,2404,2406,2408,2411],{"class":315,"line":378},[313,2393,489],{"class":323},[313,2395,404],{"class":319},[313,2397,356],{"class":319},[313,2399,555],{"class":323},[313,2401,404],{"class":319},[313,2403,360],{"class":359},[313,2405,506],{"class":319},[313,2407,509],{"class":457},[313,2409,2410],{"class":359},"() ",[313,2412,2413],{"class":319},"},\n",[313,2415,2416,2418,2420,2422,2424,2426,2428,2430,2432,2434,2436,2438,2440,2442,2444],{"class":315,"line":385},[313,2417,543],{"class":457},[313,2419,404],{"class":319},[313,2421,548],{"class":327},[313,2423,551],{"class":319},[313,2425,555],{"class":554},[313,2427,558],{"class":319},[313,2429,561],{"class":391},[313,2431,564],{"class":319},[313,2433,567],{"class":323},[313,2435,404],{"class":319},[313,2437,392],{"class":391},[313,2439,574],{"class":319},[313,2441,577],{"class":327},[313,2443,1833],{"class":359},[313,2445,464],{"class":319},[313,2447,2448,2451,2453,2455,2457,2459,2461,2463,2465,2467,2469,2471,2473,2475,2478,2480,2482,2484],{"class":315,"line":398},[313,2449,2450],{"class":323},"    structuredContent",[313,2452,404],{"class":319},[313,2454,594],{"class":352},[313,2456,597],{"class":457},[313,2458,461],{"class":359},[313,2460,480],{"class":319},[313,2462,628],{"class":340},[313,2464,480],{"class":319},[313,2466,428],{"class":319},[313,2468,356],{"class":319},[313,2470,2093],{"class":323},[313,2472,404],{"class":319},[313,2474,356],{"class":319},[313,2476,2477],{"class":359}," base ",[313,2479,694],{"class":319},[313,2481,363],{"class":319},[313,2483,529],{"class":359},[313,2485,483],{"class":319},[313,2487,2488,2491,2493],{"class":315,"line":410},[313,2489,2490],{"class":319},"  }",[313,2492,529],{"class":359},[313,2494,483],{"class":319},[313,2496,2497,2499],{"class":315,"line":443},[313,2498,694],{"class":319},[313,2500,658],{"class":359},[313,2502,2503],{"class":315,"line":449},[313,2504,382],{"emptyLinePlaceholder":381},[313,2506,2507,2509,2511,2514,2516,2518,2520,2522,2524,2526],{"class":315,"line":454},[313,2508,707],{"class":327},[313,2510,356],{"class":319},[313,2512,2513],{"class":359}," data ",[313,2515,694],{"class":319},[313,2517,591],{"class":319},[313,2519,729],{"class":457},[313,2521,320],{"class":319},[313,2523,734],{"class":391},[313,2525,621],{"class":319},[313,2527,739],{"class":359},[313,2529,2530,2532,2534],{"class":315,"line":467},[313,2531,745],{"class":319},[313,2533,324],{"class":323},[313,2535,346],{"class":319},[298,2537,2538],{},"Type-only references are stripped from the browser bundle by esbuild — nothing has to resolve inside the iframe at runtime.",[1021,2540,2541],{},"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":308,"searchDepth":349,"depth":349,"links":2543},[2544,2545,2549],{"id":295,"depth":349,"text":296},{"id":1271,"depth":349,"text":1272,"children":2546},[2547,2548],{"id":1369,"depth":378,"text":1370},{"id":1467,"depth":378,"text":1468},{"id":1747,"depth":349,"text":458,"children":2550},[2551,2552],{"id":1962,"depth":378,"text":1963},{"id":2166,"depth":378,"text":2167},"SFC location, quick start, the defineMcpApp macro, server handler, and shared types.","md",null,{},{"icon":169},{"title":2559,"description":2560},"MCP Apps — Authoring","Quick start, file convention, defineMcpApp, and sharing types for MCP UI apps.","7eha_g3Jfe890ANbnrYmz19H9_g18LyaUUsMoZywHbU",[2563,2565],{"title":46,"path":162,"stem":163,"description":2564,"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":2566,"icon":174,"children":-1},"data, hostContext, sendPrompt, callTool, and openLink from inside the iframe.",1787670841911]