[{"data":1,"prerenderedAt":1474},["ShallowReactive",2],{"navigation_docs":3,"-tools-groups-organization":287,"-tools-groups-organization-surround":1469},[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":66,"body":289,"description":1460,"extension":1461,"links":1462,"meta":1463,"navigation":1464,"path":67,"seo":1465,"stem":68,"__hash__":1468},"docs\u002F2.tools\u002F4.groups-organization.md",{"type":290,"value":291,"toc":1444},"minimark",[292,297,302,306,662,666,689,693,701,885,889,892,900,906,910,920,1025,1028,1058,1062,1069,1075,1081,1085,1088,1199,1203,1210,1350,1363,1370,1377,1394,1402,1406,1440],[293,294,296],"h2",{"id":295},"advanced-examples","Advanced Examples",[298,299,301],"h3",{"id":300},"tool-with-api-integration","Tool with API Integration",[303,304,305],"p",{},"Here's an example showing a typical API-backed tool:",[307,308,314],"pre",{"className":309,"code":310,"filename":311,"language":312,"meta":313,"style":313},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { z } from 'zod'\nimport { createError } from 'h3'\nimport { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  name: 'get-weather',\n  description: 'Get current weather for a city',\n  inputSchema: {\n    city: z.string().describe('City name'),\n  },\n  handler: async ({ city }) => {\n    const data = await $fetch(`\u002Fapi\u002Fweather\u002F${city}`)\n    if (!data) throw createError({ statusCode: 404, message: `City \"${city}\" not found` })\n    return data\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fget-weather.ts","typescript","",[315,316,317,350,370,391,398,416,437,454,465,503,509,536,574,641,650,655],"code",{"__ignoreMap":313},[318,319,322,326,330,334,337,340,343,347],"span",{"class":320,"line":321},"line",1,[318,323,325],{"class":324},"s7zQu","import",[318,327,329],{"class":328},"sMK4o"," {",[318,331,333],{"class":332},"sTEyZ"," z",[318,335,336],{"class":328}," }",[318,338,339],{"class":324}," from",[318,341,342],{"class":328}," '",[318,344,346],{"class":345},"sfazB","zod",[318,348,349],{"class":328},"'\n",[318,351,353,355,357,360,362,364,366,368],{"class":320,"line":352},2,[318,354,325],{"class":324},[318,356,329],{"class":328},[318,358,359],{"class":332}," createError",[318,361,336],{"class":328},[318,363,339],{"class":324},[318,365,342],{"class":328},[318,367,298],{"class":345},[318,369,349],{"class":328},[318,371,373,375,377,380,382,384,386,389],{"class":320,"line":372},3,[318,374,325],{"class":324},[318,376,329],{"class":328},[318,378,379],{"class":332}," defineMcpTool",[318,381,336],{"class":328},[318,383,339],{"class":324},[318,385,342],{"class":328},[318,387,388],{"class":345},"@nuxtjs\u002Fmcp-toolkit\u002Fserver",[318,390,349],{"class":328},[318,392,394],{"class":320,"line":393},4,[318,395,397],{"emptyLinePlaceholder":396},true,"\n",[318,399,401,404,407,410,413],{"class":320,"line":400},5,[318,402,403],{"class":324},"export",[318,405,406],{"class":324}," default",[318,408,379],{"class":409},"s2Zo4",[318,411,412],{"class":332},"(",[318,414,415],{"class":328},"{\n",[318,417,419,423,426,428,431,434],{"class":320,"line":418},6,[318,420,422],{"class":421},"swJcz","  name",[318,424,425],{"class":328},":",[318,427,342],{"class":328},[318,429,430],{"class":345},"get-weather",[318,432,433],{"class":328},"'",[318,435,436],{"class":328},",\n",[318,438,440,443,445,447,450,452],{"class":320,"line":439},7,[318,441,442],{"class":421},"  description",[318,444,425],{"class":328},[318,446,342],{"class":328},[318,448,449],{"class":345},"Get current weather for a city",[318,451,433],{"class":328},[318,453,436],{"class":328},[318,455,457,460,462],{"class":320,"line":456},8,[318,458,459],{"class":421},"  inputSchema",[318,461,425],{"class":328},[318,463,464],{"class":328}," {\n",[318,466,468,471,473,475,478,481,484,486,489,491,493,496,498,501],{"class":320,"line":467},9,[318,469,470],{"class":421},"    city",[318,472,425],{"class":328},[318,474,333],{"class":332},[318,476,477],{"class":328},".",[318,479,480],{"class":409},"string",[318,482,483],{"class":332},"()",[318,485,477],{"class":328},[318,487,488],{"class":409},"describe",[318,490,412],{"class":332},[318,492,433],{"class":328},[318,494,495],{"class":345},"City name",[318,497,433],{"class":328},[318,499,500],{"class":332},")",[318,502,436],{"class":328},[318,504,506],{"class":320,"line":505},10,[318,507,508],{"class":328},"  },\n",[318,510,512,515,517,521,524,528,531,534],{"class":320,"line":511},11,[318,513,514],{"class":409},"  handler",[318,516,425],{"class":328},[318,518,520],{"class":519},"spNyl"," async",[318,522,523],{"class":328}," ({",[318,525,527],{"class":526},"sHdIc"," city",[318,529,530],{"class":328}," })",[318,532,533],{"class":519}," =>",[318,535,464],{"class":328},[318,537,539,542,545,548,551,554,556,559,562,565,568,571],{"class":320,"line":538},12,[318,540,541],{"class":519},"    const",[318,543,544],{"class":332}," data",[318,546,547],{"class":328}," =",[318,549,550],{"class":324}," await",[318,552,553],{"class":409}," $fetch",[318,555,412],{"class":421},[318,557,558],{"class":328},"`",[318,560,561],{"class":345},"\u002Fapi\u002Fweather\u002F",[318,563,564],{"class":328},"${",[318,566,567],{"class":332},"city",[318,569,570],{"class":328},"}`",[318,572,573],{"class":421},")\n",[318,575,577,580,583,586,589,592,595,597,599,602,605,607,611,614,617,619,622,625,627,629,632,635,637,639],{"class":320,"line":576},13,[318,578,579],{"class":324},"    if",[318,581,582],{"class":421}," (",[318,584,585],{"class":328},"!",[318,587,588],{"class":332},"data",[318,590,591],{"class":421},") ",[318,593,594],{"class":324},"throw",[318,596,359],{"class":409},[318,598,412],{"class":421},[318,600,601],{"class":328},"{",[318,603,604],{"class":421}," statusCode",[318,606,425],{"class":328},[318,608,610],{"class":609},"sbssI"," 404",[318,612,613],{"class":328},",",[318,615,616],{"class":421}," message",[318,618,425],{"class":328},[318,620,621],{"class":328}," `",[318,623,624],{"class":345},"City \"",[318,626,564],{"class":328},[318,628,567],{"class":332},[318,630,631],{"class":328},"}",[318,633,634],{"class":345},"\" not found",[318,636,558],{"class":328},[318,638,336],{"class":328},[318,640,573],{"class":421},[318,642,644,647],{"class":320,"line":643},14,[318,645,646],{"class":324},"    return",[318,648,649],{"class":332}," data\n",[318,651,653],{"class":320,"line":652},15,[318,654,508],{"class":328},[318,656,658,660],{"class":320,"line":657},16,[318,659,631],{"class":328},[318,661,573],{"class":332},[293,663,665],{"id":664},"groups-and-tags","Groups and Tags",[303,667,668,669,672,673,676,677,680,681,688],{},"Organize your tools with ",[315,670,671],{},"group"," and ",[315,674,675],{},"tags"," for filtering and progressive discovery. Groups and tags are exposed in ",[315,678,679],{},"_meta"," and will map to ",[682,683,687],"a",{"href":684,"rel":685},"https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fmodelcontextprotocol\u002Fissues\u002F1300",[686],"nofollow","SEP-1300"," when adopted.",[298,690,692],{"id":691},"explicit-group-and-tags","Explicit Group and Tags",[303,694,695,696,672,698,700],{},"Set ",[315,697,671],{},[315,699,675],{}," directly on the definition:",[307,702,705],{"className":309,"code":703,"filename":704,"language":312,"meta":313,"style":313},"import { z } from 'zod'\nimport { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  group: 'admin',\n  tags: ['destructive', 'user-management'],\n  description: 'Delete a user account',\n  inputSchema: {\n    userId: z.string(),\n  },\n  handler: async ({ userId }) => {\n    \u002F\u002F ...\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fdelete-user.ts",[315,706,707,725,743,747,759,775,806,821,829,846,850,869,875,879],{"__ignoreMap":313},[318,708,709,711,713,715,717,719,721,723],{"class":320,"line":321},[318,710,325],{"class":324},[318,712,329],{"class":328},[318,714,333],{"class":332},[318,716,336],{"class":328},[318,718,339],{"class":324},[318,720,342],{"class":328},[318,722,346],{"class":345},[318,724,349],{"class":328},[318,726,727,729,731,733,735,737,739,741],{"class":320,"line":352},[318,728,325],{"class":324},[318,730,329],{"class":328},[318,732,379],{"class":332},[318,734,336],{"class":328},[318,736,339],{"class":324},[318,738,342],{"class":328},[318,740,388],{"class":345},[318,742,349],{"class":328},[318,744,745],{"class":320,"line":372},[318,746,397],{"emptyLinePlaceholder":396},[318,748,749,751,753,755,757],{"class":320,"line":393},[318,750,403],{"class":324},[318,752,406],{"class":324},[318,754,379],{"class":409},[318,756,412],{"class":332},[318,758,415],{"class":328},[318,760,761,764,766,768,771,773],{"class":320,"line":400},[318,762,763],{"class":421},"  group",[318,765,425],{"class":328},[318,767,342],{"class":328},[318,769,770],{"class":345},"admin",[318,772,433],{"class":328},[318,774,436],{"class":328},[318,776,777,780,782,785,787,790,792,794,796,799,801,804],{"class":320,"line":418},[318,778,779],{"class":421},"  tags",[318,781,425],{"class":328},[318,783,784],{"class":332}," [",[318,786,433],{"class":328},[318,788,789],{"class":345},"destructive",[318,791,433],{"class":328},[318,793,613],{"class":328},[318,795,342],{"class":328},[318,797,798],{"class":345},"user-management",[318,800,433],{"class":328},[318,802,803],{"class":332},"]",[318,805,436],{"class":328},[318,807,808,810,812,814,817,819],{"class":320,"line":439},[318,809,442],{"class":421},[318,811,425],{"class":328},[318,813,342],{"class":328},[318,815,816],{"class":345},"Delete a user account",[318,818,433],{"class":328},[318,820,436],{"class":328},[318,822,823,825,827],{"class":320,"line":456},[318,824,459],{"class":421},[318,826,425],{"class":328},[318,828,464],{"class":328},[318,830,831,834,836,838,840,842,844],{"class":320,"line":467},[318,832,833],{"class":421},"    userId",[318,835,425],{"class":328},[318,837,333],{"class":332},[318,839,477],{"class":328},[318,841,480],{"class":409},[318,843,483],{"class":332},[318,845,436],{"class":328},[318,847,848],{"class":320,"line":505},[318,849,508],{"class":328},[318,851,852,854,856,858,860,863,865,867],{"class":320,"line":511},[318,853,514],{"class":409},[318,855,425],{"class":328},[318,857,520],{"class":519},[318,859,523],{"class":328},[318,861,862],{"class":526}," userId",[318,864,530],{"class":328},[318,866,533],{"class":519},[318,868,464],{"class":328},[318,870,871],{"class":320,"line":538},[318,872,874],{"class":873},"sHwdD","    \u002F\u002F ...\n",[318,876,877],{"class":320,"line":576},[318,878,508],{"class":328},[318,880,881,883],{"class":320,"line":643},[318,882,631],{"class":328},[318,884,573],{"class":332},[298,886,888],{"id":887},"auto-inferred-group-from-directory","Auto-Inferred Group from Directory",[303,890,891],{},"Place tools in subdirectories and the group is inferred automatically:",[307,893,898],{"className":894,"code":896,"language":897},[895],"language-text","server\u002Fmcp\u002Ftools\u002F\n├── admin\u002F\n│   ├── delete-user.ts    → group: 'admin'\n│   └── stats.ts          → group: 'admin'\n├── content\u002F\n│   └── list-pages.ts     → group: 'content'\n└── search.ts             → no group\n","text",[315,899,896],{"__ignoreMap":313},[303,901,902,903,905],{},"An explicit ",[315,904,671],{}," on the definition always takes precedence over the directory-inferred value.",[298,907,909],{"id":908},"how-clients-see-groups-and-tags","How Clients See Groups and Tags",[303,911,912,913,915,916,919],{},"Groups and tags are included in the ",[315,914,679],{}," field of ",[315,917,918],{},"tools\u002Flist"," responses:",[307,921,925],{"className":922,"code":923,"language":924,"meta":313,"style":313},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"name\": \"delete-user\",\n  \"_meta\": {\n    \"group\": \"admin\",\n    \"tags\": [\"destructive\", \"user-management\"]\n  }\n}\n","json",[315,926,927,931,954,966,986,1015,1020],{"__ignoreMap":313},[318,928,929],{"class":320,"line":321},[318,930,415],{"class":328},[318,932,933,936,939,942,944,947,950,952],{"class":320,"line":352},[318,934,935],{"class":328},"  \"",[318,937,938],{"class":519},"name",[318,940,941],{"class":328},"\"",[318,943,425],{"class":328},[318,945,946],{"class":328}," \"",[318,948,949],{"class":345},"delete-user",[318,951,941],{"class":328},[318,953,436],{"class":328},[318,955,956,958,960,962,964],{"class":320,"line":372},[318,957,935],{"class":328},[318,959,679],{"class":519},[318,961,941],{"class":328},[318,963,425],{"class":328},[318,965,464],{"class":328},[318,967,968,971,974,976,978,980,982,984],{"class":320,"line":393},[318,969,970],{"class":328},"    \"",[318,972,671],{"class":973},"sBMFI",[318,975,941],{"class":328},[318,977,425],{"class":328},[318,979,946],{"class":328},[318,981,770],{"class":345},[318,983,941],{"class":328},[318,985,436],{"class":328},[318,987,988,990,992,994,996,998,1000,1002,1004,1006,1008,1010,1012],{"class":320,"line":400},[318,989,970],{"class":328},[318,991,675],{"class":973},[318,993,941],{"class":328},[318,995,425],{"class":328},[318,997,784],{"class":328},[318,999,941],{"class":328},[318,1001,789],{"class":345},[318,1003,941],{"class":328},[318,1005,613],{"class":328},[318,1007,946],{"class":328},[318,1009,798],{"class":345},[318,1011,941],{"class":328},[318,1013,1014],{"class":328},"]\n",[318,1016,1017],{"class":320,"line":418},[318,1018,1019],{"class":328},"  }\n",[318,1021,1022],{"class":320,"line":439},[318,1023,1024],{"class":328},"}\n",[303,1026,1027],{},"MCP clients can use these values to filter, sort, or group tools in their UI.",[1029,1030,1033,1034,672,1038,1041,1042,672,1044,1046,1047,1041,1050,1053,1054,1057],"callout",{"color":1031,"icon":1032},"info","i-lucide-info","For ",[1035,1036,1037],"strong",{},"resources",[1035,1039,1040],{},"prompts",", ",[315,1043,671],{},[315,1045,675],{}," are stored on the definition objects but are not yet exposed in protocol responses (",[315,1048,1049],{},"resources\u002Flist",[315,1051,1052],{},"prompts\u002Flist","). This will be supported when ",[682,1055,687],{"href":684,"rel":1056},[686]," is adopted by the MCP SDK.",[293,1059,1061],{"id":1060},"file-organization","File Organization",[303,1063,1064,1065,1068],{},"Organize your tools in the ",[315,1066,1067],{},"server\u002Fmcp\u002Ftools\u002F"," directory. Both flat and nested layouts are supported:",[307,1070,1073],{"className":1071,"code":1072,"language":897},[895],"server\u002F\n└── mcp\u002F\n    └── tools\u002F\n        ├── echo.ts\n        ├── calculator.ts\n        ├── admin\u002F\n        │   ├── delete-user.ts\n        │   └── stats.ts\n        └── content\u002F\n            └── list-pages.ts\n",[315,1074,1072],{"__ignoreMap":313},[303,1076,1077,1078,1080],{},"Each file should export a default tool definition. Subdirectories automatically set the ",[315,1079,671],{}," for all tools within them.",[293,1082,1084],{"id":1083},"type-safety","Type Safety",[303,1086,1087],{},"The module provides full TypeScript type inference:",[307,1089,1091],{"className":309,"code":1090,"language":312,"meta":313,"style":313},"\u002F\u002F Input types are inferred from inputSchema\nhandler: async ({ message }) => {\n  \u002F\u002F message is typed as string\n}\n\n\u002F\u002F Output types are inferred from outputSchema\nconst result = {\n  structuredContent: {\n    bmi: 25.5,      \u002F\u002F number\n    category: '...', \u002F\u002F string\n  },\n}\n",[315,1092,1093,1098,1117,1122,1126,1130,1135,1148,1157,1172,1191,1195],{"__ignoreMap":313},[318,1094,1095],{"class":320,"line":321},[318,1096,1097],{"class":873},"\u002F\u002F Input types are inferred from inputSchema\n",[318,1099,1100,1103,1105,1107,1109,1111,1113,1115],{"class":320,"line":352},[318,1101,1102],{"class":973},"handler",[318,1104,425],{"class":328},[318,1106,520],{"class":519},[318,1108,523],{"class":328},[318,1110,616],{"class":526},[318,1112,530],{"class":328},[318,1114,533],{"class":519},[318,1116,464],{"class":328},[318,1118,1119],{"class":320,"line":372},[318,1120,1121],{"class":873},"  \u002F\u002F message is typed as string\n",[318,1123,1124],{"class":320,"line":393},[318,1125,1024],{"class":328},[318,1127,1128],{"class":320,"line":400},[318,1129,397],{"emptyLinePlaceholder":396},[318,1131,1132],{"class":320,"line":418},[318,1133,1134],{"class":873},"\u002F\u002F Output types are inferred from outputSchema\n",[318,1136,1137,1140,1143,1146],{"class":320,"line":439},[318,1138,1139],{"class":519},"const",[318,1141,1142],{"class":332}," result ",[318,1144,1145],{"class":328},"=",[318,1147,464],{"class":328},[318,1149,1150,1153,1155],{"class":320,"line":456},[318,1151,1152],{"class":421},"  structuredContent",[318,1154,425],{"class":328},[318,1156,464],{"class":328},[318,1158,1159,1162,1164,1167,1169],{"class":320,"line":467},[318,1160,1161],{"class":421},"    bmi",[318,1163,425],{"class":328},[318,1165,1166],{"class":609}," 25.5",[318,1168,613],{"class":328},[318,1170,1171],{"class":873},"      \u002F\u002F number\n",[318,1173,1174,1177,1179,1181,1184,1186,1188],{"class":320,"line":505},[318,1175,1176],{"class":421},"    category",[318,1178,425],{"class":328},[318,1180,342],{"class":328},[318,1182,1183],{"class":345},"...",[318,1185,433],{"class":328},[318,1187,613],{"class":328},[318,1189,1190],{"class":873}," \u002F\u002F string\n",[318,1192,1193],{"class":320,"line":511},[318,1194,508],{"class":328},[318,1196,1197],{"class":320,"line":538},[318,1198,1024],{"class":328},[293,1200,1202],{"id":1201},"conditional-registration","Conditional Registration",[303,1204,1205,1206,1209],{},"You can control whether a tool is visible to clients using the ",[315,1207,1208],{},"enabled"," guard:",[307,1211,1214],{"className":309,"code":1212,"filename":1213,"language":312,"meta":313,"style":313},"import { defineMcpTool } from '@nuxtjs\u002Fmcp-toolkit\u002Fserver'\n\nexport default defineMcpTool({\n  name: 'admin-tool',\n  description: 'Admin-only tool',\n  enabled: event => event.context.user?.role === 'admin',\n  handler: async () => {\n    \u002F\u002F ...\n  },\n})\n","server\u002Fmcp\u002Ftools\u002Fadmin-tool.ts",[315,1215,1216,1234,1238,1250,1265,1280,1321,1336,1340,1344],{"__ignoreMap":313},[318,1217,1218,1220,1222,1224,1226,1228,1230,1232],{"class":320,"line":321},[318,1219,325],{"class":324},[318,1221,329],{"class":328},[318,1223,379],{"class":332},[318,1225,336],{"class":328},[318,1227,339],{"class":324},[318,1229,342],{"class":328},[318,1231,388],{"class":345},[318,1233,349],{"class":328},[318,1235,1236],{"class":320,"line":352},[318,1237,397],{"emptyLinePlaceholder":396},[318,1239,1240,1242,1244,1246,1248],{"class":320,"line":372},[318,1241,403],{"class":324},[318,1243,406],{"class":324},[318,1245,379],{"class":409},[318,1247,412],{"class":332},[318,1249,415],{"class":328},[318,1251,1252,1254,1256,1258,1261,1263],{"class":320,"line":393},[318,1253,422],{"class":421},[318,1255,425],{"class":328},[318,1257,342],{"class":328},[318,1259,1260],{"class":345},"admin-tool",[318,1262,433],{"class":328},[318,1264,436],{"class":328},[318,1266,1267,1269,1271,1273,1276,1278],{"class":320,"line":400},[318,1268,442],{"class":421},[318,1270,425],{"class":328},[318,1272,342],{"class":328},[318,1274,1275],{"class":345},"Admin-only tool",[318,1277,433],{"class":328},[318,1279,436],{"class":328},[318,1281,1282,1285,1287,1290,1292,1294,1296,1299,1301,1304,1307,1310,1313,1315,1317,1319],{"class":320,"line":418},[318,1283,1284],{"class":409},"  enabled",[318,1286,425],{"class":328},[318,1288,1289],{"class":526}," event",[318,1291,533],{"class":519},[318,1293,1289],{"class":332},[318,1295,477],{"class":328},[318,1297,1298],{"class":332},"context",[318,1300,477],{"class":328},[318,1302,1303],{"class":332},"user",[318,1305,1306],{"class":328},"?.",[318,1308,1309],{"class":332},"role ",[318,1311,1312],{"class":328},"===",[318,1314,342],{"class":328},[318,1316,770],{"class":345},[318,1318,433],{"class":328},[318,1320,436],{"class":328},[318,1322,1323,1325,1327,1329,1332,1334],{"class":320,"line":439},[318,1324,514],{"class":409},[318,1326,425],{"class":328},[318,1328,520],{"class":519},[318,1330,1331],{"class":328}," ()",[318,1333,533],{"class":519},[318,1335,464],{"class":328},[318,1337,1338],{"class":320,"line":456},[318,1339,874],{"class":873},[318,1341,1342],{"class":320,"line":467},[318,1343,508],{"class":328},[318,1345,1346,1348],{"class":320,"line":505},[318,1347,631],{"class":328},[318,1349,573],{"class":332},[303,1351,1352,1353,1355,1356,1359,1360,1362],{},"When ",[315,1354,1208],{}," returns ",[315,1357,1358],{},"false",", the tool is hidden from ",[315,1361,918],{}," and cannot be called.",[1029,1364,1366,1367,1369],{"color":1365,"icon":13},"primary","See the ",[682,1368,244],{"href":245}," guide for detailed documentation on auth-based filtering.",[293,1371,1373,1374,500],{"id":1372},"client-allowlist-x-mcp-tools","Client allowlist (",[315,1375,1376],{},"X-MCP-Tools",[303,1378,1379,1380,1382,1383,1386,1387,1390,1391,1393],{},"Clients can subset the catalog themselves by sending ",[315,1381,1376],{}," with a comma-separated list of names. The toolkit applies this after ",[315,1384,1385],{},"enabled()"," guards and ",[315,1388,1389],{},"mcp:config:resolved",", so the header is the last word on whatever this endpoint would have served. Names must match ",[315,1392,918],{},"; unknown names return HTTP 400.",[303,1395,1396,1397,1401],{},"See ",[682,1398,1400],{"href":1399},"\u002Fgetting-started\u002Fconnection#limit-available-tools","Connect MCP clients"," for Cursor and VS Code config.",[293,1403,1405],{"id":1404},"next-steps","Next Steps",[1407,1408,1409,1415,1420,1425,1430,1435],"ul",{},[1410,1411,1412,1414],"li",{},[682,1413,71],{"href":76}," - Create resources to expose data",[1410,1416,1417,1419],{},[682,1418,100],{"href":105}," - Create reusable prompts",[1410,1421,1422,1424],{},[682,1423,123],{"href":128}," - Create custom MCP endpoints",[1410,1426,1427,1429],{},[682,1428,249],{"href":250}," - Let LLMs orchestrate tools with JavaScript",[1410,1431,1432,1434],{},[682,1433,244],{"href":245}," - Conditionally register definitions",[1410,1436,1437,1439],{},[682,1438,259],{"href":275}," - See more tool examples",[1441,1442,1443],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":313,"searchDepth":352,"depth":352,"links":1445},[1446,1449,1454,1455,1456,1457,1459],{"id":295,"depth":352,"text":296,"children":1447},[1448],{"id":300,"depth":372,"text":301},{"id":664,"depth":352,"text":665,"children":1450},[1451,1452,1453],{"id":691,"depth":372,"text":692},{"id":887,"depth":372,"text":888},{"id":908,"depth":372,"text":909},{"id":1060,"depth":352,"text":1061},{"id":1083,"depth":352,"text":1084},{"id":1201,"depth":352,"text":1202},{"id":1372,"depth":352,"text":1458},"Client allowlist (X-MCP-Tools)",{"id":1404,"depth":352,"text":1405},"group and tags, directory layout, type safety, and enabled guards for tools.","md",null,{},{"icon":69},{"title":1466,"description":1467},"Tool groups, organization & dynamic registration","Groups, tags, file layout, conditional registration, and next steps for MCP tools.","-PggF_Z1DaE1tDRT7_inJOJQNCq38HZIGNpy6Th5zlE",[1470,1472],{"title":61,"path":62,"stem":63,"description":1471,"icon":64,"children":-1},"H3 and plain errors in tool handlers, and Nitro-backed response caching.",{"title":46,"path":76,"stem":77,"description":1473,"icon":78,"children":-1},"Expose read-only data sources as MCP resources to provide context to AI models.",1787670838614]