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